4988 lines
240 KiB
C
4988 lines
240 KiB
C
/* ##C_FILE#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
FILE : CpaMmg.c
|
||
|
||
DESCRIPTION : this file contain all functions used to allocate memory :
|
||
|
||
Initialisation of the module
|
||
Initialisation of a static bloc
|
||
switch between dynamic and static mode
|
||
Allocate/ReAllocate/Free Memory
|
||
Check function for debugging
|
||
Destroy a static bloc
|
||
Destroy the module
|
||
|
||
VERSION : 5.1.0/Pierrick Crepy/Creation
|
||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
||
|
||
|
||
/* ##INCLUDE#----------------------------------------------------------------------------
|
||
Includes Files
|
||
---------------------------------------------------------------------------------------*/
|
||
#ifdef U64
|
||
#include "ultra.h"
|
||
#endif/*U64*/
|
||
|
||
#ifdef WIN32
|
||
#include <string.h>
|
||
|
||
#include <windows.h>
|
||
#endif /*WIN32*/
|
||
|
||
#if defined(U64)
|
||
#include <ultra64.h> /*for Critical Section : Msg management*/
|
||
#elif defined(PSX)
|
||
#include "PSX.h"
|
||
#else
|
||
#include <Winbase.h> /*for Critical Section*/
|
||
#endif /*U64*/
|
||
|
||
#include "ERM.h"
|
||
|
||
#define __DeclareGlobalVariableErrMmg_h__
|
||
#include "MMG/ErrMmg.h"
|
||
#undef __DeclareGlobalVariableErrMmg_h__
|
||
|
||
#define __DeclareGlobalVariableInCpaMmg_h__
|
||
#include "MMG/CpaMmg.h"
|
||
#undef __DeclareGlobalVariableInCpaMmg_h__
|
||
|
||
#include "PrivMmg.h"
|
||
#include "MMG/RastMmg.h"
|
||
|
||
#if !defined(RETAIL) && !defined(U64)
|
||
/* This boolean tells if we must fill an allocated bloc */
|
||
/* with 0s at each allocation.*/
|
||
/* It is set by SNA when making binary datas*/
|
||
#include "acp_base.h"
|
||
ACP_tdxBool MMG_g_bResetMemOnAllocation = FALSE;
|
||
#endif
|
||
|
||
#ifdef WIN32
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#include <assert.h>
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
#endif /*WIN32*/
|
||
|
||
/*ANNECY CT 21/1/98 {*/
|
||
/*XB*/
|
||
#if !defined(U64)
|
||
/*End XB*/
|
||
#define malloc(size) GlobalAlloc(GMEM_FIXED,size)
|
||
#define free(ptr) GlobalFree(ptr)
|
||
/*XB*/
|
||
#endif /* U64*/
|
||
/*End XB*/
|
||
/*ENDANNECY CT}*/
|
||
|
||
#ifdef U64
|
||
#include "RastMem.h"
|
||
#include "DesMem.h"
|
||
#endif /* U64 */
|
||
/*///////////// PSX //////////////*/
|
||
#ifdef PSX
|
||
|
||
#define malloc malloc3
|
||
#define free free3
|
||
#define realloc realloc3
|
||
/*To resolve a cast problem*/
|
||
#define memmove(a,b,c) memmove((unsigned char *)a, (unsigned char *)b, c)
|
||
|
||
/*Undefined prototypes*/
|
||
void MMG_PSX_fn_vInitLibrary();
|
||
|
||
#endif /*PSX*/
|
||
/*///////////// PSX //////////////*/
|
||
|
||
|
||
#ifndef M_CheckPointer
|
||
#define M_CheckPointer(a)
|
||
#endif /* M_CheckPointer */
|
||
|
||
|
||
/* ##FUNCDEF#----------------------------------------------------------------------------
|
||
Functions definition
|
||
---------------------------------------------------------------------------------------*/
|
||
|
||
void * fn_p_vDynAlloc (unsigned long ulSize, unsigned char ucChannel);
|
||
void fn_vDynFree (void *p_vMemBlock, unsigned char ucChannel);
|
||
void * fn_p_vDynRealloc (void *p_vMemBlock, unsigned long ulSize, unsigned char ucChannel);
|
||
void * fn_p_vStaAlloc (unsigned long ulSize, unsigned char ucChannel);
|
||
void fn_vStaFree (void *p_vMemBlock, unsigned char ucChannel);
|
||
void * fn_p_vStaRealloc (void *p_vMemBlock, unsigned long ulSize, unsigned char ucChannel);
|
||
void fn_vSortMallocInfoTable (tdstMallocInfo * p_stMyMallocInfo, unsigned long ulSizeTable);
|
||
|
||
/* ##-###########################
|
||
## General Management
|
||
############################## */
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_cCheckAlignmentValidity
|
||
DESCRIPTION : check if alignement constant are valide
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_cCheckAlignmentValidity () {
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __FATAL_ERR_MMG__
|
||
assert((sizeof(unitAlloc)== C_uwAllocSize) && ((1<<C_uwShiftAllocSize)== C_uwAllocSize));/*lint !506: Constant value Boolean*/
|
||
/*
|
||
if ((sizeof(unitAlloc)!= C_uwAllocSize)|| ((1<<C_uwShiftAllocSize)!= C_uwAllocSize) ){
|
||
Mmg_M_UpdateLastError (E_uwMmgPbDataAlignment, NULL);
|
||
}
|
||
*/
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}
|
||
|
||
/* ##-###########################
|
||
## Management of overflow key check for a block without free
|
||
############################## */
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vWriteOverflowCheckKey
|
||
DESCRIPTION : affecte the overflow key
|
||
INPUT : target pointer
|
||
=========================================================================================
|
||
CREATION : 05-03-98/Pierrick Crepy
|
||
=======================================================================================*/
|
||
#ifdef D_CheckSystemForBlockWithoutFree
|
||
void Mmg_fn_vWriteOverflowCheckKey (char * p_cTarget){
|
||
char * p_cScan;
|
||
char * p_cSource;
|
||
unsigned long ulOverflowCheckKey = C_ulOverflowCheckKey;
|
||
/* I can not affect directily all the key because for ex on R3000 & co a long must be aligned on 4 bytes*/
|
||
/* I must to affect the key byte by byte.*/
|
||
for (p_cScan = p_cTarget, p_cSource = (char*) (&ulOverflowCheckKey);
|
||
p_cScan < p_cTarget+sizeof (C_TypeOfOverflowCheckKeyForBlockWithoutFree);
|
||
p_cScan++, p_cSource++){
|
||
*p_cScan = *p_cSource;
|
||
}
|
||
}
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vTestOverflowCheckKey
|
||
DESCRIPTION : affecte the overflow key
|
||
INPUT : target pointer
|
||
=========================================================================================
|
||
CREATION : 05-03-98/Pierrick Crepy
|
||
=======================================================================================*/
|
||
char Mmg_fn_b_cIsItEqualToOverflowCheckKey (char * p_cTarget){
|
||
char * p_cScan;
|
||
char * p_cSource;
|
||
unsigned long ulOverflowCheckKey = C_ulOverflowCheckKey;
|
||
/* I can not affect directily all the key because for ex on R3000 & co a long must be aligned on 4 bytes*/
|
||
/* I must to affect the key byte by byte.*/
|
||
for (p_cScan = p_cTarget, p_cSource = (char*) (&ulOverflowCheckKey);
|
||
p_cScan < p_cTarget+sizeof (C_TypeOfOverflowCheckKeyForBlockWithoutFree);
|
||
p_cScan++, p_cSource++){
|
||
if (*p_cScan != *p_cSource) break;
|
||
}
|
||
return ((char) (p_cScan == p_cTarget+sizeof (C_TypeOfOverflowCheckKeyForBlockWithoutFree)));
|
||
}
|
||
|
||
#endif D_CheckSystemForBlockWithoutFree
|
||
/* ##-###########################
|
||
## Management of blocks
|
||
############################## */
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vInitSpecificBlock
|
||
DESCRIPTION : Make the real allocation and init variables for block managing
|
||
INPUT : Block Id
|
||
Module Id
|
||
Block Structure
|
||
Size of the block
|
||
Max number of allocation in the block (only used for debugging)
|
||
Alignement : C_NoAlignement or the number of bytes
|
||
Mode : combination of C_BlockWithFreeFlag, C_BlockWithoutFreeFlag,
|
||
C_FillTheBlockWithCleanKeyFlag, C_Check_AlignementFlag, C_Check_OverflowFlag
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
Modificatio: 02-03-98 Pierrick Crepy MMG V6.1.0
|
||
=======================================================================================*/
|
||
void Mmg_fn_vInitSpecificBlock (unsigned char _ucBlockId, unsigned char _ucModuleId,
|
||
struct tdstBlockInfoPriv_ *_p_stMyBlocksInfo, unsigned long _ulSize, unsigned long _ulMaxNbStaticMalloc,
|
||
unsigned char _ucAlignment, unsigned char _ucMode){
|
||
|
||
char * p_cBegin;
|
||
unsigned long ulI;
|
||
unitAlloc * p_uaPtr;
|
||
struct tdstBlockInfoPriv_ *p_stMyBlockInfo = _p_stMyBlocksInfo+_ucBlockId;
|
||
unsigned char ucAlignment;
|
||
#ifdef __FATAL_ERR_MMG__
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
#else
|
||
char * szErrTxt = NULL;
|
||
#endif /*__ERROR_STRINGS__*/
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
|
||
if (!(_ucMode & C_BlockWithoutFreeFlag)){ /* C_BlockWithFreeFlag*/
|
||
ucAlignment = C_uwAllocSize;
|
||
}/* mode = C_BlockWithFreeFlag*/
|
||
else { /*mode = C_BlockWithoutFreeFlag*/
|
||
#ifdef U64
|
||
M_PrintfN64(("initBlock align = %d\n", _ucAlignment));
|
||
#endif
|
||
ucAlignment = _ucAlignment;
|
||
#ifdef D_CheckSystemForBlockWithoutFree
|
||
Mmg_M_BigBoundSize (_ulSize, ucAlignment);
|
||
_ulSize+=sizeof(tdstInformationHeaderOfBolckWithoutFree);
|
||
#endif /*D_CheckSystemForBlockWithoutFree*/
|
||
}
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (p_stMyBlockInfo == NULL){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "You have called 'Mmg_fn_vInitBlock' function\nfor the block #%d in [", _ucBlockId);
|
||
Erm_M_GetModuleInformation(szErrTxt+strlen(szErrTxt), _ucModuleId);
|
||
sprintf (szErrTxt+strlen(szErrTxt), "].\nAre you sure to have well call 'Mmg_M_InitMmg' for it ?\n");
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlock, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlock, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
if (p_stMyBlockInfo->p_cBeginBlock != C_p_cBlockNotValidKey){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "You have called 'Mmg_fn_vInitBlock' function\nfor the block #%d in [", _ucBlockId);
|
||
Erm_M_GetModuleInformation(szErrTxt+strlen(szErrTxt), _ucModuleId);
|
||
sprintf (szErrTxt+strlen(szErrTxt), "].\nBut the 'p_cBeginBlock' field is equal to 0X%X (and not 0X%X like expected)\n",
|
||
p_stMyBlockInfo->p_cBeginBlock, C_p_cBlockNotValidKey);
|
||
sprintf (szErrTxt+strlen(szErrTxt), "Do you try to initialized again a block for the second time ?!\n");
|
||
#endif /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlock, szErrTxt);
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
p_stMyBlockInfo->ulMaxNbStaticMalloc = _ulMaxNbStaticMalloc;
|
||
p_stMyBlockInfo->d_stMallocInfo = (tdstMallocInfo *) malloc (sizeof (tdstMallocInfo)*_ulMaxNbStaticMalloc);
|
||
if (p_stMyBlockInfo->d_stMallocInfo == NULL){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "The d_stMallocInfo of the BlockInfo for the block #%d of the module #%d [", _ucBlockId, _ucModuleId);
|
||
Erm_M_GetModuleInformation(szErrTxt+strlen(szErrTxt), _ucModuleId);
|
||
sprintf (szErrTxt+strlen(szErrTxt), "] is not allocated");
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInInitBlock, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInInitBlock, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
|
||
Mmg_M_BigBoundSize (_ulSize, ucAlignment);
|
||
|
||
|
||
#ifdef __ADD_PLACE_FOR_DEBUG_INFORMATION__
|
||
if (!(_ucMode & C_BlockWithFreeFlag)){/*C_BlockWithFreeFlag*/
|
||
ulI = (_ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize));
|
||
Mmg_M_BigBoundSize(ulI, C_uwAllocSize);
|
||
_ulSize += ulI;
|
||
}/* mode = C_BlockWithFreeFlag*/
|
||
#endif /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
|
||
|
||
/* allocation of the block*/
|
||
/*-------------------------*/
|
||
p_cBegin = (char *)malloc (_ulSize);
|
||
/*p_cBegin = (char *)VirtualAlloc (s_p_vRegionNumber, _ulSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);*/
|
||
|
||
#ifdef __FATAL_ERR_MMG__
|
||
ulI = (unsigned long) p_cBegin;
|
||
|
||
/* test of allocation the begining of the block must be a muliple of ucAlignment */
|
||
Mmg_M_BigBoundSize (ulI, ucAlignment);
|
||
|
||
if (p_cBegin != (char *) ulI){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "Because 0X%X it's not multiple of %d", p_cBegin, ucAlignment);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
/* Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbAlignmentBlock, szErrTxt, ucChannel);*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(_ucModuleId, _ucBlockId, E_uwMmgPbAlignmentBlock, szErrTxt);
|
||
#else
|
||
Mmg_M_UpdateLastError (E_uwMmgPbAlignmentBlock, szErrTxt);
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
if (p_cBegin == NULL){
|
||
/* Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbAllocateBlock, NULL, ucChannel);*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(_ucModuleId, _ucBlockId, E_uwMmgPbAllocateBlock, NULL);
|
||
#else
|
||
Mmg_M_UpdateLastError (E_uwMmgPbAllocateBlock, NULL);
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
}
|
||
else{/* the malloc is a sucess*/
|
||
#endif /* __WARNING3_ERR_MMG__*/
|
||
|
||
/* record block infomations*/
|
||
p_stMyBlockInfo->p_cBeginBlock = p_cBegin;
|
||
/*osSyncPrintf("p_stMyBlockInfo->p_cEndBlock : %x ; p_stMyBlockInfo->p_cBeginBlock : %x \n", p_stMyBlockInfo->p_cEndBlock, p_stMyBlockInfo->p_cBeginBlock);*/
|
||
/*osSyncPrintf("_ulSize : %d\n", _ulSize);*/
|
||
p_stMyBlockInfo->p_cEndBlock = p_cBegin + _ulSize - 1;/*lint !e613 : Possible use of null pointer*/
|
||
if (!(_ucMode & C_BlockWithoutFreeFlag)){/*C_BlockWithFreeFlag*/
|
||
p_stMyBlockInfo->p_cFirstFree = p_cBegin;
|
||
p_stMyBlockInfo->p_cMaxMem = p_cBegin;
|
||
|
||
|
||
/* init the free list Information in the block.*/
|
||
/*----------------------------------------------*/
|
||
p_uaPtr = (unitAlloc *) p_cBegin ;
|
||
*p_uaPtr = (unitAlloc) (_ulSize >> C_uwShiftAllocSize ); /*lint !e613 : Possible use of null pointer */ /* size of the free = size of the block*/
|
||
*(p_uaPtr+1) = (unitAlloc) 0;/*lint !e613 : Possible use of null pointer*/ /* there is no sucessor in the free list.*/
|
||
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulCountMallocBeforeMaxMem = 0;
|
||
p_stMyBlockInfo->ulCountFreeBeforeMaxMem = 0;
|
||
p_stMyBlockInfo->ulNbMalloc = 0;
|
||
p_stMyBlockInfo->ulNbTotalMalloc = 0;
|
||
p_stMyBlockInfo->uwNbFree = 0;
|
||
p_stMyBlockInfo->ulNbTotalFree = 0;
|
||
p_stMyBlockInfo->ulNbTotalRealloc = 0;
|
||
|
||
/* initialisation of the block with the value 0xAA. */
|
||
/*-------------------------------------------------*/
|
||
/*Remark the bytes of Header of the free are not affected because there are yet well set with free Information*/
|
||
for (p_uaPtr = ((unitAlloc*) (p_cBegin)) +C_ucFreeHeaderSize , _ulSize -= (ucAlignment<<1); _ulSize > 0; _ulSize= _ulSize - ucAlignment,p_uaPtr++)/*lint !e613*/{
|
||
*p_uaPtr = C_uaCleanKey;
|
||
}
|
||
#else
|
||
if (_ucMode & C_FillTheBlockWithCleanKeyFlag){
|
||
for (p_uaPtr = ((unitAlloc*) (p_cBegin)) +C_ucFreeHeaderSize , _ulSize -= (ucAlignment<<1); _ulSize > 0; _ulSize= _ulSize - ucAlignment,p_uaPtr++)/*lint !e613*/{
|
||
*p_uaPtr = C_uaCleanKey;
|
||
}
|
||
}
|
||
|
||
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}/*C_BlockWithFreeFlag*/
|
||
|
||
else{/*C_BlockWithoutFreeFlag*/
|
||
#ifdef D_CheckSystemForBlockWithoutFree
|
||
/*YB 21 avril 1998 {*/
|
||
unsigned long lTemporaryValue;
|
||
/*locale variable for after*/
|
||
tdstInformationHeaderOfBolckWithoutFree *p_stInfoBlockHeader;
|
||
p_stMyBlockInfo->p_cMaxMem = p_cBegin+sizeof(tdstInformationHeaderOfBolckWithoutFree);
|
||
lTemporaryValue = (unsigned long)p_stMyBlockInfo->p_cMaxMem;
|
||
Mmg_M_BigBoundSize (lTemporaryValue, ucAlignment);
|
||
p_stMyBlockInfo->p_cMaxMem = (char*)lTemporaryValue;
|
||
/*YB 21 avril 1998 }*/
|
||
|
||
p_stMyBlockInfo->p_cMaxMem-=1;
|
||
#else D_CheckSystemForBlockWithoutFree
|
||
p_stMyBlockInfo->p_cMaxMem = p_cBegin-1;
|
||
#endif /*D_CheckSystemForBlockWithoutFree*/
|
||
|
||
p_stMyBlockInfo->p_cFirstFree = C_FirstFreeValueForBlockWithoutFree;
|
||
|
||
if (_ucMode & C_FillTheBlockWithCleanKeyFlag){
|
||
for (p_cBegin = p_stMyBlockInfo->p_cMaxMem+1; p_cBegin <= p_stMyBlockInfo->p_cEndBlock; p_cBegin++){
|
||
*p_cBegin = (char)C_uaCleanKeyForBlockWithoutFree;
|
||
}
|
||
}
|
||
|
||
#ifdef D_CheckSystemForBlockWithoutFree
|
||
p_stInfoBlockHeader = (tdstInformationHeaderOfBolckWithoutFree*) p_stMyBlockInfo->p_cBeginBlock;
|
||
|
||
|
||
ulI = sizeof(tdstInformationHeaderOfBolckWithoutFree);
|
||
Mmg_M_BigBoundSize (ulI, ucAlignment);
|
||
p_stInfoBlockHeader->ucBoundededHeaderSize = (unsigned char) ulI;
|
||
|
||
p_stInfoBlockHeader->ucAlignment = ucAlignment;
|
||
p_stInfoBlockHeader->ucMode = _ucMode;
|
||
|
||
/*put the OverflowCheckKey*/
|
||
if ((p_stMyBlockInfo->p_cEndBlock - p_stMyBlockInfo->p_cMaxMem)>= sizeof (C_TypeOfOverflowCheckKeyForBlockWithoutFree)){/*there is enought space to store the OverflowCheckKey*/
|
||
Mmg_fn_vWriteOverflowCheckKey(p_stMyBlockInfo->p_cMaxMem+1);
|
||
}
|
||
|
||
#endif /*D_CheckSystemForBlockWithoutFree*/
|
||
}/*C_BlockWithoutFreeFlag*/
|
||
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
}
|
||
#endif /* __WARNING3_ERR_MMG__*/
|
||
|
||
}/*Mmg_fn_vInitSpecificBlock */
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vFreeBlock
|
||
DESCRIPTION : Re-init bloc variables to free all allocation in the block
|
||
INPUT : Block Id
|
||
Module Id
|
||
Block Structure
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_vFreeBlock (unsigned char ucBlockId, unsigned char ucModuleId, struct tdstBlockInfoPriv_ *p_stMyBlocksInfo){
|
||
char * p_cBegin;
|
||
unitAlloc * p_uaPtr;
|
||
struct tdstBlockInfoPriv_ *p_stMyBlockInfo = p_stMyBlocksInfo+ucBlockId;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
unsigned long ulSize;
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
p_cBegin = p_stMyBlockInfo->p_cBeginBlock;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (p_cBegin == C_p_cBlockNotValidKey){
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
sprintf (szErrTxt, "You have called 'Mmg_fn_vFreeBlock' function\nfor the block #%d in [", ucBlockId);
|
||
Erm_M_GetModuleInformation(szErrTxt+strlen(szErrTxt), ucModuleId);
|
||
sprintf (szErrTxt+strlen(szErrTxt), "].\nAre you sure to have well call 'Mmg_fn_vInitblock' for it ?\n");
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlock, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlock, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
if (p_stMyBlockInfo->p_cFirstFree != C_FirstFreeValueForBlockWithoutFree){/*BlockWithFree*/
|
||
/* init the free list Information in the block.*/
|
||
/*----------------------------------------------*/
|
||
p_uaPtr = (unitAlloc *) p_cBegin ;
|
||
*p_uaPtr = (unitAlloc) (((unitAlloc)(p_stMyBlockInfo->p_cEndBlock - p_cBegin + 1))>> C_uwShiftAllocSize ); /* size of the free = size of the block*/
|
||
p_uaPtr ++;
|
||
*p_uaPtr = (unitAlloc) 0;/* there is no sucessor in the free list.*/
|
||
|
||
/* record block infomations*/
|
||
/*--------------------------*/
|
||
p_stMyBlockInfo->p_cFirstFree = p_cBegin;
|
||
p_stMyBlockInfo->p_cMaxMem = p_cBegin-1;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulNbMalloc = 0;
|
||
p_stMyBlockInfo->ulNbTotalMalloc = 0;
|
||
p_stMyBlockInfo->uwNbFree = 0;/*added in the MMG V5.0.5*/
|
||
p_stMyBlockInfo->ulNbTotalFree = 0;
|
||
p_stMyBlockInfo->ulNbTotalRealloc = 0; /*added in the MMG V5.0.5*/
|
||
|
||
/*Remark the first 2 group of C_uwAllocSize bytes (the size of the free & the adresse of the next free) are not affected because there are yet well set with free Information*/
|
||
/* !! not already tested*/
|
||
ulSize = (unsigned long) ((p_stMyBlockInfo->p_cEndBlock - p_cBegin +1) -(2<<C_uwShiftAllocSize));
|
||
for (p_uaPtr = ((unitAlloc*) (p_cBegin)) +2; ulSize > 0; ulSize= ulSize - C_uwAllocSize,p_uaPtr++){
|
||
*p_uaPtr = C_uaCleanKey;
|
||
}
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}/*BlockWithFree*/
|
||
else/* BlockWithoutFree*/
|
||
{
|
||
#ifdef D_CheckSystemForBlockWithoutFree
|
||
tdstInformationHeaderOfBolckWithoutFree *p_stInfoBlockHeader;
|
||
|
||
p_stInfoBlockHeader = (tdstInformationHeaderOfBolckWithoutFree*) p_cBegin;
|
||
p_stMyBlockInfo->p_cMaxMem = p_cBegin + p_stInfoBlockHeader->ucBoundededHeaderSize-1;
|
||
|
||
if (p_stInfoBlockHeader->ucMode & C_FillTheBlockWithCleanKeyFlag){
|
||
for (p_cBegin = p_stMyBlockInfo->p_cMaxMem+1; p_cBegin <= p_stMyBlockInfo->p_cEndBlock; p_cBegin++){
|
||
*p_cBegin = (char) C_uaCleanKeyForBlockWithoutFree;
|
||
}
|
||
}
|
||
/*put the OverflowCheckKey*/
|
||
if ((p_stInfoBlockHeader->ucMode & C_Check_OverflowFlag) &&
|
||
(p_stMyBlockInfo->p_cEndBlock - p_stMyBlockInfo->p_cMaxMem)>= sizeof (C_TypeOfOverflowCheckKeyForBlockWithoutFree)){/*there is enought space to store the OverflowCheckKey*/
|
||
Mmg_fn_vWriteOverflowCheckKey(p_stMyBlockInfo->p_cMaxMem+1);
|
||
}
|
||
|
||
|
||
#else /*D_CheckSystemForBlockWithoutFree*/
|
||
p_stMyBlockInfo->p_cMaxMem = p_cBegin-1;
|
||
#endif /*D_CheckSystemForBlockWithoutFree*/
|
||
}
|
||
|
||
}/*Mmg_fn_vFreeBlock*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vDeleteBlock
|
||
DESCRIPTION : Free Memory and invalidate the block
|
||
INPUT : Block Id
|
||
Module Id
|
||
Block Structure
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_vDeleteBlock (unsigned char ucBlockId, unsigned char ucModuleId, struct tdstBlockInfoPriv_ *p_stMyBlocksInfo){
|
||
struct tdstBlockInfoPriv_ *p_stMyBlockInfo = p_stMyBlocksInfo+ucBlockId;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (p_stMyBlockInfo->p_cBeginBlock == C_p_cBlockNotValidKey){
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
sprintf (szErrTxt, "You have called 'Mmg_fn_vDeleteBlock' function\nfor the block #%d in [", ucBlockId);
|
||
Erm_M_GetModuleInformation(szErrTxt+strlen(szErrTxt), ucModuleId);
|
||
sprintf (szErrTxt+strlen(szErrTxt), "].\nAre you sure to have well call 'Mmg_fn_vInitblock' for it ?\n");
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlock, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlock, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
|
||
free (p_stMyBlockInfo->p_cBeginBlock);
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
free (p_stMyBlockInfo->d_stMallocInfo);
|
||
p_stMyBlockInfo->d_stMallocInfo = NULL;
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
|
||
p_stMyBlockInfo->p_cBeginBlock = C_p_cBlockNotValidKey;
|
||
|
||
}/*Mmg_fn_vDeleteBlock*/
|
||
|
||
/* ##-###########################
|
||
## DYNAMIC MODE
|
||
## kernel of allocation, reallocation & free
|
||
############################## */
|
||
#ifdef __DYNAMIC_MALLOC_ALLOWED__ /*General*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : fn_p_vDynAlloc
|
||
DESCRIPTION : Allocate a zone (with alignement) on a specif channel
|
||
Just using malloc function
|
||
INPUT : Size to allocate
|
||
Channel Id
|
||
OUTPUT : Pointer on the allocated zone
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void * fn_p_vDynAlloc (unsigned long ulSize, unsigned char ucChannel){
|
||
#ifdef __DYNAMIC_MALLOC_ALLOWED__
|
||
unitAlloc *p_uaMalloc;
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
unitAlloc *p_uaPtr;
|
||
tdstMallocInfo *p_stMyMallocInfo;
|
||
tdstDynInfo *p_stMyDynInfo = (tdstDynInfo *) g_d_stCurrentModeInfo[ucChannel].p_vTdstBlockInfoOrTdstDynInfo;
|
||
#endif/* __DEBUG_MALLOC_MODE__*/
|
||
|
||
#if (defined(__FATAL_ERR_MMG__)||defined (__DEBUG_MALLOC_MODE__)) && (defined(__ERROR_STRINGS__))
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
#endif /*(defined(__FATAL_ERR_MMG__)||defined (__DEBUG_MALLOC_MODE__)) && (defined(__ERROR_STRINGS__))*/
|
||
|
||
unsigned long ulMalloc;
|
||
|
||
#if defined(U64)
|
||
M_PrintfStopErrorN64(("Dynamic Allocation not allowed\n"));
|
||
#endif /* U64 */
|
||
#ifdef _DEBUG
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (g_ucBLockedAllocation == C_ucTrue){
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo(E_uwMmgPbAccessMemoryDenied, "Dynamic Allocation : -> denied <-", ucChannel);
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
#endif _DEBUG
|
||
|
||
if (ulSize == 0){
|
||
/*#ifdef __WARNING3_ERR_MMG__
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbSizeOfAllocIs0, NULL, ucChannel);
|
||
#endif
|
||
Mmg_MLeaveCriticalSection();*/
|
||
return NULL;
|
||
}
|
||
|
||
Mmg_MEnterCriticalSection();
|
||
|
||
Mmg_M_BigBoundSize (ulSize, C_uwAllocSize);
|
||
ulSize >>= C_uwShiftAllocSize;
|
||
ulSize += (C_ucMallocHeaderSize + C_ucMallocFooterSize); /* place for information(s) to manage the allocation place*/
|
||
|
||
/* allocation of the Malloc*/
|
||
/*-------------------------*/
|
||
p_uaMalloc = (unitAlloc *) malloc (ulSize<<C_uwShiftAllocSize);
|
||
/*p_uaMalloc = (unitAlloc *)VirtualAlloc (s_p_vRegionNumber, ulSize<<C_uwShiftAllocSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);*/
|
||
ulMalloc = (unsigned long) p_uaMalloc;
|
||
|
||
/* test of allocation the begining of the block must be a muliple of C_uwAllocSize */
|
||
Mmg_M_BigBoundSize (ulMalloc, C_uwAllocSize);
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (p_uaMalloc != (unitAlloc *) ulMalloc){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "Because 0X%X it's not multiple of %d", p_uaMalloc, C_uwAllocSize);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbDynAllacationAlignment, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbDynAllacationAlignment, NULL, ucChannel);
|
||
#endif/*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
|
||
if (p_uaMalloc == NULL){
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbDynAllacateMemory, NULL, ucChannel);
|
||
#endif /*__WARNING3_ERR_MMG__*/
|
||
Mmg_MLeaveCriticalSection();
|
||
return (NULL);
|
||
}
|
||
|
||
/* store malloc Information*/
|
||
/*--------------------------*/
|
||
*p_uaMalloc = (unitAlloc)ulSize;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
*(p_uaMalloc + 1) = C_uaBeginKey;
|
||
*(p_uaMalloc + ulSize -1) = C_uaEndKey;
|
||
p_stMyMallocInfo = p_stMyDynInfo->d_stDynamicMallocInfo + (p_stMyDynInfo->ulNbDynamicMalloc++);
|
||
if (p_stMyDynInfo->ulNbDynamicMalloc > p_stMyDynInfo->ulMaxNbDynamicMalloc) {
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf(szErrTxt, "ulNbDynamicMalloc(%d) > ulMaxNbDynamicMalloc (%d)\n", p_stMyDynInfo->ulNbDynamicMalloc, p_stMyDynInfo->ulMaxNbDynamicMalloc);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbTooManyAllacation, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbTooManyAllacation, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
p_stMyDynInfo->ulNbTotalDynamicMalloc++;
|
||
p_stMyMallocInfo->p_cBeginMalloc = (char *) (p_uaMalloc + C_ucMallocHeaderSize);
|
||
p_stMyMallocInfo->p_cEndMalloc = ((char *) (p_uaMalloc + ulSize - C_ucMallocFooterSize)) - 1;
|
||
|
||
/* initialisation of the malloc with the value 0xAA. */
|
||
/*-------------------------------------------------*/
|
||
/*Remark the bytes of Header of the free are not affected because there are yet well set with free Information*/
|
||
ulSize-= C_ucMallocHeaderSize + C_ucMallocFooterSize;
|
||
for (p_uaPtr = p_uaMalloc + C_ucMallocHeaderSize; ulSize > 0; ulSize--,p_uaPtr++){
|
||
*p_uaPtr = C_uaCleanKey;
|
||
}
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
|
||
/* return the Alloc adresse*/
|
||
/*--------------------------*/
|
||
Mmg_MLeaveCriticalSection();
|
||
return ( (void *) (p_uaMalloc + C_ucMallocHeaderSize) );
|
||
#endif /*__DYNAMIC_MALLOC_ALLOWED__*/
|
||
}/*fn_p_cDynAlloc */
|
||
/* ================*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : fn_vDynFree
|
||
DESCRIPTION : Free a zone allocated witn dynamic allocation on a specific channel
|
||
Just using free function
|
||
INPUT : Pointer on an allocated zone
|
||
Channel Id
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void fn_vDynFree (void *p_vMemBlock, unsigned char ucChannel){
|
||
#ifdef __DYNAMIC_MALLOC_ALLOWED__
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
tdstMallocInfo *p_stMallocInfo;
|
||
unsigned char b_ucFound = C_ucFalse;
|
||
tdstDynInfo *p_stMyDynInfo = (tdstDynInfo *) g_d_stCurrentModeInfo[ucChannel].p_vTdstBlockInfoOrTdstDynInfo;
|
||
#endif /*__DEBUG_MALLOC_MODE__ */
|
||
|
||
#if defined(U64)
|
||
M_PrintfStopErrorN64(("Dynamic DeAllocation not allowed\n"));
|
||
#endif /* U64 */
|
||
#ifdef _DEBUG
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (g_ucBLockedAllocation == C_ucTrue){
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbAccessMemoryDenied, "Dynamic Free : -> denied <-", ucChannel);
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
#endif /*_DEBUG*/
|
||
|
||
Mmg_MEnterCriticalSection();
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
if (p_vMemBlock==NULL){
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbFreeofNULL, NULL, ucChannel);
|
||
}
|
||
else
|
||
#endif /*__WARNING3_ERR_MMG__*/
|
||
{/* of the else : p_vMemBlock!=NULL*/
|
||
|
||
/* verification of the validity of the request*/
|
||
/*---------------------------------------------*/
|
||
|
||
/* find the good malloc */
|
||
p_stMallocInfo = p_stMyDynInfo->d_stDynamicMallocInfo;
|
||
while ((p_stMallocInfo < (p_stMyDynInfo->d_stDynamicMallocInfo) + p_stMyDynInfo->ulNbDynamicMalloc) && !b_ucFound){
|
||
if (p_stMallocInfo->p_cBeginMalloc == (char *)p_vMemBlock) b_ucFound=C_ucTrue;
|
||
else p_stMallocInfo ++;
|
||
}
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
if (!b_ucFound){
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
sprintf(szErrTxt,"With fn_vDynFree(0X%X)\n", p_vMemBlock);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbDynAddressNotValid, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbDynAddressNotValid, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
else
|
||
#endif /*__WARNING3_ERR_MMG__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__ */
|
||
{/* of the else: b_ucFound is set*/
|
||
/* ==> optimized Free<==*/
|
||
|
||
/* Free the space*/
|
||
/*----------------- */
|
||
free (((unitAlloc *)p_vMemBlock) - C_ucMallocHeaderSize);
|
||
/* if (!VirtualFree (((unitAlloc *)p_vMemBlock) - C_ucMallocHeaderSize, 0, MEM_RELEASE)){
|
||
#ifdef __WARNING2_ERR_MMG__
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbDynamicFree, NULL, ucChannel);
|
||
#else
|
||
;
|
||
#endif __WARNING2_ERR_MMG__
|
||
}
|
||
*/
|
||
|
||
/* ==> End of the optimized free<==*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
(p_stMyDynInfo->ulNbTotalDynamicFree)++;
|
||
/* move up all the mallocs remainded*/
|
||
/*-----------------------------------*/
|
||
for (p_stMallocInfo ++;
|
||
(p_stMallocInfo < (p_stMyDynInfo->d_stDynamicMallocInfo) + p_stMyDynInfo->ulNbDynamicMalloc);
|
||
p_stMallocInfo ++){
|
||
*(p_stMallocInfo-1) = *p_stMallocInfo;
|
||
}
|
||
(p_stMyDynInfo->ulNbDynamicMalloc)--;
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
}/* of the else: b_ucFound is set*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
}/* of the else : p_vMemBlock!=NULL*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
Mmg_MLeaveCriticalSection();
|
||
#endif /*__DYNAMIC_MALLOC_ALLOWED__*/
|
||
}/*fn_vDynFree */
|
||
/* ===========*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : fn_p_vDynRealloc
|
||
DESCRIPTION : Reallcated a zone allocated witn dynamic allocation on a specific channel
|
||
Just using realloc function
|
||
INPUT : Pointer on an allocated zone
|
||
New Size
|
||
Channel Id
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void * fn_p_vDynRealloc (void *p_vMemBlock, unsigned long ulSize, unsigned char ucChannel){
|
||
#ifdef __DYNAMIC_MALLOC_ALLOWED__
|
||
unitAlloc *p_uaTmp, *p_uaSizeMalloc;
|
||
long lDiffSize;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
tdstMallocInfo * p_stMyMallocInfo;
|
||
tdstMallocInfo *p_stMallocInfo;
|
||
unsigned char b_ucFound = C_ucFalse;
|
||
tdstDynInfo *p_stMyDynInfo = (tdstDynInfo *) g_d_stCurrentModeInfo[ucChannel].p_vTdstBlockInfoOrTdstDynInfo;
|
||
#endif /*__DEBUG_MALLOC_MODE__ */
|
||
|
||
#ifdef _DEBUG
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (g_ucBLockedAllocation == C_ucTrue){
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbAccessMemoryDenied, "Dynamic Reallocation : -> denied <-", ucChannel);
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
#endif /*_DEBUG*/
|
||
|
||
Mmg_MEnterCriticalSection();
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* verification of the validity of the request*/
|
||
/*---------------------------------------------*/
|
||
|
||
/* find the good malloc */
|
||
p_stMallocInfo = p_stMyDynInfo->d_stDynamicMallocInfo;
|
||
while ((p_stMallocInfo < (p_stMyDynInfo->d_stDynamicMallocInfo) + (p_stMyDynInfo->ulNbDynamicMalloc)) && !b_ucFound){
|
||
if (p_stMallocInfo->p_cBeginMalloc == (char *)p_vMemBlock) b_ucFound=C_ucTrue;
|
||
else p_stMallocInfo ++;
|
||
}
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
if (!b_ucFound){
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
sprintf(szErrTxt,"With fn_p_vDynRealloc(0X%X)\n", p_vMemBlock);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbDynAddressNotValid, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbDynAddressNotValid, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
else
|
||
#endif /*__WARNING3_ERR_MMG__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__ */
|
||
{ /* of the else: b_ucFound is set*/
|
||
if (ulSize == 0){
|
||
/*it is a free command */
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
(p_stMyDynInfo->ulNbTotalDynamicFree)--;/* this is not a real free requested, then we don't have to increase the counter.*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
fn_vDynFree (p_vMemBlock, ucChannel);
|
||
Mmg_MLeaveCriticalSection();
|
||
return ((void * )0);
|
||
}
|
||
|
||
/* here ulsize != 0*/
|
||
Mmg_M_BigBoundSize (ulSize, C_uwAllocSize);
|
||
ulSize >>= C_uwShiftAllocSize;
|
||
ulSize += (C_ucMallocHeaderSize + C_ucMallocFooterSize); /* place for information(s) to manage the allocation place*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMallocInfo = p_stMyDynInfo->d_stDynamicMallocInfo;
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
p_uaSizeMalloc = ((unitAlloc *) p_vMemBlock) - C_ucMallocHeaderSize; /* pointer of the real begining (before the header) of the malloc place*/
|
||
lDiffSize = (long)(*p_uaSizeMalloc - ulSize);
|
||
|
||
if (lDiffSize == 0){
|
||
/* we do not change the size*/
|
||
/* ---------- */
|
||
Mmg_MLeaveCriticalSection();
|
||
return (p_vMemBlock);
|
||
}
|
||
else if (lDiffSize >0){
|
||
/* we want to reduce the size*/
|
||
/* ------*/
|
||
|
||
ulSize -= (C_ucMallocHeaderSize + C_ucMallocFooterSize); /* place for information(s) to manage the allocation place*/
|
||
ulSize <<= C_uwShiftAllocSize;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
(p_stMyDynInfo->ulNbTotalDynamicMalloc)--;/* this is not a real malloc requested, then we don't have to increase the counter.*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
p_uaTmp = (unitAlloc *) fn_p_vDynAlloc ((ulSize -(C_ucMallocHeaderSize + C_ucMallocFooterSize))<<C_uwShiftAllocSize, ucChannel);
|
||
|
||
|
||
memcpy ((void *) p_uaTmp, p_vMemBlock, ((unsigned long)((*p_uaSizeMalloc - (unsigned long)lDiffSize - C_ucMallocFooterSize - C_ucMallocHeaderSize)))<< C_uwShiftAllocSize);
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
(p_stMyDynInfo->ulNbTotalDynamicFree)--;/* this is not a real free requested, then we don't have to increase the counter.*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
fn_vDynFree (p_vMemBlock, ucChannel);
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* store malloc Information*/
|
||
/*--------------------------*/
|
||
p_uaSizeMalloc = p_uaTmp - C_ucMallocHeaderSize;
|
||
p_stMyMallocInfo = p_stMyDynInfo->d_stDynamicMallocInfo + p_stMyDynInfo->ulNbDynamicMalloc-1;
|
||
(p_stMyDynInfo->ulNbTotalDynamicMalloc)++;
|
||
p_stMyMallocInfo->p_cBeginMalloc = (char *) p_uaTmp;
|
||
p_stMyMallocInfo->p_cEndMalloc = ((char *) (p_uaSizeMalloc + ulSize - C_ucMallocFooterSize)) - 1;
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
Mmg_MLeaveCriticalSection();
|
||
return ((void *) p_uaTmp);
|
||
}/* we reduce*/
|
||
else {
|
||
/* we want to increase*/
|
||
/* --------*/
|
||
lDiffSize = -lDiffSize;/* in order to have a posive value meaning the increasing requested*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
(p_stMyDynInfo->ulNbTotalDynamicMalloc)--;/* this is not a real malloc requested, then we don't have to increase the counter.*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
p_uaTmp = (unitAlloc *) fn_p_vDynAlloc ((ulSize -(C_ucMallocHeaderSize + C_ucMallocFooterSize))<<C_uwShiftAllocSize, ucChannel);
|
||
|
||
memcpy ((void *) p_uaTmp, p_vMemBlock, (*p_uaSizeMalloc - C_ucMallocFooterSize - C_ucMallocHeaderSize)<< C_uwShiftAllocSize);
|
||
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
(p_stMyDynInfo->ulNbTotalDynamicFree)--;/* this is not a real free requested, then we don't have to increase the counter.*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
fn_vDynFree (p_vMemBlock, ucChannel);
|
||
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* store malloc Information*/
|
||
/*-------------------------- */
|
||
p_uaSizeMalloc = p_uaTmp - C_ucMallocHeaderSize;
|
||
p_stMyMallocInfo = (p_stMyDynInfo->d_stDynamicMallocInfo) + (p_stMyDynInfo->ulNbDynamicMalloc)-1;
|
||
(p_stMyDynInfo->ulNbTotalDynamicRealloc)++;
|
||
p_stMyMallocInfo->p_cBeginMalloc = (char *) p_uaTmp;
|
||
p_stMyMallocInfo->p_cEndMalloc = ((char *) (p_uaSizeMalloc + ulSize - C_ucMallocFooterSize)) - 1;
|
||
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
Mmg_MLeaveCriticalSection();
|
||
return ((void *) p_uaTmp);
|
||
}/* we increase */
|
||
}/* of the else: b_ucFound is set*/
|
||
#endif /*__DYNAMIC_MALLOC_ALLOWED__*/
|
||
}/*fn_p_vDynRealloc */
|
||
/* ================*/
|
||
|
||
#endif /*__DYNAMIC_MALLOC_ALLOWED__*/
|
||
/* ##-###########################
|
||
## STATIC MODE
|
||
## kernel of allocation, reallocation & free
|
||
############################## */
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : fn_p_vStaAlloc
|
||
DESCRIPTION : Allocate a memory zone in the block specified in the channel
|
||
Get the first suitable place
|
||
INPUT : New Size
|
||
Channel Id
|
||
OUTPUT : Pointer on the allocated zone
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void * fn_p_vStaAlloc (unsigned long ulSize, unsigned char ucChannel){
|
||
tdstBlockInfoPriv * p_stMyBlockInfo = (tdstBlockInfoPriv *) g_d_stCurrentModeInfo[ucChannel].p_vTdstBlockInfoOrTdstDynInfo;
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
tdstMallocInfo *p_stMyMallocInfo;
|
||
tdstCurrentModeInfo stCurrentModeInfo = g_d_stCurrentModeInfo[ucChannel];
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
#ifdef __ERROR_STRINGS__
|
||
#if defined(__WARNING3_ERR_MMG__) || defined (__DEBUG_MALLOC_MODE__)
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
#endif/*defined(__WARNING3_ERR_MMG__) || defined (__DEBUG_MALLOC_MODE__)*/
|
||
#endif /*__ERROR_STRINGS__*/
|
||
|
||
#ifdef _DEBUG
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (g_ucBLockedAllocation == C_ucTrue){
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbAccessMemoryDenied, "Static Allocation : -> denied <-", ucChannel);
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
#endif /*_DEBUG*/
|
||
|
||
if (ulSize == 0){
|
||
/*#ifdef __WARNING3_ERR_MMG__
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbSizeOfAllocIs0, NULL, ucChannel);
|
||
#endif
|
||
Mmg_MLeaveCriticalSection();*/
|
||
return NULL;
|
||
}
|
||
|
||
Mmg_MEnterCriticalSection();
|
||
|
||
/*XB*/
|
||
M_CheckPointer(p_stMyBlockInfo);
|
||
/*End XB*/
|
||
|
||
if (p_stMyBlockInfo->p_cFirstFree != C_FirstFreeValueForBlockWithoutFree){/*BlockWithFree*/
|
||
unitAlloc *p_uaMyFreeSpace;
|
||
unitAlloc *p_uaBeforeMyFreeSpace;
|
||
unsigned char b_ucFound = C_ucFalse;
|
||
|
||
Mmg_M_BigBoundSize (ulSize, C_uwAllocSize);
|
||
ulSize >>= C_uwShiftAllocSize;
|
||
ulSize += (C_ucMallocHeaderSize + C_ucMallocFooterSize); /* place for information(s) to manage the allocation place*/
|
||
|
||
/* find the first free enought big.*/
|
||
/*---------------------------------*/
|
||
p_uaMyFreeSpace = (unitAlloc *) p_stMyBlockInfo->p_cFirstFree;
|
||
p_uaBeforeMyFreeSpace = p_uaMyFreeSpace;
|
||
|
||
while ((p_uaMyFreeSpace != (unitAlloc *) 0 ) && !b_ucFound){
|
||
if ((*p_uaMyFreeSpace)>=(unitAlloc) ulSize){
|
||
b_ucFound = C_ucTrue;
|
||
}
|
||
else {/* not enought place*/
|
||
p_uaBeforeMyFreeSpace = p_uaMyFreeSpace;
|
||
p_uaMyFreeSpace = (unitAlloc *) *(p_uaMyFreeSpace+1);/* go to next*/
|
||
}
|
||
}
|
||
if (b_ucFound){
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __ADD_PLACE_FOR_DEBUG_INFORMATION__
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
/* test of overflow on a block*/
|
||
if ( (char *) ( p_uaMyFreeSpace+ (ulSize
|
||
- ( (p_stMyBlockInfo->ulNbMalloc+1/*+1 pour le courant*/) * C_ucDebugInformationLoss )/* memMax - the place for debug information of all the allocation.*/
|
||
)
|
||
)-1
|
||
>
|
||
(p_stMyBlockInfo->p_cEndBlock - (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize))) /* the end of the memory without the memory added for the debug information*/
|
||
)
|
||
{
|
||
unitAlloc *p_uaTheLastFreeSpace=p_uaMyFreeSpace;
|
||
#ifdef __ERROR_STRINGS__
|
||
Mmg_fn_v_PrintInfoMalloc("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
|
||
Mmg_fn_v_PrintInfoMalloc("State of the block before the allocate problem:\n");
|
||
sprintf (szErrTxt, "in the request 'fn_p_vStaAlloc(%d)'\n", ulSize);
|
||
Mmg_fn_v_PrintInfoMalloc(szErrTxt);
|
||
Mmg_fn_v_PrintInfoMalloc("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
|
||
Mmg_M_PrintBlockStatisticWithModuleId(stCurrentModeInfo.ucModuleId, stCurrentModeInfo.ucMode);
|
||
Mmg_fn_v_PrintInfoMalloc("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");
|
||
|
||
while ((unitAlloc *)*(p_uaTheLastFreeSpace+1) != NULL)
|
||
p_uaTheLastFreeSpace = (unitAlloc *) *(p_uaTheLastFreeSpace+1);
|
||
|
||
sprintf (szErrTxt, "You want to allocate %db(with the size field) but the maximum allocation allowed is %db.\nSee the %s file in witch the state (before the request of allocation)of the block is printed",
|
||
(ulSize - C_ucDebugInformationLoss)<<C_uwShiftAllocSize,
|
||
((*p_uaTheLastFreeSpace)- ((p_stMyBlockInfo->ulMaxNbStaticMalloc*C_ucDebugInformationLoss)- ( p_stMyBlockInfo->ulNbMalloc * C_ucDebugInformationLoss))) << C_uwShiftAllocSize,
|
||
C_szMmgLogFileName);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBLockFull, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBLockFull, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
/*end of the completion of explaination of erors*/
|
||
Mmg_MLeaveCriticalSection();
|
||
return (NULL);
|
||
}
|
||
#endif/*__WARNING3_ERR_MMG__*/
|
||
#endif /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
/* use the free place (pointed by p_uaMyFreeSpace)& management of the free list*/
|
||
/*------------------------------------------------------------------------------*/
|
||
*p_uaMyFreeSpace -= ((unitAlloc) ulSize);/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/ /* the content of the size field is equal of the remain (not used for the allocation)*/
|
||
|
||
if (*p_uaMyFreeSpace < (unitAlloc) C_ucFreeHeaderSize) /*lint !e613 : Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
{/*The remain of the free place is not enougth big to be managned*/
|
||
/* we affect all the place of the free to the malloc */
|
||
ulSize += (*p_uaMyFreeSpace);/*lint !e613 : Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
if ((unitAlloc *)(*(p_uaMyFreeSpace + 1))!= (unitAlloc *) 0)/*lint !e613 : Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
{/* if it's not the last free (remain)*/
|
||
p_stMyBlockInfo->uwNbFree--; /*we have one less free*/
|
||
}
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
|
||
|
||
/* management of the first free*/
|
||
if (p_uaMyFreeSpace == p_uaBeforeMyFreeSpace){/* My free space is the first free*/
|
||
p_stMyBlockInfo->p_cFirstFree = (char *) *(p_uaMyFreeSpace + 1);/*lint !e613 : Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
}
|
||
else {/*commom case*/
|
||
/* the 'old' free place will become empty (everything is used for the malloc)*/
|
||
/* Management of the Free list : the 'next' field of the free place before the free place used, will be affect to the contents of the 'next' field of the free place used */
|
||
*(p_uaBeforeMyFreeSpace + 1) = *(p_uaMyFreeSpace + 1);/*lint !e613 : Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
}
|
||
}
|
||
else {/* management of the remained place after the new alloction.*/
|
||
*(p_uaMyFreeSpace+ulSize)= *p_uaMyFreeSpace;/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*//* set the 'size' field of remained place*/
|
||
/* the 'next' field of the remain is equal to the old next field of the free space used*/
|
||
*(p_uaMyFreeSpace+ulSize+1)= *(p_uaMyFreeSpace+1);/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
|
||
/* management of the first free*/
|
||
if (p_uaMyFreeSpace == (unitAlloc *) p_stMyBlockInfo->p_cFirstFree)/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
{
|
||
p_stMyBlockInfo->p_cFirstFree = (char *) (p_uaMyFreeSpace+ulSize);/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
}
|
||
else {/* common case*/
|
||
/* the 'next' field of the free place before the free place used, will be affect to the content of the remain of the free place used */
|
||
*(p_uaBeforeMyFreeSpace + 1) = (unitAlloc) (p_uaMyFreeSpace + ulSize);/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
}
|
||
}
|
||
|
||
/* store malloc Information*/
|
||
/*--------------------------*/
|
||
*p_uaMyFreeSpace = (unitAlloc)ulSize;/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
*(p_uaMyFreeSpace + 1) = C_uaBeginKey;/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
*(p_uaMyFreeSpace + ulSize -1) = C_uaEndKey;/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
p_stMyMallocInfo = p_stMyBlockInfo->d_stMallocInfo + (p_stMyBlockInfo->ulNbMalloc)++;
|
||
if (p_stMyBlockInfo->ulNbMalloc > p_stMyBlockInfo->ulMaxNbStaticMalloc) {
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf(szErrTxt, "ulNbMalloc(%d) > ulMaxNbStaticMalloc (%d)\n", p_stMyBlockInfo->ulNbMalloc, p_stMyBlockInfo->ulMaxNbStaticMalloc);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbTooManyAllacation, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbTooManyAllacation, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
|
||
p_stMyMallocInfo->p_cBeginMalloc = (char *) (p_uaMyFreeSpace + C_ucMallocHeaderSize);/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
p_stMyMallocInfo->p_cEndMalloc = ((char *) (p_uaMyFreeSpace + ulSize - C_ucMallocFooterSize)) - 1;/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
if ((char *)(p_uaMyFreeSpace+ *p_uaMyFreeSpace) -1 >=p_stMyBlockInfo->p_cMaxMem)/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
{
|
||
/* Managemement of the mem max information in order to be able to compute an estination of the optimzed version*/
|
||
p_stMyBlockInfo->p_cMaxMem=(char *)(p_uaMyFreeSpace+ *p_uaMyFreeSpace)-1;/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulCountMallocBeforeMaxMem = p_stMyBlockInfo->ulNbMalloc;
|
||
p_stMyBlockInfo->ulCountFreeBeforeMaxMem = p_stMyBlockInfo->uwNbFree;
|
||
#endif /* __DEBUG_MALLOC_MODE__ */
|
||
|
||
#ifdef __ADD_PLACE_FOR_DEBUG_INFORMATION__
|
||
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
if ( ( p_stMyBlockInfo->ulNbMalloc )
|
||
>
|
||
p_stMyBlockInfo->ulMaxNbStaticMalloc
|
||
)
|
||
{
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf(szErrTxt, "ulNbMalloc(%d) > ulMaxNbStaticMalloc (%d)\n", p_stMyBlockInfo->ulNbMalloc, p_stMyBlockInfo->ulMaxNbStaticMalloc);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbSpaceForDebugInformationIsFull, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbSpaceForDebugInformationIsFull, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__WARNING3_ERR_MMG__*/
|
||
#endif /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
|
||
|
||
}/* Managemement of the mem max information */
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulNbTotalMalloc++;
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
|
||
/* return the Alloc adresse*/
|
||
/*--------------------------*/
|
||
Mmg_MLeaveCriticalSection();
|
||
return ( (void *) (p_uaMyFreeSpace + C_ucMallocHeaderSize) );/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/
|
||
}
|
||
else{
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "there is no free space enougth big (i.e. %db)\n,even with the 'added debug information' memory\n",
|
||
(ulSize - C_ucDebugInformationLoss)<<C_uwShiftAllocSize);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBLockFull, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBLockFull, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
|
||
#else /* __DEBUG_MALLOC_MODE__*/
|
||
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "there is no free space enougth big (i.e. %db)\n,even with the 'added debug information' memory\n",
|
||
ulSize<<C_uwShiftAllocSize);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBLockFull, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBLockFull, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
#endif/*__WARNING3_ERR_MMG__*/
|
||
Mmg_MLeaveCriticalSection();
|
||
return (NULL);
|
||
}
|
||
|
||
}/*BlockWithFree*/
|
||
else{/*BlockWithoutFree*/
|
||
unsigned long ulI;
|
||
#ifdef D_CheckSystemForBlockWithoutFree
|
||
tdstInformationHeaderOfBolckWithoutFree *p_stInfoHeaderBolck =
|
||
(tdstInformationHeaderOfBolckWithoutFree *) p_stMyBlockInfo->p_cBeginBlock;
|
||
|
||
/*#define Mmg_M_BigBoundSize(ulSize, ucAlignment)*/
|
||
/* if ( (ulSize) & (unsigned long)((p_stInfoHeaderBolck->ucAlignment)-1)) {
|
||
(ulSize) = ((ulSize) & (~((unsigned long)((p_stInfoHeaderBolck->ucAlignment)-1)))) + (p_stInfoHeaderBolck->ucAlignment);
|
||
}*/
|
||
|
||
Mmg_M_BigBoundSize (ulSize, p_stInfoHeaderBolck->ucAlignment);/* added to be shure that the alignment is Ok*/
|
||
#endif /*D_CheckSystemForBlockWithoutFree*/
|
||
|
||
/* compute the real remain;*/
|
||
ulI = p_stMyBlockInfo->p_cEndBlock-p_stMyBlockInfo->p_cMaxMem;
|
||
if (ulSize > ulI) {
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf(szErrTxt, "the is not enought memory(%db) for the allocation size requested (%d)\n", ulI, ulSize);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBLockFull, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBLockFull, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
#endif /*__WARNING3_ERR_MMG__*/
|
||
Mmg_MLeaveCriticalSection();
|
||
return (NULL);
|
||
}
|
||
|
||
#ifdef D_CheckSystemForBlockWithoutFree
|
||
|
||
/* the check overflow key just after the p_cMaxMem*/
|
||
if ((p_stInfoHeaderBolck->ucMode & C_Check_OverflowFlag) &&
|
||
(ulI >= sizeof (C_TypeOfOverflowCheckKeyForBlockWithoutFree)) && /*there is enought space to store the remain*/
|
||
(!Mmg_fn_b_cIsItEqualToOverflowCheckKey(p_stMyBlockInfo->p_cMaxMem+1)) ) {
|
||
#ifdef U64
|
||
M_PrintfN64(("E_uwMmgPbOverFlowBeforeOnTheRemainTag: p_cMaxMem+1=0X%X\n", p_stMyBlockInfo->p_cMaxMem+1));
|
||
#endif /*U64*/
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf(szErrTxt, "The key expexted should be 0X%X, but we have 0X%X\n",C_ulOverflowCheckKey, (*(C_TypeOfOverflowCheckKeyForBlockWithoutFree *)(p_stMyBlockInfo->p_cMaxMem+1)));
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbOverFlowBeforeOnTheRemainTag, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbOverFlowBeforeOnTheRemainTag, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
|
||
/* if needed (C_FillTheBlockWithCleanKeyFlag), erase the old key by */
|
||
if (p_stInfoHeaderBolck->ucMode & C_FillTheBlockWithCleanKeyFlag){
|
||
char * p_cTmp;
|
||
for (p_cTmp = p_stMyBlockInfo->p_cMaxMem+1;
|
||
(p_cTmp <= p_stMyBlockInfo->p_cMaxMem+sizeof(C_TypeOfOverflowCheckKeyForBlockWithoutFree)) &&
|
||
(p_cTmp <= p_stMyBlockInfo->p_cEndBlock);
|
||
p_cTmp++){
|
||
*p_cTmp = (char)C_uaCleanKeyForBlockWithoutFree;
|
||
}
|
||
}
|
||
|
||
|
||
/* check the alignment*/
|
||
if (p_stInfoHeaderBolck->ucMode & C_Check_AlignementFlag){
|
||
ulI = ulSize;
|
||
Mmg_M_BigBoundSize (ulSize, p_stInfoHeaderBolck->ucAlignment);
|
||
|
||
if (ulI != ulSize) {
|
||
#ifdef U64
|
||
M_PrintfN64(("E_uwMmgPbAlignmentAllocationRequested: %d [%d]--> %d\n", ulI, p_stInfoHeaderBolck->ucAlignment, ulSize));
|
||
#endif /*U64*/
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf(szErrTxt, "the size requested (%d) is not a multiple of the alignment(%d)\n", ulI, p_stInfoHeaderBolck->ucAlignment);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbAlignmentAllocationRequested, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbAlignmentAllocationRequested, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
}/*C_Check_AlignementFlag*/
|
||
#endif /*D_CheckSystemForBlockWithoutFree*/
|
||
|
||
/*save the adresse of the return pointer in ulI*/
|
||
ulI = (unsigned long) p_stMyBlockInfo->p_cMaxMem + 1;
|
||
|
||
p_stMyBlockInfo->p_cMaxMem += ulSize;
|
||
|
||
#ifdef D_CheckSystemForBlockWithoutFree
|
||
/*Store the overflow key check*/
|
||
if ((p_stMyBlockInfo->p_cEndBlock - p_stMyBlockInfo->p_cMaxMem) >= sizeof(C_TypeOfOverflowCheckKeyForBlockWithoutFree)){/*there is enought space to store the OverflowCheckKey*/
|
||
Mmg_fn_vWriteOverflowCheckKey(p_stMyBlockInfo->p_cMaxMem+1);
|
||
}
|
||
#endif /*D_CheckSystemForBlockWithoutFree*/
|
||
Mmg_MLeaveCriticalSection();
|
||
return ((void*) ulI);
|
||
/* return (NULL);*/
|
||
|
||
}/*BlockWithoutFree*/
|
||
}/*fn_p_cStaAlloc */
|
||
/* ================*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : fn_vStaFree
|
||
DESCRIPTION : Free a memory zone in the block specified in the channel
|
||
append with the previous and next zone if possible
|
||
INPUT : Pointer on an allocated zone
|
||
Channel Id
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void fn_vStaFree (void *p_vMemBlock, unsigned char ucChannel){
|
||
/* ===========*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
unsigned char b_ucFound = C_ucFalse;
|
||
tdstMallocInfo * p_stMallocInfo;
|
||
unsigned short uwNbCreatedFree = 1;/*the common case (without any join), we create 1 new free*/
|
||
#endif/*__DEBUG_MALLOC_MODE__*/
|
||
tdstBlockInfoPriv * p_stMyBlockInfo = (tdstBlockInfoPriv *) g_d_stCurrentModeInfo[ucChannel].p_vTdstBlockInfoOrTdstDynInfo;
|
||
unitAlloc * p_uaNextFree;
|
||
unitAlloc * p_uaSizeMalloc;
|
||
unitAlloc *p_uaAfterFreeSpace;
|
||
unitAlloc *p_uaBeforeFreeSpace;
|
||
|
||
/* Oliv' - Portage v15 - Blindage pour <20>viter les trucs genre GAM_Malloc -> TMP_Free !!*/
|
||
#ifndef RETAIL
|
||
if (((char*)p_vMemBlock) < p_stMyBlockInfo->p_cBeginBlock || ((char*)p_vMemBlock)>p_stMyBlockInfo->p_cEndBlock)
|
||
{
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbStaAddressNotValid, NULL, ucChannel);
|
||
#ifdef U64
|
||
M_PrintfStopErrorN64(("Deallocating memory not in the right block !!!\n"));
|
||
#endif
|
||
}
|
||
#endif /*RETAIL*/
|
||
/* EndOfOliv'*/
|
||
|
||
#ifdef _DEBUG
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (g_ucBLockedAllocation == C_ucTrue){
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbAccessMemoryDenied, "Static Free : -> denied <-", ucChannel);
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
#endif /*_DEBUG*/
|
||
|
||
|
||
#ifdef D_CheckSystemForBlockWithoutFree
|
||
if (p_stMyBlockInfo->p_cFirstFree == C_FirstFreeValueForBlockWithoutFree){
|
||
Mmg_M_UpdateLastError(E_uwMmgPbNoAvailableFunctionForBlockWithoutFree, NULL)
|
||
}
|
||
#endif /*D_CheckSystemForBlockWithoutFree*/
|
||
|
||
Mmg_MEnterCriticalSection();
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
if (p_vMemBlock==NULL){
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbFreeofNULL, NULL, ucChannel);
|
||
}
|
||
else
|
||
#endif /*__WARNING3_ERR_MMG__*/
|
||
{/* of the else : p_vMemBlock!=NULL*/
|
||
p_stMallocInfo = p_stMyBlockInfo->d_stMallocInfo;
|
||
/* verification of the validity of the request*/
|
||
/*---------------------------------------------*/
|
||
|
||
/* find the good malloc */
|
||
while ((p_stMallocInfo < p_stMyBlockInfo->d_stMallocInfo + (p_stMyBlockInfo->ulNbMalloc)) && !b_ucFound){
|
||
if (p_stMallocInfo->p_cBeginMalloc == (char *)p_vMemBlock) b_ucFound=C_ucTrue;
|
||
else p_stMallocInfo ++;
|
||
}
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
if (!b_ucFound){
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
sprintf (szErrTxt, "With fn_vStaFree(0X%X)\n", p_vMemBlock);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbStaAddressNotValid, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbStaAddressNotValid, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
else
|
||
#endif /* __WARNING3_ERR_MMG__*/
|
||
{/* ofthe else : b_ucfound is set*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
/* Management of the free list*/
|
||
/*-----------------------------*/
|
||
|
||
/* Goal: We want the sort list of free, then we insert the new free space between the (2) contiguous free space.*/
|
||
/* look for the rigth place.*/
|
||
p_uaBeforeFreeSpace = p_uaAfterFreeSpace = (unitAlloc *) p_stMyBlockInfo->p_cFirstFree;
|
||
while ((p_uaAfterFreeSpace != (unitAlloc *) 0 ) && (p_uaAfterFreeSpace < (unitAlloc *) p_vMemBlock) ){
|
||
p_uaBeforeFreeSpace = p_uaAfterFreeSpace;
|
||
#ifdef CHECK_MEMORY
|
||
if(p_uaAfterFreeSpace==((unitAlloc *) p_vMemBlock) - C_ucMallocHeaderSize)
|
||
{
|
||
osSyncPrintf("Bouclage : always a Free de %x\n",(unsigned long)p_vMemBlock);
|
||
fn_vDebug();
|
||
}
|
||
|
||
if(p_uaAfterFreeSpace==(unitAlloc *) *(p_uaAfterFreeSpace+1))
|
||
{
|
||
osSyncPrintf("Bouclage : Free de %x\n",(unsigned long)p_vMemBlock);
|
||
fn_vDebug();
|
||
}
|
||
#endif
|
||
p_uaAfterFreeSpace = (unitAlloc *) *(p_uaAfterFreeSpace+1);/* go to next*/
|
||
}
|
||
/* here p_uaAfterFreeSpace point at the free space just after & p_uaBeforeFreeSpace that is just before*/
|
||
|
||
/* general case:*/
|
||
/* | Free | (...) | allocation | (...) | Free |*/
|
||
/* ^-- p_uaBeforeFreeSpace ^-- p_vMemBlock ^-- p_uaAfterFreeSpace*/
|
||
|
||
/* set information for the new free space*/
|
||
/* size of the free block is the same that the size of malloc block at the begining at adresse [ ((unitAlloc) p_vMemBlock) - C_ucMallocHeaderSize ]*/
|
||
|
||
/* mamnagement of the next field of the list */
|
||
/*p_uaNextFree points at the 'next' field of my new free place*/
|
||
p_uaNextFree = ((unitAlloc *) p_vMemBlock) - C_ucMallocHeaderSize + 1;/*1 to junp the size field (of the free place) in order point at the next field*/
|
||
p_uaSizeMalloc = ((unitAlloc *) p_vMemBlock) - C_ucMallocHeaderSize; /* ptr of the real begining (before the header) of the malloc place*/
|
||
|
||
if (p_uaBeforeFreeSpace == p_uaAfterFreeSpace) {/*my new free space will become the first element of the free list*/
|
||
/* Management of joining with the old first free space after my new free*/
|
||
if ( (p_uaSizeMalloc + *p_uaSizeMalloc) == p_uaAfterFreeSpace ){
|
||
/*my new free space and the old first free space have to be joined with thz free space just after because the end of my new free space =begining of the first free space */
|
||
/* ----------- ---------------- */
|
||
*(p_uaNextFree-1) = *(p_uaNextFree-1) + *p_uaAfterFreeSpace;/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/ /*the 'size' field of my new free space must be added with the content of 'size' field of my joined free space */
|
||
*p_uaNextFree = *(p_uaAfterFreeSpace + 1);/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/ /* the 'next' field of my new free space is equal to the 'next' field of my old first free space*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* clean the area of the old free, i.e. the Header of the Free just after*/
|
||
*p_uaAfterFreeSpace = C_uaCleanKey;/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/ /* the FreeSize field*/
|
||
*(p_uaAfterFreeSpace+1) = C_uaCleanKey;/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*//* the field of the adress of the next free*/
|
||
uwNbCreatedFree--;/*we have join 2 free together*/
|
||
#endif /*__DEBUG_MALLOC_MODE__ */
|
||
}
|
||
else{ /* common case : no need to join*/
|
||
*p_uaNextFree = (unitAlloc) p_uaAfterFreeSpace;
|
||
}
|
||
|
||
/*The begining of the new free space.*/
|
||
p_stMyBlockInfo->p_cFirstFree = (char *) (((unitAlloc *) p_vMemBlock) - C_ucMallocHeaderSize);
|
||
}
|
||
|
||
else {/* common case: insert the new fre space between p_uaBeforeFreeSpace & p_uaAfterFreeSpace.*/
|
||
/* Management of joining with the free space just after my new free space*/
|
||
if ( (p_uaSizeMalloc + *p_uaSizeMalloc) == p_uaAfterFreeSpace ){/*my new free space and the free space just after have to be joined because the end of my new free space = begining of the free space after*/
|
||
*(p_uaNextFree-1) = *(p_uaNextFree-1) + *p_uaAfterFreeSpace;/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/ /*the 'size' field of my new free space must be added with the content of 'size' field of my joined free space */
|
||
*p_uaNextFree = *(p_uaAfterFreeSpace + 1);/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/ /* the 'next' field of my new free space is equal to the 'next' field of the free space just after*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* clean the area of the old free, i.e. the Header of the Free just after*/
|
||
*p_uaAfterFreeSpace = C_uaCleanKey;/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/ /* the FreeSize field*/
|
||
*(p_uaAfterFreeSpace+1) = C_uaCleanKey;/*lint !e613: Possible use of null pointer (p_uaMyFreeSpace)*/ /* the field of the adress of the next free*/
|
||
uwNbCreatedFree--;/*we have join 2 free together*/
|
||
#endif /*__DEBUG_MALLOC_MODE__ */
|
||
}
|
||
else {/* no need to join my free space with the free space just after*/
|
||
*p_uaNextFree = *(p_uaBeforeFreeSpace +1);/*the 'next' field of my free space is equal to the contents of the next field of the fre space just before it*/
|
||
}
|
||
|
||
/* Management of joining with the free space just before my new free space*/
|
||
if ( (p_uaBeforeFreeSpace + *p_uaBeforeFreeSpace) == p_uaSizeMalloc ){/*my new free space and the free space just before have to be joined because the end of the free space before = begining of my new free space*/
|
||
*(p_uaBeforeFreeSpace) =*(p_uaBeforeFreeSpace) + *(p_uaNextFree-1);/*the 'size' field of the free space just before must be added with the content of 'size' field of my new free space */
|
||
*(p_uaBeforeFreeSpace +1) = *p_uaNextFree;/* the 'next' field of the free space just before is equal to the 'next' field of my new free space*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* clean the area the Header of the new Free located at the old allocation*/
|
||
*p_uaSizeMalloc = C_uaCleanKey;/* the FreeSize field*/
|
||
*(p_uaSizeMalloc+1) = C_uaCleanKey;/* the field of the adress of the next free*/
|
||
uwNbCreatedFree--;/*we have join 2 free together*/
|
||
|
||
/* code only used for clean the new free area.*/
|
||
/* this is the only case where the begining of the new free space change (not equal to p_vMemBlock), then we have to set p_vMemblock in order to point on the right place*/
|
||
/* a supprimer p_vMemBlock = (void *) (p_uaBeforeFreeSpace + C_ucMallocHeaderSize);*/
|
||
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}
|
||
else{/* no need to join my free space with the free space just before*/
|
||
*(p_uaBeforeFreeSpace +1) = (unitAlloc)(((unitAlloc*) p_vMemBlock) - C_ucMallocHeaderSize);/*the contents of the next field just before my new free space must be equal to the adresse of my new free space.*/
|
||
}
|
||
}
|
||
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
|
||
/* clean the area of the new free. we use the variable p_uaNextFree for scan the memory & p_uaAfterfreespace for the end of the free area.*/
|
||
for ( p_uaNextFree = ((unitAlloc *) p_stMallocInfo->p_cBeginMalloc);
|
||
p_uaNextFree < ((unitAlloc *) p_stMallocInfo->p_cEndMalloc) + 1 /*for the ending key*/;
|
||
p_uaNextFree++
|
||
){
|
||
*p_uaNextFree = C_uaCleanKey;
|
||
}
|
||
|
||
/* move up all the mallocs remainded*/
|
||
/*-----------------------------------*/
|
||
for (p_stMallocInfo ++;
|
||
(p_stMallocInfo < p_stMyBlockInfo->d_stMallocInfo + (p_stMyBlockInfo->ulNbMalloc));
|
||
p_stMallocInfo ++){
|
||
*(p_stMallocInfo-1) = *p_stMallocInfo;
|
||
}
|
||
(p_stMyBlockInfo->ulNbMalloc) --;
|
||
|
||
p_stMyBlockInfo->ulNbTotalFree++;
|
||
p_stMyBlockInfo->uwNbFree+= uwNbCreatedFree;
|
||
}/* ofthe else : b_ucfound is set*/
|
||
}/* of the else : p_vMemBlock!=NULL*/
|
||
#endif /*__DEBUG_MALLOC_MODE__ */
|
||
Mmg_MLeaveCriticalSection();
|
||
}/* fn_vStaFree */
|
||
/* ===========*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : fn_p_vStaRealloc
|
||
DESCRIPTION : Realloc a memory zone in the block specified in the channel
|
||
always try to allocated at a lower address
|
||
INPUT : Pointer on an allocated zone
|
||
New Size
|
||
Channel Id
|
||
OUTPUT : Pointeur on the new zone
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void * fn_p_vStaRealloc (void *p_vMemBlock, unsigned long ulSize, unsigned char ucChannel){
|
||
/* ================*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
tdstMallocInfo * p_stMallocInfo;
|
||
tdstMallocInfo *p_stMyMallocInfo;
|
||
unsigned long ulMyNbMalloc;
|
||
tdstCurrentModeInfo stCurrentModeInfo = g_d_stCurrentModeInfo[ucChannel];
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
#endif /*__ERROR_STRINGS__*/
|
||
|
||
#endif/*__DEBUG_MALLOC_MODE__*/
|
||
tdstBlockInfoPriv * p_stMyBlockInfo = (tdstBlockInfoPriv *) g_d_stCurrentModeInfo[ucChannel].p_vTdstBlockInfoOrTdstDynInfo;
|
||
unitAlloc * p_uaTmp;/*temporary pointer: if we reduce the allocation p_uaTmp=pointer at the new free space. // !! voir a renomer*/
|
||
unitAlloc * p_uaSizeMalloc;
|
||
unitAlloc *p_uaBeforeBeforeFreeSpace;
|
||
unitAlloc *p_uaBeforeFreeSpace;
|
||
unitAlloc *p_uaAfterFreeSpace;
|
||
unitAlloc *p_uaAfterAfterFreeSpace;
|
||
unitAlloc uaBeforeFreeSize, uaAfterFreeSize;/* size of the free space just before & after the allocation. 0 meaning there are not adjacent to the malloc*/
|
||
long lDiffSize;/* difference between the actual size and the size requested (ulSize) */
|
||
unsigned char b_ucFound = C_ucFalse;
|
||
|
||
|
||
#ifdef _DEBUG
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (g_ucBLockedAllocation == C_ucTrue){
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbAccessMemoryDenied, "Static Reallocation : -> denied <-", ucChannel);
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
#endif /*_DEBUG*/
|
||
|
||
|
||
#ifdef D_CheckSystemForBlockWithoutFree
|
||
if (p_stMyBlockInfo->p_cFirstFree == C_FirstFreeValueForBlockWithoutFree){
|
||
Mmg_M_UpdateLastError(E_uwMmgPbNoAvailableFunctionForBlockWithoutFree, NULL)
|
||
}
|
||
#endif /*D_CheckSystemForBlockWithoutFree*/
|
||
|
||
Mmg_MEnterCriticalSection();
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMallocInfo = p_stMyBlockInfo->d_stMallocInfo;
|
||
/* verification of the validity of the request & find the ulMyNbMalloc*/
|
||
/*---------------------------------------------------------------------*/
|
||
|
||
/* find the good malloc ulMyNbMalloc*/
|
||
ulMyNbMalloc = 0;
|
||
while ((p_stMallocInfo < p_stMyBlockInfo->d_stMallocInfo + (p_stMyBlockInfo->ulNbMalloc)) && !b_ucFound){
|
||
if (p_stMallocInfo->p_cBeginMalloc == (char *)p_vMemBlock) b_ucFound=C_ucTrue;
|
||
else {
|
||
p_stMallocInfo ++;
|
||
ulMyNbMalloc++;
|
||
}
|
||
}
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
if (!b_ucFound){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "With fn_vStaRealloc(0X%X)\n", p_vMemBlock);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbStaAddressNotValid, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbStaAddressNotValid, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
else
|
||
#endif /* __WARNING3_ERR_MMG__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
{/* of the else b_ucFound is set*/
|
||
|
||
if (ulSize == 0){
|
||
/*it is a free command */
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
(p_stMyBlockInfo->ulNbTotalFree)--;/* this is not a real free requested, then we don't have to increase the counter. */
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
fn_vStaFree (p_vMemBlock, ucChannel);
|
||
Mmg_MLeaveCriticalSection();
|
||
return ((void * )0);
|
||
}
|
||
|
||
Mmg_M_BigBoundSize (ulSize, C_uwAllocSize);
|
||
ulSize >>= C_uwShiftAllocSize;
|
||
ulSize += (C_ucMallocHeaderSize + C_ucMallocFooterSize); /* place for information(s) to manage the allocation place*/
|
||
|
||
p_uaSizeMalloc = ((unitAlloc *) p_vMemBlock) - C_ucMallocHeaderSize; /* pointer of the real begining (before the header) of the malloc place*/
|
||
lDiffSize = (long)(*p_uaSizeMalloc - ulSize);
|
||
|
||
/*check if there is a space enought big to receive the allocation before p_vMemblock*/
|
||
/*----- ----------------- ------------------*/
|
||
|
||
p_uaBeforeBeforeFreeSpace = p_uaBeforeFreeSpace = (unitAlloc *) p_stMyBlockInfo->p_cFirstFree;
|
||
b_ucFound = C_ucFalse;
|
||
while ((p_uaBeforeFreeSpace != (unitAlloc *) 0 ) && (p_uaBeforeFreeSpace < p_uaSizeMalloc) && !b_ucFound ){
|
||
if ((*p_uaBeforeFreeSpace)>=(unitAlloc) ulSize){
|
||
b_ucFound = C_ucTrue;
|
||
}
|
||
else {/* not enought place*/
|
||
p_uaBeforeBeforeFreeSpace = p_uaBeforeFreeSpace;
|
||
p_uaBeforeFreeSpace = (unitAlloc *) *(p_uaBeforeFreeSpace+1);/* go to next*/
|
||
}
|
||
}
|
||
if (b_ucFound){
|
||
/* we can move up */
|
||
/* -------*/
|
||
ulSize -= (C_ucMallocHeaderSize + C_ucMallocFooterSize); /* place for information(s) to manage the allocation place*/
|
||
ulSize <<= C_uwShiftAllocSize;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulNbTotalMalloc--;/* this is not a real malloc requested, then we don't have to increase the counter.*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
p_uaTmp = (unitAlloc *) fn_p_vStaAlloc (ulSize, ucChannel);
|
||
|
||
|
||
memcpy ((void *) p_uaTmp, p_vMemBlock, ulSize);
|
||
|
||
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulNbTotalFree--;/* this is not a real free requested, then we don't have to increase the counter.*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
fn_vStaFree (p_vMemBlock, ucChannel);
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* the free have move up all the elt after the freed malloc of the Malloc info Table*/
|
||
/* then we have to use the last elt of the malloc info table*/
|
||
ulMyNbMalloc= (unsigned short) (p_stMyBlockInfo->ulNbMalloc -1);
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulNbTotalRealloc++;
|
||
p_vMemBlock = p_uaTmp;
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
|
||
p_uaSizeMalloc = p_uaTmp - C_ucMallocHeaderSize;
|
||
if ((char*)(p_uaSizeMalloc + *p_uaSizeMalloc)-1>=p_stMyBlockInfo->p_cMaxMem){
|
||
/* Managemement of the mem max information i order to be able to compute an estination of the optimzed version*/
|
||
p_stMyBlockInfo->p_cMaxMem=(char*)(p_uaSizeMalloc + *p_uaSizeMalloc)-1;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulCountMallocBeforeMaxMem = p_stMyBlockInfo->ulNbMalloc;
|
||
p_stMyBlockInfo->ulCountFreeBeforeMaxMem = p_stMyBlockInfo->uwNbFree;
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
}
|
||
/* not necessary
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
// count the real number of free
|
||
p_uaTmp = (unitAlloc*)p_stMyBlockInfo->p_cFirstFree;
|
||
for (uwI=0; *(p_uaTmp+1) != (unitAlloc)0; uwI++, p_uaTmp = (unitAlloc *) *(p_uaTmp+1));
|
||
p_stMyBlockInfo->uwNbFree = uwI;
|
||
p_uaTmp = p_vMemBlock;
|
||
#endif __DEBUG_MALLOC_MODE__
|
||
*/
|
||
|
||
Mmg_MLeaveCriticalSection();
|
||
return ((void *) p_uaTmp);
|
||
/* -------*/
|
||
}/* end of move up*/
|
||
|
||
/* inplice else because there is an return just before in the if*/
|
||
|
||
|
||
/* common algorithm */
|
||
/* Verify if there is any free space just after or before the actual malloc*/
|
||
/* ------ ---- --------------------- */
|
||
p_uaBeforeBeforeFreeSpace = p_uaBeforeFreeSpace = p_uaAfterFreeSpace = (unitAlloc *) p_stMyBlockInfo->p_cFirstFree;
|
||
while ((p_uaAfterFreeSpace != (unitAlloc *) 0 ) && (p_uaAfterFreeSpace < (unitAlloc *) p_vMemBlock) ){
|
||
p_uaBeforeBeforeFreeSpace = p_uaBeforeFreeSpace;
|
||
p_uaBeforeFreeSpace = p_uaAfterFreeSpace;
|
||
p_uaAfterFreeSpace = (unitAlloc *) *(p_uaAfterFreeSpace+1);/* go to next*/
|
||
}
|
||
/* here p_uaAfterFreeSpace point at the free space just after & p_uaBeforeFreeSpace that is just before & *(p_uaBeforeBefore+1) = p_uaBeforeFree*/
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | Free | (...) | allocation | (...) | Free |*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^-- p_vMemBlock ^-- p_uaAfterFree*/
|
||
|
||
if ((lDiffSize == 0) && ((p_uaBeforeFreeSpace != (unitAlloc *) 0) && (p_uaBeforeFreeSpace + *p_uaBeforeFreeSpace == p_uaSizeMalloc))){
|
||
/* we want to 'move up' just before the malloc with the same size. Because there is a free space just before my malloc */
|
||
/* ---------------------*/
|
||
|
||
/* Yes there is a free space just before my malloc */
|
||
/* ------*/
|
||
/*==> We will move the malloc to the beginig of the free, in order to have the new free space after.*/
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | Free || allocation | (...) | Free |*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^-- p_vMemBlock ^-- p_uaAfterFree*/
|
||
|
||
/* definition of my new free space after : p_uaTmp*/
|
||
/* -------*/
|
||
p_uaTmp = p_uaSizeMalloc + *p_uaSizeMalloc - *p_uaBeforeFreeSpace;/* point at the begining of the new free space. Just after the end of the allocation.*/
|
||
|
||
/*we have to move the begining of the allocation to p_uaSizeMalloc + lDiffSize*/
|
||
memmove (p_uaBeforeFreeSpace, p_uaSizeMalloc, (*p_uaSizeMalloc - (unsigned long)lDiffSize - C_ucMallocFooterSize)<< C_uwShiftAllocSize );
|
||
*(p_uaTmp+1) = (unitAlloc) p_uaAfterFreeSpace; /*restore the real 'next field'*/
|
||
*p_uaTmp = (unitAlloc) (((unitAlloc *)p_vMemBlock) - p_uaBeforeFreeSpace - C_ucMallocHeaderSize);/* restore the 'size' field for my free space.*/
|
||
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | allocation || Free | (...) | Free |*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^--p_uaTmp ^-- p_uaAfterFree*/
|
||
|
||
p_vMemBlock = (void *) (p_uaBeforeFreeSpace + C_ucMallocHeaderSize);/* the new return value*/
|
||
p_uaSizeMalloc = p_uaBeforeFreeSpace;
|
||
|
||
/*Management of the free list*/
|
||
if (p_uaBeforeBeforeFreeSpace == p_uaBeforeFreeSpace){/*first elt of the free list*/
|
||
p_stMyBlockInfo->p_cFirstFree = (char *) p_uaTmp;
|
||
}
|
||
else {/* commom case*/
|
||
*(p_uaBeforeBeforeFreeSpace +1) = (unitAlloc) p_uaTmp;/*the 'next' field of my free before the free space used have contain the value of the begining of my new free space*/
|
||
}
|
||
|
||
/* test if we have to join my new space free with the after free space.*/
|
||
if ((p_uaTmp + *p_uaTmp)== p_uaAfterFreeSpace){/*My new free is adjacent to the free space after. Then we have to join both.*/
|
||
/* general case:*/
|
||
/* | Free | ... | allocation || Free || Free | (...) |Free|*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^--p_uaTmp ^-- p_uaAfterFree*/
|
||
|
||
*p_uaTmp = *p_uaTmp + *p_uaAfterFreeSpace;/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/ /*the 'size' field of my new free space must be added with the content of 'size' field of my free space joined with*/
|
||
*(p_uaTmp+1) = *(p_uaAfterFreeSpace + 1);/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/ /* the 'next' field of my new free space is equal to the 'next' field of my old free space after*/
|
||
/* general case:*/
|
||
/* | Free | ... | allocation || new joined free | (...) |Free|*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^--p_uaTmp */
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->uwNbFree --; /*there is one less free*/
|
||
#endif /*__DEBUG_MALLOC_MODE__ */
|
||
|
||
}
|
||
|
||
/* store malloc Information:*/
|
||
/*--------------------------*/
|
||
*p_uaSizeMalloc = (unitAlloc)ulSize;
|
||
p_vMemBlock = (void *)(p_uaSizeMalloc + C_ucMallocHeaderSize);
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
*(p_uaSizeMalloc + ulSize - C_ucMallocFooterSize) = C_uaEndKey;
|
||
p_stMyBlockInfo->ulNbTotalRealloc++;
|
||
p_stMyMallocInfo = p_stMyBlockInfo->d_stMallocInfo + ulMyNbMalloc;
|
||
p_stMyMallocInfo->p_cBeginMalloc = (char *) p_vMemBlock;
|
||
p_stMyMallocInfo->p_cEndMalloc = ((char *) (p_uaSizeMalloc + ulSize - C_ucMallocFooterSize)) - 1;
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
if ((char*)(p_uaSizeMalloc + *p_uaSizeMalloc)-1>=p_stMyBlockInfo->p_cMaxMem){
|
||
/* Managemement of the mem max information i order to be able to compute an estination of the optimzed version*/
|
||
p_stMyBlockInfo->p_cMaxMem=(char*)(p_uaSizeMalloc + *p_uaSizeMalloc)-1;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulCountMallocBeforeMaxMem = p_stMyBlockInfo->ulNbMalloc;
|
||
p_stMyBlockInfo->ulCountFreeBeforeMaxMem = p_stMyBlockInfo->uwNbFree;
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
}
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* clean the area of the new free. we use the variable p_uaBeforeSpaceFree for scan the memory & p_uaAfterfreespace for the end of the free area.*/
|
||
for ( p_uaBeforeFreeSpace = p_uaTmp + C_ucFreeHeaderSize,
|
||
p_uaAfterFreeSpace = p_uaBeforeFreeSpace + *p_uaTmp - C_ucFreeHeaderSize;
|
||
p_uaBeforeFreeSpace < p_uaAfterFreeSpace;
|
||
p_uaBeforeFreeSpace++
|
||
){
|
||
*p_uaBeforeFreeSpace = C_uaCleanKey;
|
||
}
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
|
||
/* not necessary
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
// counte the real number of free
|
||
p_uaTmp = (unitAlloc*)p_stMyBlockInfo->p_cFirstFree;
|
||
for (uwI=0; *(p_uaTmp+1) != (unitAlloc)0; uwI++, p_uaTmp = (unitAlloc*) *(p_uaTmp+1));
|
||
p_stMyBlockInfo->uwNbFree = uwI;
|
||
#endif __DEBUG_MALLOC_MODE__
|
||
*/
|
||
|
||
Mmg_MLeaveCriticalSection();
|
||
return (p_vMemBlock);
|
||
}/* end of "we want to 'move up' just before the malloc with the same size because there is a free space just before my malloc "*/
|
||
|
||
|
||
else if (lDiffSize > 0){
|
||
/* we want to reduce the malloc */
|
||
/* ------*/
|
||
if ((p_uaBeforeFreeSpace != (unitAlloc *) 0) && (p_uaBeforeFreeSpace + *p_uaBeforeFreeSpace == p_uaSizeMalloc)){
|
||
/* Yes there is a free space just before my malloc */
|
||
/* ------*/
|
||
/*==> We will move the malloc to the beginig of the free, in order to have the new free space after.*/
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | Free || allocation | (...) | Free |*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^-- p_vMemBlock ^-- p_uaAfterFree*/
|
||
|
||
/* definition of my new free space after : p_uaTmp*/
|
||
/* -------*/
|
||
p_uaTmp = p_uaSizeMalloc + *p_uaSizeMalloc - lDiffSize - *p_uaBeforeFreeSpace;/* point at the begining of the new free space. Just after the end of the allocation.*/
|
||
|
||
/*we have to move the begining of the allocation to p_uaSizeMalloc + lDiffSize*/
|
||
memmove (p_uaBeforeFreeSpace, p_uaSizeMalloc, (*p_uaSizeMalloc - (unsigned long)lDiffSize - C_ucMallocFooterSize)<< C_uwShiftAllocSize );
|
||
*(p_uaTmp+1) = (unitAlloc) p_uaAfterFreeSpace;
|
||
*p_uaTmp = (unitAlloc)(((unitAlloc *)p_vMemBlock) - p_uaBeforeFreeSpace - C_ucMallocHeaderSize + lDiffSize);/* restore the 'size' field for my free space.*/
|
||
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | allocation || Free | (...) | Free |*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^--p_uaTmp ^-- p_uaAfterFree*/
|
||
|
||
p_vMemBlock = (void *) (p_uaBeforeFreeSpace + C_ucMallocHeaderSize);/* the new return value*/
|
||
p_uaSizeMalloc = p_uaBeforeFreeSpace;
|
||
|
||
/*Management of the free list*/
|
||
if (p_uaBeforeBeforeFreeSpace == p_uaBeforeFreeSpace){/*first elt of the free list*/
|
||
p_stMyBlockInfo->p_cFirstFree = (char *) p_uaTmp;
|
||
}
|
||
else {/* commom case*/
|
||
*(p_uaBeforeBeforeFreeSpace +1) = (unitAlloc) p_uaTmp;/*the 'next' field of my free before the free space used have contain the value of the begining of my new free space*/
|
||
}
|
||
|
||
/* test if we have to join my new space free with the after free space.*/
|
||
if ((p_uaTmp + *p_uaTmp)== p_uaAfterFreeSpace){/*My new free is adjacent to the free space after. Then we have to join both.*/
|
||
/* general case:*/
|
||
/* | Free | ... | allocation || Free || Free | (...) |Free|*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^--p_uaTmp ^-- p_uaAfterFree*/
|
||
|
||
*p_uaTmp = *p_uaTmp + *p_uaAfterFreeSpace;/*lint !e613: Possible use of null pointer*/ /*the 'size' field of my new free space must be added with the content of 'size' field of my free space joined with*/
|
||
*(p_uaTmp+1) = *(p_uaAfterFreeSpace + 1);/*lint !e613: Possible use of null pointer*/ /* the 'next' field of my new free space is equal to the 'next' field of my old free space after*/
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | allocation || New joined free | (...) |Free|*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^--p_uaTmp */
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->uwNbFree --; /*there is one less free*/
|
||
#endif /*__DEBUG_MALLOC_MODE__ */
|
||
|
||
}
|
||
}/*there is a free space just before my malloc */
|
||
|
||
|
||
else if (p_uaSizeMalloc + *p_uaSizeMalloc == p_uaAfterFreeSpace ){
|
||
/* Yes there is a free space just after my malloc ==> then we joined those 2 free spaces*/
|
||
/* -----*/
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | Free | ... | allocation || Free | ... |Free|*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^-- p_vMemBlock ^-- p_uaAfterFree*/
|
||
|
||
/* definition of my new free space : p_uaTmp*/
|
||
/* -------*/
|
||
p_uaTmp = p_uaSizeMalloc + *p_uaSizeMalloc - lDiffSize;/* point at the begining of the new free space*/
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | Free | ... | allocation || Free | ... |Free|*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^-- p_vMemBlock ^-- p_uaTmp*/
|
||
|
||
*p_uaTmp = (unitAlloc)lDiffSize + *p_uaAfterFreeSpace;/*lint !e613: Possible use of null pointer*/ /* like my new space is joined to the free just after we have to increase the 'size' field with the space joined*/
|
||
|
||
*(p_uaTmp+1) = *(p_uaAfterFreeSpace+1);/*lint !e613: Possible use of null pointer*/ /* the 'next' field of my new space must have the address contained in the next field of my old first free space*/
|
||
|
||
if (p_uaAfterFreeSpace == p_uaBeforeFreeSpace ){/* this is the first free space*/
|
||
p_stMyBlockInfo->p_cFirstFree = (char *) p_uaTmp;/*The begining of the new free space.*/
|
||
}
|
||
else {/* common case this is not the fisrt free space*/
|
||
*(p_uaBeforeFreeSpace + 1) = (unitAlloc) p_uaTmp;/*lint !e613: Possible use of null pointer*/ /* the 'next' field of my free space just before my point at my new free space*/
|
||
}
|
||
}/*there is a free space just after my malloc*/
|
||
|
||
else if (lDiffSize >= (long)C_ucFreeHeaderSize){
|
||
/* there isn't a free space just after or before my malloc and we can manage the free space poduced in the list of frees*/
|
||
/* we will generate a new free space*/
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | Free | (...) | allocation | (...) | Free |*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^-- p_vMemBlock ^-- p_uaAfterFree*/
|
||
|
||
/* definition of my new free space : p_uaTmp*/
|
||
/* -------*/
|
||
p_uaTmp = p_uaSizeMalloc + *p_uaSizeMalloc - lDiffSize;/* point at the begining of the new free space*/
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | Free | (...) | allocation || New Free | (...) | Free |*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^-- p_vMemBlock ^--P_uaTmp ^-- p_uaAfterFree*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->uwNbFree ++; /*there is one more free*/
|
||
#endif /*__DEBUG_MALLOC_MODE__ */
|
||
|
||
*p_uaTmp = (unitAlloc)lDiffSize;/* the 'size' field of my new free space*/
|
||
*(p_uaTmp+1) = (unitAlloc) p_uaAfterFreeSpace; /*The 'next' field of my new free space will contain the adresse of my old first elt free list*/
|
||
|
||
if (p_uaBeforeFreeSpace == p_uaAfterFreeSpace){/* My new free space is the first elt of the free list.*/
|
||
p_stMyBlockInfo->p_cFirstFree = (char *) p_uaTmp;/*The begining of the new free space.*/
|
||
}
|
||
else {/* commom case: My new free space will be between p_uaBeforeFreeSpace & p_uaAfterFreeSpace*/
|
||
*(p_uaBeforeFreeSpace + 1) = (unitAlloc) p_uaTmp;/*lint !e613: Possible use of null pointer*/ /* the 'next' field of my free space just before my point at my new free space*/
|
||
}
|
||
}
|
||
else {
|
||
Mmg_MLeaveCriticalSection();
|
||
return (p_vMemBlock);/* no change because, the lDiffSize is to little to be managed*/
|
||
}
|
||
|
||
/* store malloc Information:*/
|
||
/*--------------------------*/
|
||
*p_uaSizeMalloc = (unitAlloc)ulSize;
|
||
p_vMemBlock = (void *)(p_uaSizeMalloc + C_ucMallocHeaderSize);
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
*(p_uaSizeMalloc + ulSize - C_ucMallocFooterSize) = C_uaEndKey;
|
||
p_stMyBlockInfo->ulNbTotalRealloc++;
|
||
p_stMyMallocInfo = p_stMyBlockInfo->d_stMallocInfo + ulMyNbMalloc;
|
||
p_stMyMallocInfo->p_cBeginMalloc = (char *) p_vMemBlock;
|
||
p_stMyMallocInfo->p_cEndMalloc = ((char *) (p_uaSizeMalloc + ulSize - C_ucMallocFooterSize)) -1;
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
|
||
if ((char*)(p_uaSizeMalloc + *p_uaSizeMalloc)-1>=p_stMyBlockInfo->p_cMaxMem){
|
||
/* Managemement of the mem max information i order to be able to compute an estination of the optimzed version*/
|
||
p_stMyBlockInfo->p_cMaxMem=(char*)(p_uaSizeMalloc + *p_uaSizeMalloc)-1;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulCountMallocBeforeMaxMem = p_stMyBlockInfo->ulNbMalloc;
|
||
p_stMyBlockInfo->ulCountFreeBeforeMaxMem = p_stMyBlockInfo->uwNbFree;
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
}
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* clean the area of the new free. we use the variable p_uaBeforeSpaceFree for scan the memory & p_uaAfterfreespace for the end of the free area.*/
|
||
for ( p_uaBeforeFreeSpace = p_uaTmp + C_ucFreeHeaderSize,
|
||
p_uaAfterFreeSpace = p_uaBeforeFreeSpace + *p_uaTmp - C_ucFreeHeaderSize;/*lint !e644: p_uaTmp may not have been initialized*/
|
||
p_uaBeforeFreeSpace < p_uaAfterFreeSpace;
|
||
p_uaBeforeFreeSpace++
|
||
){
|
||
*p_uaBeforeFreeSpace = C_uaCleanKey;
|
||
}
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
|
||
/*not necessary
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
// count the real number of free
|
||
p_uaTmp = (unitAlloc*)p_stMyBlockInfo->p_cFirstFree;
|
||
for (uwI=0; *(p_uaTmp+1) != (unitAlloc)0; uwI++, p_uaTmp = (unitAlloc*) *(p_uaTmp+1));
|
||
p_stMyBlockInfo->uwNbFree = uwI;
|
||
#endif __DEBUG_MALLOC_MODE__
|
||
*/
|
||
|
||
Mmg_MLeaveCriticalSection();
|
||
return (p_vMemBlock);
|
||
}/* end of the if we reduce the allocation*/
|
||
|
||
else if (lDiffSize < 0){
|
||
/* we want to increase the allocation*/
|
||
/* --------*/
|
||
|
||
lDiffSize = -lDiffSize;/* in order to have a posive value meaning the increasing requested*/
|
||
|
||
if ( ( (p_uaBeforeFreeSpace +(*p_uaBeforeFreeSpace)) == p_uaSizeMalloc ) &&
|
||
((uaBeforeFreeSize = *p_uaBeforeFreeSpace) >= (unitAlloc)lDiffSize) )/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/
|
||
{
|
||
/* ^------- : size of the free space just before*/
|
||
|
||
/* we have enought space just before the allocation, with the free space begining at p_uaBeforeFreeSpace.*/
|
||
/* ------------- ------*/
|
||
/*==> We will move the malloc to the beginig of the free, in order to have the new free space after.*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __ADD_PLACE_FOR_DEBUG_INFORMATION__
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
/* test of overflow on a block*/
|
||
if ( ((char *) ( p_uaBeforeFreeSpace +ulSize
|
||
- ( p_stMyBlockInfo->ulNbMalloc) * C_ucDebugInformationLoss )/* memMax - the place for debug information of all the allocation.*/
|
||
)-1
|
||
>
|
||
(p_stMyBlockInfo->p_cEndBlock - (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize))) /* the end of the memory without the memory added for the debug information*/
|
||
)
|
||
{
|
||
#ifdef __ERROR_STRINGS__
|
||
unitAlloc *p_uaTheLastFreeSpace=p_uaBeforeFreeSpace;
|
||
|
||
Mmg_fn_v_PrintInfoMalloc("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
|
||
Mmg_fn_v_PrintInfoMalloc("State of the block before the reallocate problem:\n");
|
||
sprintf (szErrTxt, "in the request 'fn_p_vStaRealloc (0X%X, %d)'\n", p_vMemBlock, ulSize);
|
||
Mmg_fn_v_PrintInfoMalloc(szErrTxt);
|
||
Mmg_fn_v_PrintInfoMalloc("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
|
||
Mmg_M_PrintBlockStatisticWithModuleId(stCurrentModeInfo.ucModuleId, stCurrentModeInfo.ucMode);
|
||
Mmg_fn_v_PrintInfoMalloc("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");
|
||
|
||
while ((unitAlloc *)*(p_uaTheLastFreeSpace+1) != NULL)
|
||
p_uaTheLastFreeSpace = (unitAlloc *) *(p_uaTheLastFreeSpace+1);
|
||
|
||
sprintf (szErrTxt, "You have called reallocate for add %db,\n but the maximum allocation allowed is %db.\nSee the %s file in witch the state (before the request of allocation)of the block is printed",
|
||
(lDiffSize)<<C_uwShiftAllocSize,
|
||
((*p_uaTheLastFreeSpace)- ((p_stMyBlockInfo->ulMaxNbStaticMalloc*C_ucDebugInformationLoss)- ( p_stMyBlockInfo->ulNbMalloc * C_ucDebugInformationLoss)) + uaBeforeFreeSize) << C_uwShiftAllocSize,
|
||
C_szMmgLogFileName);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBLockFull, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBLockFull, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
Mmg_MLeaveCriticalSection();
|
||
return (NULL);
|
||
}
|
||
#endif/*__WARNING3_ERR_MMG__*/
|
||
#endif /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
|
||
|
||
*p_uaBeforeFreeSpace -= ((unitAlloc) lDiffSize);/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/ /* the content of the 'size' field is equal of the remain (not used for the allocation)*/
|
||
|
||
if (*p_uaBeforeFreeSpace < (unitAlloc) C_ucFreeHeaderSize) /*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/
|
||
{/*The remain of the free place is not enougth big to be managned*/
|
||
/* we affect all the place to the malloc. The 'old' free place if empty (everything is used for the malloc)*/
|
||
ulSize += (*p_uaBeforeFreeSpace);/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/
|
||
lDiffSize = lDiffSize + (long)(*p_uaBeforeFreeSpace);/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/
|
||
|
||
/* management of the first free*/
|
||
if (p_uaBeforeFreeSpace == p_uaBeforeBeforeFreeSpace){/* this is the first elt of the list*/
|
||
p_stMyBlockInfo->p_cFirstFree = (char *) p_uaAfterFreeSpace;
|
||
}
|
||
else {/*commom case*/
|
||
/* the free place before will become empty (everything is used for the malloc)*/
|
||
/* Management of the Free list : the 'next' field of the free place before the free place used, will be affect to the contents of the 'next' field of the free place used */
|
||
*(p_uaBeforeBeforeFreeSpace + 1) = (unitAlloc) p_uaAfterFreeSpace;/* !! a tester*/
|
||
}
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | Free || allocation | (...) |Free|*/
|
||
/* ^--p_uaBeforeBeforeFreespace ^---p_uaBeforeFreeSpace ^--p_uaSizeMalloc ^--p_uaAfterFreeSpace */
|
||
|
||
/*we have to move the begining of the allocation to p_uaBeforeFreeSpace*/
|
||
memmove (p_uaBeforeFreeSpace, p_uaSizeMalloc, (*p_uaSizeMalloc - C_ucMallocFooterSize)<< C_uwShiftAllocSize );/*lint !e668: Possibly passing a null pointer to function*/
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | allocation |++++++++++++++++++++++++| (...) |Free|*/
|
||
/* ^--p_uaBeforeBeforeFreespace ^---p_uaBeforeFreeSpace ^--p_uaAfterFreeSpace*/
|
||
/* with ++++: meanimg the new space added for the allocation*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->uwNbFree --; /*there is one less free*/
|
||
#endif /*__DEBUG_MALLOC_MODE__ */
|
||
|
||
|
||
/* store malloc Information (first part)*/
|
||
/*----------------------------------------*/
|
||
p_uaSizeMalloc = p_uaBeforeFreeSpace;
|
||
p_vMemBlock = (void *) (p_uaBeforeFreeSpace + C_ucMallocHeaderSize);/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/ /* the new adresse of the allocation */
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* clean the area of the new allocation. we use the variable p_uaBeforeSpaceFree for scan the memory & p_uaAfterfreespace for the end of the free area.*/
|
||
for ( p_uaBeforeFreeSpace = p_uaBeforeFreeSpace + *p_uaBeforeFreeSpace - C_ucMallocFooterSize,
|
||
p_uaAfterFreeSpace = p_uaBeforeFreeSpace + lDiffSize;/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/
|
||
p_uaBeforeFreeSpace < p_uaAfterFreeSpace;
|
||
p_uaBeforeFreeSpace++
|
||
)
|
||
{
|
||
*p_uaBeforeFreeSpace = C_uaCleanKey;
|
||
}
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
|
||
}
|
||
else {/* management of the remained place after the new alloction.*/
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | Free || allocation | (...) |Free|*/
|
||
/* ^--p_uaBeforeBeforeFreespace ^---p_uaBeforeFreeSpace ^--p_uaSizeMalloc ^--p_uaAfterFreeSpace */
|
||
|
||
/* definition of my new free space after allocation : p_uaTmp*/
|
||
/* -------*/
|
||
p_uaTmp = p_uaBeforeFreeSpace + *p_uaSizeMalloc + lDiffSize;/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/ /* point at the begining of the new free space*/
|
||
|
||
/*we have to move the begining of the allocation to p_uaBeforeFreeSpace*/
|
||
memmove (p_uaBeforeFreeSpace, p_uaSizeMalloc, (*p_uaSizeMalloc - C_ucMallocFooterSize)<< C_uwShiftAllocSize );/*lint !e668: Possibly passing a null pointer to function memmove*/
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | allocation ++++++++|| Free | (...) |Free|*/
|
||
/* ^--p_uaBeforeBeforeFreespace ^---p_uaBeforeFreeSpace ^--p_uaTmp ^--p_uaAfterFreeSpace*/
|
||
/* with ++++: meanimg the new space added for the allocation*/
|
||
|
||
/* set information of my new free space*/
|
||
*p_uaTmp = (unitAlloc) (uaBeforeFreeSize - (unsigned long)lDiffSize);/* set the 'size' field of the new free space = [size of my old free space just before] - [value of my increaseing allocation].*/
|
||
*(p_uaTmp +1) = (unitAlloc) p_uaAfterFreeSpace;/* set the 'next' field of my new free space*/
|
||
|
||
/*Management of the free list*/
|
||
if (p_uaBeforeBeforeFreeSpace == p_uaBeforeFreeSpace){/*first elt of the free list*/
|
||
p_stMyBlockInfo->p_cFirstFree = (char *) p_uaTmp;
|
||
}
|
||
else {/* commom case*/
|
||
*(p_uaBeforeBeforeFreeSpace +1) = (unitAlloc) p_uaTmp;/*the 'next' field of my free before the free space used have contain the value of the begining of my new free space*/
|
||
}
|
||
|
||
/* test if we have to join my new space free with the after free space.*/
|
||
if ((p_uaTmp + *p_uaTmp)== p_uaAfterFreeSpace){/*My new free is adjacent to the free space after. Then we have to join both.*/
|
||
/* general case:*/
|
||
/* | Free | ... | allocation ++++++++|| Free ||Free|*/
|
||
/* ^--p_uaBeforeBeforeFreespace ^---p_uaBeforeFreeSpace ^--p_uaTmp ^--p_uaAfterFreeSpace*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->uwNbFree --; /*there is one less free*/
|
||
#endif /*__DEBUG_MALLOC_MODE__ */
|
||
|
||
*p_uaTmp = *p_uaTmp + *p_uaAfterFreeSpace;/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/ /*the 'size' field of my new free space must be added with the content of 'size' field of my free space joined with*/
|
||
*(p_uaTmp+1) = *(p_uaAfterFreeSpace + 1);/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace))*/ /* the 'next' field of my new free space is equal to the 'next' field of my old free space after*/
|
||
}
|
||
|
||
/* store malloc Information (first part)*/
|
||
/*----------------------------------------*/
|
||
p_uaSizeMalloc = p_uaBeforeFreeSpace;
|
||
p_vMemBlock = (void *) (p_uaBeforeFreeSpace + C_ucMallocHeaderSize);/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/ /* the new adresse of the allocation */
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* clean the area of the new allocation. we use the variable p_uaBeforeSpaceFree for scan the memory & p_uaAfterfreespace for the end of the free area.*/
|
||
for ( p_uaBeforeFreeSpace = p_uaBeforeFreeSpace + *p_uaBeforeFreeSpace - C_ucMallocFooterSize,
|
||
p_uaAfterFreeSpace = p_uaBeforeFreeSpace + lDiffSize;/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/
|
||
p_uaBeforeFreeSpace < p_uaAfterFreeSpace;
|
||
p_uaBeforeFreeSpace++
|
||
){
|
||
*p_uaBeforeFreeSpace = C_uaCleanKey;
|
||
}
|
||
|
||
/* clean the area of the new free. we use the variable p_uaBeforeSpaceFree for scan the memory & p_uaAfterfreespace for the end of the free area.*/
|
||
for ( p_uaBeforeFreeSpace = p_uaTmp + C_ucFreeHeaderSize,
|
||
p_uaAfterFreeSpace = p_uaBeforeFreeSpace + *p_uaTmp - C_ucFreeHeaderSize;
|
||
p_uaBeforeFreeSpace < p_uaAfterFreeSpace;
|
||
p_uaBeforeFreeSpace++
|
||
){
|
||
*p_uaBeforeFreeSpace = C_uaCleanKey;
|
||
}
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
|
||
}
|
||
|
||
/* store malloc Information (continued)*/
|
||
/*---------------------------------------*/
|
||
*p_uaSizeMalloc = (unitAlloc)ulSize;/*lint !e613: Possible use of null pointer (p_uaSizeMalloc)*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
*(p_uaSizeMalloc + ulSize -1) = C_uaEndKey;/*lint !e613: Possible use of null pointer (p_uaSizeMalloc)*/
|
||
p_stMyBlockInfo->ulNbTotalRealloc++;
|
||
p_stMyMallocInfo = p_stMyBlockInfo->d_stMallocInfo + ulMyNbMalloc;
|
||
p_stMyMallocInfo->p_cBeginMalloc = (char *) p_vMemBlock;
|
||
p_stMyMallocInfo->p_cEndMalloc = ((char *) (p_uaSizeMalloc + ulSize - C_ucMallocFooterSize)) - 1;/*lint !e613: Possible use of null pointer (p_uaSizeMalloc)*/
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
if ((char*)(p_uaSizeMalloc + *p_uaSizeMalloc)-1>=p_stMyBlockInfo->p_cMaxMem)/*lint !e613: Possible use of null pointer (p_uaSizeMalloc)*/
|
||
{
|
||
/* Managemement of the mem max information i order to be able to compute an estination of the optimzed version*/
|
||
p_stMyBlockInfo->p_cMaxMem=(char*)(p_uaSizeMalloc + *p_uaSizeMalloc)-1;/*lint !e613: Possible use of null pointer (p_uaSizeMalloc)*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulCountMallocBeforeMaxMem = p_stMyBlockInfo->ulNbMalloc;
|
||
p_stMyBlockInfo->ulCountFreeBeforeMaxMem = p_stMyBlockInfo->uwNbFree;
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
}
|
||
|
||
/*not necessary
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
// count the real number of free
|
||
p_uaTmp = (unitAlloc*)p_stMyBlockInfo->p_cFirstFree;
|
||
for (uwI=0; *(p_uaTmp+1) != (unitAlloc)0; uwI++, p_uaTmp = (unitAlloc*) *(p_uaTmp+1));
|
||
p_stMyBlockInfo->uwNbFree = uwI;
|
||
#endif __DEBUG_MALLOC_MODE__
|
||
*/
|
||
Mmg_MLeaveCriticalSection();
|
||
return (p_vMemBlock);
|
||
}/* end of Yes, we have enought space before the allocation.*/
|
||
|
||
|
||
else if ( ( p_uaSizeMalloc + *p_uaSizeMalloc == p_uaAfterFreeSpace) &&
|
||
((p_uaBeforeFreeSpace +(*p_uaBeforeFreeSpace)) == p_uaSizeMalloc )&&
|
||
((uaBeforeFreeSize + (uaAfterFreeSize = *p_uaAfterFreeSpace)) >= (unitAlloc) lDiffSize) )/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace) & (p_uaAfterFreeSpace)*/
|
||
{
|
||
/* ^------- : size of the free space just after*/
|
||
|
||
/* We have not eougth space with the space just before.*/
|
||
/* But The space just before + just after is enougth big*/
|
||
/* ------------------------*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __ADD_PLACE_FOR_DEBUG_INFORMATION__
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
/* test of overflow on a block*/
|
||
if ( ((char *) ( p_uaBeforeFreeSpace +ulSize
|
||
- ( p_stMyBlockInfo->ulNbMalloc) * C_ucDebugInformationLoss )/* memMax - the place for debug information of all the allocation.*/
|
||
)-1
|
||
>
|
||
(p_stMyBlockInfo->p_cEndBlock - (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize))) /* the end of the memory without the memory added for the debug information*/
|
||
)
|
||
{
|
||
#ifdef __ERROR_STRINGS__
|
||
unitAlloc *p_uaTheLastFreeSpace=p_uaBeforeFreeSpace;
|
||
|
||
Mmg_fn_v_PrintInfoMalloc("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
|
||
Mmg_fn_v_PrintInfoMalloc("State of the block before the reallocate problem:\n");
|
||
sprintf (szErrTxt, "in the request 'fn_p_vStaRealloc (0X%X, %d)'\n", p_vMemBlock, ulSize);
|
||
Mmg_fn_v_PrintInfoMalloc(szErrTxt);
|
||
Mmg_fn_v_PrintInfoMalloc("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
|
||
Mmg_M_PrintBlockStatisticWithModuleId(stCurrentModeInfo.ucModuleId, stCurrentModeInfo.ucMode);
|
||
Mmg_fn_v_PrintInfoMalloc("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");
|
||
|
||
while ((unitAlloc *)*(p_uaTheLastFreeSpace+1) != NULL)
|
||
p_uaTheLastFreeSpace = (unitAlloc *) *(p_uaTheLastFreeSpace+1);
|
||
|
||
sprintf (szErrTxt, "You have called reallocate for add %db,\n but the maximum allocation allowed is %db.\nSee the %s file in witch the state (before the request of allocation)of the block is printed",
|
||
(lDiffSize)<<C_uwShiftAllocSize,
|
||
((*p_uaTheLastFreeSpace)- ((p_stMyBlockInfo->ulMaxNbStaticMalloc*C_ucDebugInformationLoss)- ( p_stMyBlockInfo->ulNbMalloc * C_ucDebugInformationLoss)) + uaBeforeFreeSize) << C_uwShiftAllocSize,
|
||
C_szMmgLogFileName);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBLockFull, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBLockFull, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
Mmg_MLeaveCriticalSection();
|
||
return (NULL);
|
||
}
|
||
#endif/*__WARNING3_ERR_MMG__*/
|
||
#endif /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
|
||
|
||
/* in order to save the adresse of the space free just after the free just after my allocation, the 'next' field of the free before my allocation will containhis adresse*/
|
||
p_uaAfterAfterFreeSpace = (unitAlloc *) (*(p_uaAfterFreeSpace+1));/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/
|
||
|
||
/* general case:*/
|
||
/* | Free |...| Free || allocation || Free | ... |Free|*/
|
||
/* ^--p_uaBeforeBeforeFreespace ^---p_uaBeforeFreeSpace ^--p_uaSizeMalloc ^--p_uaAfterFreeSpace ^--P_auAfterAfterSpace*/
|
||
|
||
|
||
*p_uaBeforeFreeSpace = (unitAlloc) (uaBeforeFreeSize + uaAfterFreeSize - (unitAlloc)lDiffSize);/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/ /* the content of the 'size' field is equal of the remain (not used for the allocation)*/
|
||
|
||
if (*p_uaBeforeFreeSpace < (unitAlloc) C_ucFreeHeaderSize) /*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/
|
||
{/*The remain of the free place is not enougth big to be managned*/
|
||
|
||
/* we affect all the place to the malloc. The 'old' free place if empty (everything is used for the malloc)*/
|
||
ulSize += (*p_uaBeforeFreeSpace);/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/
|
||
lDiffSize = lDiffSize + (long)(*p_uaBeforeFreeSpace);/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/
|
||
|
||
/* management of the first free*/
|
||
if (p_uaBeforeBeforeFreeSpace == p_uaBeforeFreeSpace){/* this is the first elt of the list*/
|
||
p_stMyBlockInfo->p_cFirstFree = (char *) *(p_uaAfterFreeSpace+1);/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/
|
||
}
|
||
else {/*commom case*/
|
||
/* the free place before will become empty (everything is used for the malloc)*/
|
||
/* Management of the Free list : the 'next' field of the free place before the free place used, will be affect to the contents of the 'next' field of the free place used */
|
||
*(p_uaBeforeBeforeFreeSpace + 1) = *(p_uaAfterFreeSpace+1);/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/
|
||
}
|
||
|
||
/* general case:*/
|
||
/* | Free |...| Free || allocation || Free | ... |Free|*/
|
||
/* ^--p_uaBeforeBeforeFreespace ^---p_uaBeforeFreeSpace ^--p_uaSizeMalloc ^--p_uaAfterFreeSpace ^--P_auAfterAfterSpace*/
|
||
|
||
/*we have to move the begining of the allocation to p_uaBeforeFreeSpace*/
|
||
memmove (p_uaBeforeFreeSpace, p_uaSizeMalloc, (*p_uaSizeMalloc - C_ucMallocFooterSize)<< C_uwShiftAllocSize );/*lint !e668: Possibly passing a null pointer to function memmove*/
|
||
|
||
/* general case:*/
|
||
/* | Free |...| allocation |+++++++++++++++++++++++++++++++++++++++++++++| ... |Free|*/
|
||
/* ^--p_uaBeforeBeforeFreespace ^---p_uaBeforeFreeSpace ^--P_auAfterAfterSpace*/
|
||
/* with ++++: meanimg the new space added for the allocation*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->uwNbFree -=2; /*there is two less frees*/
|
||
#endif /*__DEBUG_MALLOC_MODE__ */
|
||
|
||
/* store malloc Information (first part)*/
|
||
/*--------------------------------------*/
|
||
p_uaSizeMalloc = p_uaBeforeFreeSpace;
|
||
p_vMemBlock = (void *) (p_uaBeforeFreeSpace + C_ucMallocHeaderSize);/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/ /* the new adresse of the allocation */
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* clean the area of the new allocation. we use the variable p_uaBeforeSpaceFree for scan the memory & p_uaAfterfreespace for the end of the free area.*/
|
||
for ( p_uaBeforeFreeSpace = p_uaBeforeFreeSpace + *p_uaBeforeFreeSpace - C_ucMallocFooterSize,
|
||
p_uaAfterFreeSpace = p_uaBeforeFreeSpace + lDiffSize;/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/
|
||
p_uaBeforeFreeSpace < p_uaAfterFreeSpace;
|
||
p_uaBeforeFreeSpace++
|
||
){
|
||
*p_uaBeforeFreeSpace = C_uaCleanKey;
|
||
}
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
}
|
||
|
||
else {/* management of the remained place after the new alloction.*/
|
||
|
||
/* general case:*/
|
||
/* | Free |...| Free || allocation || Free | ... |Free|*/
|
||
/* ^--p_uaBeforeBeforeFreespace ^---p_uaBeforeFreeSpace ^--p_uaSizeMalloc ^--p_uaAfterFreeSpace ^--P_auAfterAfterSpace*/
|
||
|
||
/* definition of my new free space after allocation : p_uaTmp*/
|
||
/* -------*/
|
||
|
||
p_uaTmp = p_uaBeforeFreeSpace + *p_uaSizeMalloc + lDiffSize;/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/ /* point at the begining of the new free space*/
|
||
|
||
/*we have to move the begining of the allocation to p_uaBeforeFreeSpace*/
|
||
memmove (p_uaBeforeFreeSpace, p_uaSizeMalloc, (*p_uaSizeMalloc - C_ucMallocFooterSize)<< C_uwShiftAllocSize );/*lint !e668: Possibly passing a null pointer to function memmove*/
|
||
|
||
/* general case:*/
|
||
/* | Free |...| allocation |+++++++++++++++++++++++++++++| free remained | ... |Free|*/
|
||
/* ^--p_uaBeforeBeforeFreespace ^---p_uaBeforeFreeSpace ^--p_uaTmp ^--P_auAfterAfterSpace*/
|
||
/* with ++++: meanimg the new space added for the allocation*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->uwNbFree --; /*there is one less free*/
|
||
#endif /*__DEBUG_MALLOC_MODE__ */
|
||
/* set information of my new free space*/
|
||
*p_uaTmp = (unitAlloc) (uaBeforeFreeSize + uaAfterFreeSize - (unitAlloc)lDiffSize);/* set the 'size' field of the new free space = [size of my old free space just before and just after] - [value of my increaseing allocation].*/
|
||
*(p_uaTmp +1) = (unitAlloc) p_uaAfterAfterFreeSpace;/* set the 'next' field of my new free space */
|
||
|
||
/*Management of the free list*/
|
||
if (p_uaBeforeBeforeFreeSpace == p_uaBeforeFreeSpace){/*first elt of the free list*/
|
||
p_stMyBlockInfo->p_cFirstFree = (char *) p_uaTmp;
|
||
}
|
||
else {/* commom case*/
|
||
*(p_uaBeforeBeforeFreeSpace +1) = (unitAlloc) p_uaTmp;/*the 'next' field of my free before the free space used have contain the value of the begining of my new free space*/
|
||
}
|
||
|
||
/* store malloc Information (first part)*/
|
||
/*--------------------------------------*/
|
||
p_uaSizeMalloc = p_uaBeforeFreeSpace;
|
||
p_vMemBlock = (void *) (p_uaBeforeFreeSpace + C_ucMallocHeaderSize);/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/ /* the new adresse of the allocation*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* clean the area of the new allocation. we use the variable p_uaBeforeSpaceFree for scan the memory & p_uaAfterfreespace for the end of the free area.*/
|
||
for ( p_uaBeforeFreeSpace = p_uaBeforeFreeSpace + *p_uaBeforeFreeSpace - C_ucMallocFooterSize,
|
||
p_uaAfterFreeSpace = p_uaBeforeFreeSpace + lDiffSize;/*lint !e613: Possible use of null pointer (p_uaBeforeFreeSpace)*/
|
||
p_uaBeforeFreeSpace < p_uaAfterFreeSpace;
|
||
p_uaBeforeFreeSpace++
|
||
){
|
||
*p_uaBeforeFreeSpace = C_uaCleanKey;
|
||
}
|
||
|
||
/* clean the area of the new free. we use the variable p_uaBeforeSpaceFree for scan the memory & p_uaAfterfreespace for the end of the free area.*/
|
||
for ( p_uaBeforeFreeSpace = p_uaTmp + C_ucFreeHeaderSize,
|
||
p_uaAfterFreeSpace = p_uaBeforeFreeSpace + *p_uaTmp - C_ucFreeHeaderSize;
|
||
p_uaBeforeFreeSpace < p_uaAfterFreeSpace;
|
||
p_uaBeforeFreeSpace++
|
||
){
|
||
*p_uaBeforeFreeSpace = C_uaCleanKey;
|
||
}
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
}
|
||
|
||
/* store malloc Information (continued)*/
|
||
/*--------------------------------------*/
|
||
*p_uaSizeMalloc = (unitAlloc)ulSize;/*lint !e613: Possible use of null pointer (p_uaSizeMalloc)*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
*(p_uaSizeMalloc + ulSize -1) = C_uaEndKey;/*lint !e613: Possible use of null pointer (p_uaSizeMalloc)*/
|
||
p_stMyBlockInfo->ulNbTotalRealloc++;
|
||
p_stMyMallocInfo = p_stMyBlockInfo->d_stMallocInfo + ulMyNbMalloc;
|
||
p_stMyMallocInfo->p_cBeginMalloc = (char *) p_vMemBlock;
|
||
p_stMyMallocInfo->p_cEndMalloc = ((char *) (p_uaSizeMalloc + ulSize - C_ucMallocFooterSize)) - 1;/*lint !e613: Possible use of null pointer (p_uaSizeMalloc)*/
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
if ((char*)(p_uaSizeMalloc + *p_uaSizeMalloc)-1>=p_stMyBlockInfo->p_cMaxMem)/*lint !e613: Possible use of null pointer (p_uaSizeMalloc)*/
|
||
{
|
||
/* Managemement of the mem max information i order to be able to compute an estination of the optimzed version*/
|
||
p_stMyBlockInfo->p_cMaxMem=(char*)(p_uaSizeMalloc + *p_uaSizeMalloc)-1;/*lint !e613: Possible use of null pointer (p_uaSizeMalloc)*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulCountMallocBeforeMaxMem = p_stMyBlockInfo->ulNbMalloc;
|
||
p_stMyBlockInfo->ulCountFreeBeforeMaxMem = p_stMyBlockInfo->uwNbFree;
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
}
|
||
|
||
/* not necessary
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
// count the real number of free
|
||
p_uaTmp = (unitAlloc*)p_stMyBlockInfo->p_cFirstFree;
|
||
for (uwI=0; *(p_uaTmp+1) != (unitAlloc)0; uwI++, p_uaTmp = (unitAlloc*) *(p_uaTmp+1));
|
||
p_stMyBlockInfo->uwNbFree = uwI;
|
||
#endif __DEBUG_MALLOC_MODE__
|
||
*/
|
||
|
||
Mmg_MLeaveCriticalSection();
|
||
return (p_vMemBlock);
|
||
|
||
}/* end of Yes there are enougth space just before + just after*/
|
||
|
||
else if ( ( p_uaSizeMalloc + *p_uaSizeMalloc == p_uaAfterFreeSpace) &&
|
||
((uaAfterFreeSize = *p_uaAfterFreeSpace) >= (unitAlloc) lDiffSize) )/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace))*/
|
||
{
|
||
|
||
/* we have enought space just after the allocation, with the free space begining at p_uaAfterFreeSpace.*/
|
||
/* ------------- -----*/
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | Free | (...) | allocation || Free | (...) |free|*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^-- p_vMemBlock ^-- p_uaAfterFree*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __ADD_PLACE_FOR_DEBUG_INFORMATION__
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
/* test of overflow on a block*/
|
||
if ( ((char *) ( p_uaSizeMalloc +ulSize
|
||
- ( p_stMyBlockInfo->ulNbMalloc ) * C_ucDebugInformationLoss )/* memMax - the place for debug information of all the allocation.*/
|
||
)-1
|
||
>
|
||
(p_stMyBlockInfo->p_cEndBlock - (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize))) /* the end of the memory without the memory added for the debug information*/
|
||
)
|
||
{
|
||
#ifdef __ERROR_STRINGS__
|
||
unitAlloc *p_uaTheLastFreeSpace=p_uaBeforeFreeSpace;
|
||
|
||
Mmg_fn_v_PrintInfoMalloc("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
|
||
Mmg_fn_v_PrintInfoMalloc("State of the block before the reallocate problem:\n");
|
||
sprintf (szErrTxt, "in the request 'fn_p_vStaRealloc (0X%X, %d)'\n", p_vMemBlock, ulSize);
|
||
Mmg_fn_v_PrintInfoMalloc(szErrTxt);
|
||
Mmg_fn_v_PrintInfoMalloc("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
|
||
Mmg_M_PrintBlockStatisticWithModuleId(stCurrentModeInfo.ucModuleId, stCurrentModeInfo.ucMode);
|
||
Mmg_fn_v_PrintInfoMalloc("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");
|
||
|
||
while ((unitAlloc *)*(p_uaTheLastFreeSpace+1) != NULL)
|
||
p_uaTheLastFreeSpace = (unitAlloc *) *(p_uaTheLastFreeSpace+1);
|
||
|
||
sprintf (szErrTxt, "You have called reallocate for add %db,\n but the maximum allocation allowed is %db.\nSee the %s file in witch the state (before the request of allocation)of the block is printed",
|
||
(lDiffSize)<<C_uwShiftAllocSize,
|
||
((*p_uaTheLastFreeSpace)- ((p_stMyBlockInfo->ulMaxNbStaticMalloc*C_ucDebugInformationLoss)- ( p_stMyBlockInfo->ulNbMalloc * C_ucDebugInformationLoss))) << C_uwShiftAllocSize,
|
||
C_szMmgLogFileName);
|
||
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBLockFull, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBLockFull, NULL, ucChannel);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
Mmg_MLeaveCriticalSection();
|
||
return (NULL);
|
||
}
|
||
#endif/*__WARNING3_ERR_MMG__*/
|
||
#endif/*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
|
||
|
||
*p_uaAfterFreeSpace -= ((unitAlloc) lDiffSize);/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/ /* the content of the 'size' field is equal of the remain (not used for the allocation)*/
|
||
|
||
if (*p_uaAfterFreeSpace < (unitAlloc) C_ucFreeHeaderSize) /*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/
|
||
{/*The remain of the free place is not enougth big to be managned*/
|
||
/* we affect all the place to the malloc. The 'old' free place if empty (everything is used for the malloc)*/
|
||
|
||
ulSize += (*p_uaAfterFreeSpace);/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/
|
||
lDiffSize = lDiffSize + (long)(*p_uaAfterFreeSpace);/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | Free | (...) | allocation |+++++++++++++++| (...) |free|*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^-- p_vMemBlock ^-- p_uaAfterFree*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->uwNbFree --; /*there is one less free*/
|
||
#endif /*__DEBUG_MALLOC_MODE__ */
|
||
|
||
/* management of the first free*/
|
||
if (p_uaAfterFreeSpace == p_uaBeforeFreeSpace){/* this is the first elt of the list*/
|
||
p_stMyBlockInfo->p_cFirstFree = (char *) *(p_uaAfterFreeSpace+1);/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/
|
||
}
|
||
else {/* commom case*/
|
||
/* the free place after will become empty (everything is used for the malloc)*/
|
||
/* Management of the Free list : the 'next' field of the free place before the free place used, will be affect to the contents of the 'next' field of the free place used */
|
||
*(p_uaBeforeFreeSpace + 1) = *(p_uaAfterFreeSpace + 1);/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace) & (p_uaBeforeFreeSpace)*/
|
||
}
|
||
}
|
||
else {/* management of the remained place after the new alloction.*/
|
||
|
||
p_uaTmp = (unitAlloc *) *(p_uaAfterFreeSpace + 1);/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/ /* save the next field of my old free after my allocation*/
|
||
*(p_uaAfterFreeSpace + lDiffSize) = *p_uaAfterFreeSpace;/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/ /* set the 'size' field of remained space at the rigth place*/
|
||
*(p_uaAfterFreeSpace + lDiffSize + 1) = (unitAlloc) p_uaTmp;/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/ /* set the 'next' field of remained space at the rigth place*/
|
||
|
||
/* general case:*/
|
||
/* | Free | ... | Free | (...) | allocation |+++++| Free | (...) |free|*/
|
||
/* ^-- p_uaBeforeBeforeFree ^-- p_uaBeforeFree ^-- p_vMemBlock ^-- p_uaAfterFree*/
|
||
|
||
/* management of the first free*/
|
||
if (p_uaBeforeFreeSpace == p_uaAfterFreeSpace){/* this is the first elt of the list*/
|
||
p_stMyBlockInfo->p_cFirstFree = (char *) (p_uaAfterFreeSpace + lDiffSize);/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/
|
||
}
|
||
else {/* commom case.*/
|
||
*(p_uaBeforeFreeSpace+1) = (unitAlloc) (p_uaAfterFreeSpace + lDiffSize);/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/ /*managment of the free list. The 'next' field of free space just before the allocation have chage.*/
|
||
}
|
||
}
|
||
|
||
/* store malloc Information*/
|
||
/*--------------------------*/
|
||
*p_uaSizeMalloc = (unitAlloc)ulSize;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
*(p_uaSizeMalloc + ulSize -1) = C_uaEndKey;
|
||
p_stMyBlockInfo->ulNbTotalRealloc++;
|
||
p_stMyMallocInfo = p_stMyBlockInfo->d_stMallocInfo + ulMyNbMalloc;
|
||
p_stMyMallocInfo->p_cEndMalloc = ((char *) (p_uaSizeMalloc + ulSize - C_ucMallocFooterSize)) - 1;
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
if ((char*)(p_uaSizeMalloc + *p_uaSizeMalloc)-1>=p_stMyBlockInfo->p_cMaxMem)
|
||
{
|
||
/* Managemement of the mem max information i order to be able to compute an estination of the optimzed version*/
|
||
p_stMyBlockInfo->p_cMaxMem=(char*)(p_uaSizeMalloc + *p_uaSizeMalloc)-1;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulCountMallocBeforeMaxMem = p_stMyBlockInfo->ulNbMalloc;
|
||
p_stMyBlockInfo->ulCountFreeBeforeMaxMem = p_stMyBlockInfo->uwNbFree;
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
}
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* clean the area of the new allocation. we use the variable p_uaBeforeSpaceFree for scan the memory & p_uaAfterfreespace for the end of the free area.*/
|
||
for ( p_uaBeforeFreeSpace = p_uaAfterFreeSpace - C_ucMallocFooterSize,
|
||
p_uaAfterFreeSpace = p_uaBeforeFreeSpace + lDiffSize;/*lint !e613: Possible use of null pointer (p_uaAfterFreeSpace)*/
|
||
p_uaBeforeFreeSpace < p_uaAfterFreeSpace;
|
||
p_uaBeforeFreeSpace++
|
||
)
|
||
{
|
||
*p_uaBeforeFreeSpace = C_uaCleanKey;
|
||
}
|
||
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
|
||
/*not necessary
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
// count the real number of free
|
||
p_uaTmp = (unitAlloc*)p_stMyBlockInfo->p_cFirstFree;
|
||
for (uwI=0; *(p_uaTmp+1) != (unitAlloc)0; uwI++, p_uaTmp = (unitAlloc*) *(p_uaTmp+1));
|
||
p_stMyBlockInfo->uwNbFree = uwI;
|
||
#endif __DEBUG_MALLOC_MODE__
|
||
*/
|
||
|
||
Mmg_MLeaveCriticalSection();
|
||
return (p_vMemBlock);
|
||
}/* end of Yes, we have enought space after the allocation.*/
|
||
|
||
else{ /* There are no space around the allocation*/
|
||
/* ----------------*/
|
||
|
||
ulSize -= (C_ucMallocHeaderSize + C_ucMallocFooterSize); /* place for information(s) to manage the allocation place*/
|
||
ulSize <<= C_uwShiftAllocSize;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulNbTotalMalloc--;/* this is not a real malloc requested, then we don't have to increase the counter.*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
p_uaTmp = (unitAlloc *) fn_p_vStaAlloc (ulSize, ucChannel);
|
||
|
||
if (p_uaTmp != NULL) {
|
||
memcpy ((void *) p_uaTmp, p_vMemBlock, (*p_uaSizeMalloc - C_ucMallocFooterSize - C_ucMallocHeaderSize)<< C_uwShiftAllocSize);
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulNbTotalFree--;/* this is not a real free requested, then we don't have to increase the counter.*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
fn_vStaFree (p_vMemBlock, ucChannel);
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* the free have move up all the elt after the freed malloc of the Malloc info Table*/
|
||
/* then we have to use the last elt of the malloc info table*/
|
||
ulMyNbMalloc= (unsigned short) (p_stMyBlockInfo->ulNbMalloc -1);
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
|
||
|
||
/* store malloc Information*/
|
||
/*--------------------------*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulNbTotalRealloc++;
|
||
p_vMemBlock = p_uaTmp;
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
p_uaSizeMalloc = p_uaTmp - C_ucMallocHeaderSize;
|
||
if ((char*)(p_uaSizeMalloc + *p_uaSizeMalloc)-1>=p_stMyBlockInfo->p_cMaxMem)
|
||
{
|
||
/* Managemement of the mem max information i order to be able to compute an estination of the optimzed version*/
|
||
p_stMyBlockInfo->p_cMaxMem=(char*)(p_uaSizeMalloc + *p_uaSizeMalloc)-1;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_stMyBlockInfo->ulCountMallocBeforeMaxMem = p_stMyBlockInfo->ulNbMalloc;
|
||
p_stMyBlockInfo->ulCountFreeBeforeMaxMem = p_stMyBlockInfo->uwNbFree;
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
}
|
||
}/* end of the if(p_uaTmp != NULL)*/
|
||
/* not necessary
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
// count the real number of free
|
||
p_uaTmp = (unitAlloc*)p_stMyBlockInfo->p_cFirstFree;
|
||
for (uwI=0; *(p_uaTmp+1) != (unitAlloc)0; uwI++, p_uaTmp = (unitAlloc*) *(p_uaTmp+1));
|
||
p_stMyBlockInfo->uwNbFree = uwI;
|
||
p_uaTmp = p_vMemBlock;
|
||
#endif __DEBUG_MALLOC_MODE__
|
||
*/
|
||
Mmg_MLeaveCriticalSection();
|
||
return ((void *) p_uaTmp);
|
||
}/* There are no space around the allocation*/
|
||
}/* we want to increase the alocation*/
|
||
|
||
/* not necessary
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
// count the real number of free
|
||
p_uaTmp = (unitAlloc*)p_stMyBlockInfo->p_cFirstFree;
|
||
for (uwI=0; *(p_uaTmp+1) != (unitAlloc)0; uwI++, p_uaTmp = (unitAlloc*) *(p_uaTmp+1));
|
||
p_stMyBlockInfo->uwNbFree = uwI;
|
||
#endif __DEBUG_MALLOC_MODE__
|
||
*/
|
||
Mmg_MLeaveCriticalSection();
|
||
return (p_vMemBlock); /* nothing done*/
|
||
}/* of the elese b_ucFound is set*/
|
||
}/*fn_p_vStaRealloc */
|
||
/* ================*/
|
||
|
||
/* ##-###########################
|
||
## DYNAMYC & STATIC MODE
|
||
## General kernel of allocation, reallocation & free
|
||
############################## */
|
||
|
||
#ifdef __DYNAMIC_MALLOC_ALLOWED__
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : fn_p_vGenAlloc
|
||
DESCRIPTION : Allocate a memory zone in the channel using the corresponding Mode
|
||
INPUT : Size
|
||
Channel Id
|
||
OUTPUT : Pointeur on the zone allocated
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void * fn_p_vGenAlloc (unsigned long ulSize, unsigned char ucChannel){
|
||
/* ===============*/
|
||
|
||
#ifdef USE_PROFILER
|
||
#ifndef U64
|
||
MMG_fn_vRegisterMemoryAllocation (ucChannel , ulSize);
|
||
#endif
|
||
#endif
|
||
#if defined(U64) && !defined(RETAIL)
|
||
if(ulSize<=0)
|
||
{
|
||
osSyncPrintf("Try to alloc %ld bytes!!\n",ulSize);
|
||
ASM_BREAK;
|
||
}
|
||
#endif /* U64 && !RETAIL */
|
||
if (Mmg_M_ucIsStaticMode(ucChannel))
|
||
{
|
||
#ifdef SHOW_RAST_MEM
|
||
tdstBlockInfoPriv * p_stMyBlockInfo = (tdstBlockInfoPriv *) g_d_stCurrentModeInfo[ucChannel].p_vTdstBlockInfoOrTdstDynInfo;
|
||
if(p_stMyBlockInfo->p_cFirstFree != C_FirstFreeValueForBlockWithoutFree)
|
||
{
|
||
unsigned long ul=ulSize;
|
||
|
||
Mmg_M_BigBoundSize (ul, C_uwAllocSize);
|
||
ul >>= C_uwShiftAllocSize;
|
||
ul += (C_ucMallocHeaderSize + C_ucMallocFooterSize);
|
||
ul <<= C_uwShiftAllocSize;
|
||
|
||
RM_g_ulRealSize+=ul;
|
||
|
||
#ifdef SHOW_RAST_MEM_FOR_DESIGNER
|
||
RMFD_g_ulRealSize[RMFD_g_tdeRastMemSuperType]+=ul;
|
||
#endif /* SHOW_RAST_MEM_FOR_DESIGNER */
|
||
}
|
||
else
|
||
{
|
||
unsigned long ul=ulSize;
|
||
#ifdef D_CheckSystemForBlockWithoutFree
|
||
tdstInformationHeaderOfBolckWithoutFree *p_stInfoHeaderBolck=(tdstInformationHeaderOfBolckWithoutFree *)p_stMyBlockInfo->p_cBeginBlock;
|
||
if(p_stInfoHeaderBolck->ucMode & C_Check_AlignementFlag)
|
||
{
|
||
Mmg_M_BigBoundSize (ul, p_stInfoHeaderBolck->ucAlignment);
|
||
}
|
||
#endif /* D_CheckSystemForBlockWithoutFree */
|
||
RM_g_ulRealSize+=ul;
|
||
|
||
#ifdef SHOW_RAST_MEM_FOR_DESIGNER
|
||
RMFD_g_ulRealSize[RMFD_g_tdeRastMemSuperType]+=ul;
|
||
#endif /* SHOW_RAST_MEM_FOR_DESIGNER */
|
||
}
|
||
RM_g_ulAskedSize+=ulSize;
|
||
|
||
#ifdef SHOW_RAST_MEM_FOR_DESIGNER
|
||
RMFD_g_ulAskedSize[RMFD_g_tdeRastMemSuperType]+=ulSize;
|
||
#endif /* SHOW_RAST_MEM_FOR_DESIGNER */
|
||
|
||
#endif /* SHOW_RAST_MEM */
|
||
|
||
#if !defined(RETAIL) && !defined(U64)
|
||
/* Il we must save binary datas, set the allocated mem to 0,*/
|
||
/* to avoid wrong pointer detection */
|
||
if( MMG_g_bResetMemOnAllocation )
|
||
{
|
||
char *p_cAllocatedMem = fn_p_vStaAlloc (ulSize, ucChannel);
|
||
if( p_cAllocatedMem )
|
||
{
|
||
Mmg_M_BigBoundSize (ulSize, C_uwAllocSize);
|
||
memset( p_cAllocatedMem, 0, ulSize );
|
||
}
|
||
return p_cAllocatedMem;
|
||
}
|
||
else
|
||
#endif /* ! RETAIL && ! U64*/
|
||
return (fn_p_vStaAlloc (ulSize, ucChannel));
|
||
}
|
||
else
|
||
{
|
||
#ifdef SHOW_RAST_MEM
|
||
unsigned long ul=ulSize;
|
||
|
||
Mmg_M_BigBoundSize (ul, C_uwAllocSize);
|
||
ul >>= C_uwShiftAllocSize;
|
||
ul += (C_ucMallocHeaderSize + C_ucMallocFooterSize);
|
||
ul <<= C_uwShiftAllocSize;
|
||
|
||
RM_g_ulRealSize+=ul;
|
||
|
||
#ifdef SHOW_RAST_MEM_FOR_DESIGNER
|
||
RMFD_g_ulRealSize[RMFD_g_tdeRastMemSuperType]+=ul;
|
||
#endif /* SHOW_RAST_MEM_FOR_DESIGNER */
|
||
|
||
RM_g_ulAskedSize+=ulSize;
|
||
|
||
#ifdef SHOW_RAST_MEM_FOR_DESIGNER
|
||
RMFD_g_ulAskedSize[RMFD_g_tdeRastMemSuperType]+=ulSize;
|
||
#endif /* SHOW_RAST_MEM_FOR_DESIGNER */
|
||
|
||
#endif /* SHOW_RAST_MEM */
|
||
return (fn_p_vDynAlloc (ulSize, ucChannel));
|
||
}
|
||
}/* end of fn_p_vAlloc*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : fn_p_vGenFree
|
||
DESCRIPTION : Free a memory zone in the channel using the corresponding Mode
|
||
INPUT : Pointer on the zone allocated
|
||
Channel Id
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void fn_vGenFree (void *p_vMemBlock, unsigned char ucChannel){
|
||
/* ===========*/
|
||
#ifdef USE_PROFILER
|
||
#ifndef U64
|
||
MMG_fn_vRegisterMemoryFree (ucChannel , p_vMemBlock);
|
||
#endif
|
||
#endif
|
||
if (Mmg_M_ucIsStaticMode(ucChannel))
|
||
fn_vStaFree (p_vMemBlock, ucChannel);
|
||
else
|
||
fn_vDynFree (p_vMemBlock, ucChannel);
|
||
}/*end of fn_vFree */
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : fn_p_vGenRealloc
|
||
DESCRIPTION : Reallocate a memory zone in the channel using the corresponding Mode
|
||
INPUT : Pointer on the zone allocated
|
||
Size
|
||
Channel Id
|
||
OUTPUT : Pointeur on the new zone allocated
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void * fn_p_vGenRealloc (void *p_vMemBlock, unsigned long ulSize, unsigned char ucChannel){
|
||
/* ================*/
|
||
if (Mmg_M_ucIsStaticMode(ucChannel))
|
||
#if !defined(RETAIL) && !defined(U64)
|
||
/* Il we must save binary datas, set the allocated mem to 0,*/
|
||
/* to avoid wrong pointer detection */
|
||
if( MMG_g_bResetMemOnAllocation )
|
||
{
|
||
unsigned long ulPrevSize = *((unsigned long *)p_vMemBlock-1);
|
||
p_vMemBlock = fn_p_vStaRealloc (p_vMemBlock, ulSize, ucChannel);
|
||
if( p_vMemBlock )
|
||
{
|
||
long lSizeDiff = *((unsigned long *)p_vMemBlock-1) - ulPrevSize;
|
||
if( lSizeDiff > 0 )
|
||
memset( (unsigned long *)p_vMemBlock+ulPrevSize-1, 0, lSizeDiff << C_uwShiftAllocSize );
|
||
}
|
||
return p_vMemBlock;
|
||
}
|
||
else
|
||
#endif /* ! RETAIL && ! U64*/
|
||
return (fn_p_vStaRealloc (p_vMemBlock, ulSize, ucChannel));
|
||
else
|
||
return (fn_p_vDynRealloc (p_vMemBlock, ulSize, ucChannel));
|
||
}/* end of fn_p_vRealloc*/
|
||
|
||
#endif /* __DYNAMIC_MALLOC_ALLOWED__*/
|
||
|
||
/* ##-###########################
|
||
## Management of Test
|
||
############################## */
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_ulmsize
|
||
DESCRIPTION : return the size in byte used for the allocation of a zone
|
||
INPUT : Pointer on the allocated zone
|
||
OUTPUT : Real size of the zone (including the management data)
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
unsigned long Mmg_fn_ulmsize(void *p_vMemBlock){
|
||
unitAlloc * p_uaPtr;
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#if defined(__ERROR_STRINGS__) && defined(__FATAL_ERR_MMG__)
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
#endif /*defined(__ERROR_STRINGS__) && defined(__FATAL_ERR_MMG__)*/
|
||
|
||
p_uaPtr = (unitAlloc *)p_vMemBlock;
|
||
p_uaPtr--;
|
||
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (*p_uaPtr != (unitAlloc)C_uaBeginKey){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf(szErrTxt,"Yes,at the address 0X%X there is the value 0X%X\nIt's quite different to the expected 'C_uaBeginKey' value (0X%X)", p_uaPtr, (unitAlloc)*p_uaPtr, C_uaBeginKey);
|
||
Mmg_M_UpdateLastError (E_uwMmgPbOverflowBefore, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError (E_uwMmgPbOverflowBefore, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
p_uaPtr = ((unitAlloc *)p_vMemBlock) + *(p_uaPtr-1)/*size*/ - C_ucMallocHeaderSize - C_ucMallocFooterSize;
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (*p_uaPtr != (unitAlloc) C_uaEndKey){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf(szErrTxt,"Yes,at the address 0X%X there is the value 0X%X\nIt's quite different to the expected 'C_uaEndKey' value (0X%X)", p_uaPtr, (unitAlloc)*p_uaPtr, C_uaEndKey);
|
||
Mmg_M_UpdateLastError (E_uwMmgPbOverflowAfter, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError (E_uwMmgPbOverflowAfter, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
|
||
p_uaPtr = (unitAlloc *)p_vMemBlock;
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_uaPtr-=2;
|
||
#else /*__DEBUG_MALLOC_MODE__*/
|
||
p_uaPtr--;
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
return ((unsigned long) ((*p_uaPtr)<< C_uwShiftAllocSize));
|
||
}/* end of Mmg_fn_ulmsize*/
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vTestMallocIntegrityAt
|
||
DESCRIPTION : Check the integrity of an allocated zone (only in debug mode)
|
||
INPUT : Pointer on the block structure
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_vTestMallocIntegrityAt(void *p_vMemBlock)
|
||
{
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
unitAlloc * p_uaPtr;
|
||
#if defined(__ERROR_STRINGS__) && defined(__FATAL_ERR_MMG__)
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
#endif /*defined(__ERROR_STRINGS__) && defined(__FATAL_ERR_MMG__)*/
|
||
|
||
p_uaPtr = (unitAlloc *)p_vMemBlock;
|
||
p_uaPtr--;
|
||
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (*p_uaPtr != (unitAlloc)C_uaBeginKey){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf(szErrTxt,"Yes,at the address 0X%X there is the value 0X%X\nIt's quite different to the expected 'C_uaBeginKey' value (0X%X)", p_uaPtr, (unitAlloc)*p_uaPtr, C_uaBeginKey);
|
||
Mmg_M_UpdateLastError (E_uwMmgPbOverflowBefore, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError (E_uwMmgPbOverflowBefore, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
p_uaPtr = ((unitAlloc *)p_vMemBlock) + *(p_uaPtr-1)/*size*/ - C_ucMallocHeaderSize - C_ucMallocFooterSize;
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (*p_uaPtr != (unitAlloc) C_uaEndKey){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf(szErrTxt,"Yes,at the address 0X%X there is the value 0X%X\nIt's quite different to the expected 'C_uaEndKey' value (0X%X)", p_uaPtr, (unitAlloc)*p_uaPtr, C_uaEndKey);
|
||
Mmg_M_UpdateLastError (E_uwMmgPbOverflowAfter, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError (E_uwMmgPbOverflowAfter, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}/* end of Mmg_fn_vTestMallocIntegrityAt*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vTestMalloc
|
||
DESCRIPTION : Check integrity for all allocation (only in debug mode)
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_vTestMalloc()
|
||
/*///////////////////*/
|
||
{
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
unsigned char ucBlockId;
|
||
unsigned char ucModuleId;
|
||
unsigned long ulNumMalloc;
|
||
tdstBlockInfoPriv *p_stMyBlockInfo;
|
||
tdstMallocInfo *p_stMyMallocInfo;
|
||
unitAlloc * p_uaPtr;
|
||
tdstBlockInfoPriv *a_stMyBlockInfo;
|
||
#ifdef __DYNAMIC_MALLOC_ALLOWED__
|
||
tdstDynInfo *p_stMyDynInfo;
|
||
#endif /*__DYNAMIC_MALLOC_ALLOWED__*/
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
#endif /*__ERROR_STRINGS__*/
|
||
|
||
#ifdef __DYNAMIC_MALLOC_ALLOWED__
|
||
for (ucModuleId=0; ucModuleId < g_ucErmNbOfModule; ucModuleId++){
|
||
p_stMyDynInfo = g_d_p_stMmgModuleDynInfo[ucModuleId];
|
||
if (p_stMyDynInfo != NULL){
|
||
for (ulNumMalloc=0; ulNumMalloc < p_stMyDynInfo->ulNbDynamicMalloc; ulNumMalloc++){
|
||
p_stMyMallocInfo = (p_stMyDynInfo->d_stDynamicMallocInfo) + ulNumMalloc;
|
||
|
||
p_uaPtr = (unitAlloc *)(p_stMyMallocInfo->p_cBeginMalloc);
|
||
p_uaPtr--;
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (*p_uaPtr != (unitAlloc)C_uaBeginKey){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf(szErrTxt,"Yes,at the address 0X%X there is the value 0X%X\nIt's quite different to the expected 'C_uaBeginKey' value (0X%X)", p_uaPtr, (unitAlloc)*p_uaPtr, C_uaBeginKey);
|
||
/*Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbDynOverflowBefore, szErrTxt, ucChannel);*/
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(ucModuleId, E_ucDynamic, E_uwMmgPbDynOverflowBefore, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(ucModuleId, E_ucDynamic, E_uwMmgPbDynOverflowBefore, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
p_uaPtr = (unitAlloc *)(p_stMyMallocInfo->p_cEndMalloc + 1);
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (*p_uaPtr != (unitAlloc) C_uaEndKey){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf(szErrTxt,"Yes,at the address 0X%X there is the value 0X%X\nIt's quite different to the expected 'C_uaEndKey' value (0X%X)", p_uaPtr, (unitAlloc)*p_uaPtr, C_uaEndKey);
|
||
/*Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbDynOverflowAfter, szErrTxt, ucChannel);*/
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(ucModuleId, E_ucDynamic, E_uwMmgPbDynOverflowAfter, szErrTxt
|
||
);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(ucModuleId, E_ucDynamic, E_uwMmgPbDynOverflowAfter, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
}/* for */
|
||
} /*if not NULL*/
|
||
}/* end of for module*/
|
||
#endif /*__DYNAMIC_MALLOC_ALLOWED__*/
|
||
|
||
for (ucModuleId=0; ucModuleId < g_ucErmNbOfModule; ucModuleId++){
|
||
a_stMyBlockInfo = g_a_p_stMmgModuleBlocksInfo[ucModuleId];
|
||
if ((a_stMyBlockInfo == NULL) || (a_stMyBlockInfo->p_cFirstFree == C_FirstFreeValueForBlockWithoutFree )) continue;
|
||
else{
|
||
for (ucBlockId=0; ucBlockId<g_a_ucBlocksNbInModule[ucModuleId];ucBlockId++){
|
||
p_stMyBlockInfo = a_stMyBlockInfo + ucBlockId;
|
||
if (p_stMyBlockInfo->p_cBeginBlock == C_p_cBlockNotValidKey) break;/* the block is not initialized*/
|
||
if (
|
||
(p_stMyBlockInfo->p_cBeginBlock == NULL) ||
|
||
(p_stMyBlockInfo->p_cEndBlock == NULL)||
|
||
(p_stMyBlockInfo->p_cBeginBlock > p_stMyBlockInfo->p_cEndBlock)
|
||
)
|
||
{
|
||
#ifdef __ERROR_STRINGS__
|
||
if (p_stMyBlockInfo->p_cBeginBlock == NULL)
|
||
sprintf(szErrTxt, "p_cBeginBlock == NULL\n");
|
||
else if(p_stMyBlockInfo->p_cEndBlock == NULL)
|
||
sprintf(szErrTxt, "p_cEndBlock == NULL\n");
|
||
else if (p_stMyBlockInfo->p_cBeginBlock > p_stMyBlockInfo->p_cEndBlock)
|
||
sprintf(szErrTxt, "p_cBeginBlock > p_cEndBlock\n");
|
||
/*Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbInvalidMallocInfo, szErrTxt, ucChannel);*/
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(ucModuleId, ucBlockId, E_uwMmgPbInvalidMallocInfo, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(ucModuleId, ucBlockId, E_uwMmgPbInvalidMallocInfo, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
break;
|
||
}
|
||
Mmg_fn_vTestNbFree(ucModuleId, ucBlockId, p_stMyBlockInfo);/*!! yob !!a virer just pour tester la validite de uwNbFree !! yob !!*/
|
||
|
||
/* test of the allocation size*/
|
||
#ifdef __ADD_PLACE_FOR_DEBUG_INFORMATION__
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
if ( (p_stMyBlockInfo->p_cMaxMem
|
||
- ((( p_stMyBlockInfo->ulCountMallocBeforeMaxMem) * (C_ucDebugInformationLoss<<C_uwShiftAllocSize) )))/* memMax - the place for debug information of all the allocation.*/
|
||
>
|
||
(p_stMyBlockInfo->p_cEndBlock - (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize))) /* the end of the memory without the memory added for the debug information*/
|
||
)
|
||
{
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt,
|
||
"The Maximun adresse is 0X%X occured (this append with %d allocations before) is to hight\nthis problem come from testMalloc function !\nPlease warn the developper of Mmg to fix the Bug\n",
|
||
p_stMyBlockInfo->p_cMaxMem,
|
||
p_stMyBlockInfo->ulCountMallocBeforeMaxMem);
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(ucModuleId, ucBlockId, E_uwMmgPbBLockFull, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(ucModuleId, ucBlockId, E_uwMmgPbBLockFull, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif/*__WARNING3_ERR_MMG__*/
|
||
#endif /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
|
||
for (ulNumMalloc=0; ulNumMalloc < p_stMyBlockInfo->ulNbMalloc; ulNumMalloc++){
|
||
p_stMyMallocInfo = (p_stMyBlockInfo->d_stMallocInfo)+ulNumMalloc;
|
||
|
||
p_uaPtr = (unitAlloc *)(p_stMyMallocInfo->p_cBeginMalloc);
|
||
p_uaPtr--;
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (*p_uaPtr != (unitAlloc)C_uaBeginKey){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf(szErrTxt,"Yes,at the address 0X%X there is the value 0X%X\nIt's quite different to the expected 'C_uaBeginKey' value (0X%X)", p_uaPtr, (unitAlloc)*p_uaPtr, C_uaBeginKey);
|
||
/*Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbStaOverflowBefore, szErrTxt, ucChannel);*/
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(ucModuleId, ucBlockId, E_uwMmgPbStaOverflowBefore, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(ucModuleId, ucBlockId, E_uwMmgPbStaOverflowBefore, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
p_uaPtr = (unitAlloc *)(p_stMyMallocInfo->p_cEndMalloc + 1);
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (*p_uaPtr != (unitAlloc) C_uaEndKey){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf(szErrTxt,"Yes,at the address 0X%X there is the value 0X%X\nIt's quite different to the expected 'C_uaEndKey' value (0X%X)", p_uaPtr, (unitAlloc)*p_uaPtr, C_uaEndKey);
|
||
/*Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbStaOverflowAfter, szErrTxt, ucChannel);*/
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(ucModuleId, ucBlockId, E_uwMmgPbStaOverflowAfter, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(ucModuleId, ucBlockId, E_uwMmgPbStaOverflowAfter, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
}
|
||
}/* end of for block*/
|
||
}
|
||
}/* end of for module*/
|
||
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}/* Mmg_fn_vTestMalloc*/
|
||
|
||
|
||
/*---------*/
|
||
/* Debug --*/
|
||
/*---------*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : fn_vSortMallocInfoTable
|
||
DESCRIPTION : Sort the malloc info table by block address ascending (only in debug mode)
|
||
INPUT : Pointer on malloc info structure
|
||
Table Size
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
void fn_vSortMallocInfoTable (tdstMallocInfo * p_stMyMallocInfo, unsigned long ulSizeTable){
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
unsigned long ulI, ulJ;
|
||
tdstMallocInfo stTmp;
|
||
for (ulI=0; ulI < ulSizeTable-1; ulI++){
|
||
for (ulJ=(unsigned short)(ulI+1); ulJ < ulSizeTable; ulJ++){
|
||
if ((p_stMyMallocInfo+ulJ)->p_cBeginMalloc < (p_stMyMallocInfo+ulI)->p_cBeginMalloc){
|
||
stTmp = *(p_stMyMallocInfo+ulI);
|
||
*(p_stMyMallocInfo+ulI) = *(p_stMyMallocInfo+ulJ);
|
||
*(p_stMyMallocInfo+ulJ) = stTmp;
|
||
}
|
||
}
|
||
}
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}/*lint !e715: p_stMyMallocInfo & ulSizeTable(line 1836) not referenced*/
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vPrintAllDynamicMalloc
|
||
DESCRIPTION : Print the map of dynamic allocation for a module (only in debug mode)
|
||
INPUT : Module Id
|
||
Pointer on dynamic malloc info structure
|
||
Flag to indicate that info must be sorted
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
#ifdef __DYNAMIC_MALLOC_ALLOWED__
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
void Mmg_fn_vPrintAllDynamicMalloc (unsigned char ucModuleId, struct tdstDynInfo_ *p_stMyDynInfo, unsigned char ucSorted){
|
||
/* -------------------------*/
|
||
tdstMallocInfo * p_stMyMallocInfo;
|
||
unsigned char ucI;
|
||
unsigned long ulI;
|
||
unsigned long ulLength,ulMaxSize=0;
|
||
char a_cHistoMalloc [C_ucNbColumnForHisto+3];/* +3 for '\n'+('\n'+)'\0'*/
|
||
char a_cLine [C_ucNbPrintedColumn], a_cLine2 [C_ucNbPrintedColumn];
|
||
|
||
p_stMyMallocInfo = p_stMyDynInfo->d_stDynamicMallocInfo;
|
||
if (ucSorted) fn_vSortMallocInfoTable (p_stMyMallocInfo, p_stMyDynInfo->ulNbDynamicMalloc);
|
||
|
||
/* fill up a_HistoMalloc with '*' */
|
||
for (ucI=0; ucI < C_ucNbColumnForHisto+1; ucI++){
|
||
a_cHistoMalloc[ucI]= '*';
|
||
}
|
||
|
||
/* look for the maximum size*/
|
||
for (ulI=0; ulI<p_stMyDynInfo->ulNbDynamicMalloc; ulI++, p_stMyMallocInfo++){
|
||
ulLength = ((unsigned long)(p_stMyMallocInfo->p_cEndMalloc)) - ((unsigned long)(p_stMyMallocInfo->p_cBeginMalloc)) + 1;
|
||
if (ulLength>ulMaxSize) ulMaxSize = ulLength;
|
||
}
|
||
|
||
*a_cLine='\n';
|
||
Erm_M_GetModuleInformation(a_cLine+1, ucModuleId);
|
||
sprintf (a_cLine+strlen(a_cLine),":\n");
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine );
|
||
Mmg_fn_v_PrintInfoMalloc (" The list of all Dynamic Mallocs\n");
|
||
Mmg_fn_v_PrintInfoMalloc ("---------------------------------\n\n");
|
||
/* print the map*/
|
||
p_stMyMallocInfo = p_stMyDynInfo->d_stDynamicMallocInfo;
|
||
for (ulI=0; ulI<p_stMyDynInfo->ulNbDynamicMalloc; ulI++, p_stMyMallocInfo++){
|
||
/* the malloc*/
|
||
ulLength = ((unsigned long)(p_stMyMallocInfo->p_cEndMalloc)) - ((unsigned long) (p_stMyMallocInfo->p_cBeginMalloc)) + 1;
|
||
sprintf (a_cLine, "Malloc -%d-\t: 0x%X->0x%X\t\t(%db; %.2fKb; %.2fMb)\n",
|
||
ulI+1, (long)p_stMyMallocInfo->p_cBeginMalloc, (long)p_stMyMallocInfo->p_cEndMalloc, ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
if (ulMaxSize) ulLength = ulLength * C_ucNbColumnForHisto / ulMaxSize;
|
||
else ulLength = 0;
|
||
if (!ulLength) ulLength = 1;
|
||
a_cHistoMalloc [ulLength] = '\n';
|
||
a_cHistoMalloc [ulLength+1] = '\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cHistoMalloc);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine );
|
||
/*lint -save -e701 : Shift left of signed quantity (int)*/
|
||
sprintf (a_cLine2, "Total place\t: 0x%X->0x%X\t\t(%db; %.2fKb; %.2fMb)\n",
|
||
(unsigned long)(p_stMyMallocInfo->p_cBeginMalloc - (C_ucMallocHeaderSize<<C_uwShiftAllocSize)),
|
||
(unsigned long)(p_stMyMallocInfo->p_cEndMalloc + (C_ucMallocFooterSize<<C_uwShiftAllocSize)),
|
||
(*(p_stMyMallocInfo->p_cBeginMalloc - (C_ucMallocHeaderSize<<C_uwShiftAllocSize)))<<C_uwShiftAllocSize,
|
||
(float)((*(p_stMyMallocInfo->p_cBeginMalloc - (C_ucMallocHeaderSize<<C_uwShiftAllocSize)))<<C_uwShiftAllocSize)/1024,
|
||
(float)((*(p_stMyMallocInfo->p_cBeginMalloc - (C_ucMallocHeaderSize<<C_uwShiftAllocSize)))<<C_uwShiftAllocSize)/(1024*1024) );
|
||
/*lint -restore*/
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
a_cHistoMalloc [ulLength+1] = '\n';
|
||
a_cHistoMalloc [ulLength+2] = '\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cHistoMalloc);
|
||
a_cHistoMalloc[ulLength++]= '*';/* reset the Histogram fill up with '*'*/
|
||
a_cHistoMalloc[ulLength++]= '*';/* reset the Histogram fill up with '*' */
|
||
a_cHistoMalloc[ulLength]= '*';/* reset the Histogram fill up with '*'*/
|
||
}/* end of for of my malloc*/
|
||
}/*lint !e715: p_stMyDynInfo&szModuleName&ucSorted (line 1852) not referenced*/
|
||
#endif /*__DYNAMIC_MALLOC_ALLOWED__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
/* end of Mmg_fn_vPrintAllDynamicMalloc */
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vPrintMapOfBlock
|
||
DESCRIPTION : Print the map of static allocation for a block (only in debug mode)
|
||
INPUT : Module Id
|
||
Pointer on block info structure
|
||
Block Id
|
||
Flag to indicate that info must be sorted
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_vPrintMapOfBlock (unsigned char ucModuleId, struct tdstBlockInfoPriv_ *p_stMyBlocksInfo, unsigned char ucBlockId, unsigned char ucSorted){
|
||
/* --------------------*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
struct tdstBlockInfoPriv_ *p_stMyBlockInfo = p_stMyBlocksInfo+ucBlockId;
|
||
tdstMallocInfo * p_stMyMallocInfo;
|
||
unsigned char ucI;
|
||
unsigned long ulI;
|
||
unsigned short uwCounterFree;
|
||
unsigned long ulLength,ulMaxSize=0;
|
||
char a_cHistoMalloc [C_ucNbColumnForHisto+3];/* +3 for '\n'+('\n'+)'\0'*/
|
||
char a_cHistoFree [C_ucNbColumnForHisto+3];/* +3 for '\n'+('\n'+)'\0'*/
|
||
char a_cLineEnd [C_ucNbColumnForHisto+2];/* +3 for '\n'+'\0'*/
|
||
char a_cLine [C_ucNbPrintedColumn], a_cLine2 [C_ucNbPrintedColumn];
|
||
|
||
unitAlloc * p_uaPtr;
|
||
|
||
|
||
#ifdef D_CheckSystemForBlockWithoutFree
|
||
if (p_stMyBlockInfo->p_cFirstFree == C_FirstFreeValueForBlockWithoutFree){
|
||
Mmg_M_UpdateLastError(E_uwMmgPbNoAvailableFunctionForBlockWithoutFree, NULL)
|
||
}
|
||
#endif /*D_CheckSystemForBlockWithoutFree*/
|
||
|
||
p_stMyMallocInfo = p_stMyBlockInfo->d_stMallocInfo;
|
||
|
||
if (ucSorted) fn_vSortMallocInfoTable (p_stMyMallocInfo, p_stMyBlockInfo->ulNbMalloc);
|
||
|
||
/* fill up a_HistoMalloc with '*', a_HistoMalloc with 'O' & a_lineEnd with '_'*/
|
||
for (ucI=0; ucI < C_ucNbColumnForHisto+1; ucI++){
|
||
a_cHistoMalloc[ucI]= '*';
|
||
a_cHistoFree[ucI]= 'O';
|
||
a_cLineEnd[ucI]='_';
|
||
}
|
||
a_cLineEnd [C_ucNbColumnForHisto]='\0';
|
||
|
||
/* look for the maximum size*/
|
||
for (ulI=0; ulI<p_stMyBlockInfo->ulNbMalloc; ulI++, p_stMyMallocInfo++){
|
||
ulLength = ((unsigned long)(p_stMyMallocInfo->p_cEndMalloc)) - ((unsigned long)(p_stMyMallocInfo->p_cBeginMalloc)) + 1;
|
||
if (ulLength>ulMaxSize) ulMaxSize = ulLength;
|
||
}
|
||
/* max with free*/
|
||
for ( p_uaPtr = (unitAlloc *) p_stMyBlockInfo->p_cFirstFree;
|
||
(p_uaPtr != (unitAlloc *)0) && (*(p_uaPtr +1) != (unitAlloc)0);/* Do not take the last free.*/
|
||
p_uaPtr = (unitAlloc *) *(p_uaPtr+1)/*go to next*/){
|
||
if (((*p_uaPtr)<<C_uwShiftAllocSize) > (unitAlloc) ulMaxSize) ulMaxSize = (unsigned long) ((*p_uaPtr)<<C_uwShiftAllocSize);
|
||
}
|
||
|
||
*a_cLine='\n';
|
||
Erm_M_GetModuleInformation(a_cLine+1, ucModuleId);
|
||
sprintf (a_cLine+strlen(a_cLine),":\n");
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine );
|
||
|
||
sprintf (a_cLine2, "The list of all Static Mallocs of the block # %d\n", ucBlockId);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
Mmg_fn_v_PrintInfoMalloc ("---------------------------------------------------\n\n");
|
||
/* print the map*/
|
||
p_stMyMallocInfo = p_stMyBlockInfo->d_stMallocInfo;
|
||
uwCounterFree = 0;
|
||
p_uaPtr=(unitAlloc *) p_stMyBlockInfo->p_cFirstFree;
|
||
for (ulI=0; ulI<p_stMyBlockInfo->ulNbMalloc; ulI++, p_stMyMallocInfo++){
|
||
if ( (*(p_uaPtr+1) != (unitAlloc)0) && ( ((char *) p_uaPtr) < p_stMyMallocInfo->p_cBeginMalloc ) ){
|
||
/* we have a free before the malloc*/
|
||
uwCounterFree++;
|
||
ulLength = (unsigned long) ((*p_uaPtr) << C_uwShiftAllocSize) ;
|
||
sprintf (a_cLine, "Free -%d-\t: 0x%X->0x%X\t\t(%db; %.2fKb; %.2fMb)\n",
|
||
uwCounterFree, (unsigned long) p_uaPtr, (unsigned long)(((char *)(p_uaPtr+*p_uaPtr)) -1),
|
||
ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
if (ulMaxSize) ulLength = ulLength * C_ucNbColumnForHisto / ulMaxSize;
|
||
else ulLength = 0;
|
||
if (!ulLength) ulLength = 1;
|
||
a_cHistoFree [ulLength] = '\n';
|
||
a_cHistoFree [ulLength+1] = '\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cHistoFree);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine );
|
||
a_cHistoFree [ulLength+1] = '\n';
|
||
a_cHistoFree [ulLength+2] = '\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cHistoFree);
|
||
a_cHistoFree[ulLength++]= 'O';/* reset the Histofgram fill up with 'O' */
|
||
a_cHistoFree[ulLength++]= 'O';/* reset the Histofgram fill up with 'O' */
|
||
a_cHistoFree[ulLength]= 'O';/* reset the Histofgram fill up with 'O' */
|
||
p_uaPtr = (unitAlloc *) *(p_uaPtr +1); /* go to next*/
|
||
}/* end of if of my free */
|
||
|
||
/* the malloc*/
|
||
ulLength = ((unsigned long)(p_stMyMallocInfo->p_cEndMalloc)) - ((unsigned long) (p_stMyMallocInfo->p_cBeginMalloc)) + 1;
|
||
sprintf (a_cLine, "Malloc -%d-\t: 0x%X->0x%X\t\t(%db; %.2fKb; %.2fMb)\n",
|
||
ulI+1, (unsigned long)(p_stMyMallocInfo->p_cBeginMalloc), (unsigned long)(p_stMyMallocInfo->p_cEndMalloc), ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
if (ulMaxSize) ulLength = ulLength * C_ucNbColumnForHisto / ulMaxSize;
|
||
else ulLength = 0;
|
||
if (!ulLength) ulLength = 1;
|
||
a_cHistoMalloc [ulLength] = '\n';
|
||
a_cHistoMalloc [ulLength+1] = '\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cHistoMalloc);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine );
|
||
|
||
/*lint -save -e790 : Suspicious truncation, integral to float*/
|
||
sprintf (a_cLine2, "Total place\t: 0x%X->0x%X\t\t(%db; %.2fKb; %.2fMb)\n",
|
||
(unsigned long)(p_stMyMallocInfo->p_cBeginMalloc - (C_ucMallocHeaderSize<<C_uwShiftAllocSize)),
|
||
(unsigned long) (p_stMyMallocInfo->p_cEndMalloc + (C_ucMallocFooterSize<<C_uwShiftAllocSize)),
|
||
(*(unitAlloc *)(p_stMyMallocInfo->p_cBeginMalloc - (C_ucMallocHeaderSize<<C_uwShiftAllocSize)))<<C_uwShiftAllocSize,
|
||
(float)((*(unitAlloc *)(p_stMyMallocInfo->p_cBeginMalloc - (C_ucMallocHeaderSize<<C_uwShiftAllocSize)))<<C_uwShiftAllocSize)/1024,
|
||
(float)((*(unitAlloc *)(p_stMyMallocInfo->p_cBeginMalloc - (C_ucMallocHeaderSize<<C_uwShiftAllocSize)))<<C_uwShiftAllocSize)/(1024*1024) );
|
||
/*lint -restore*/
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
a_cHistoMalloc [ulLength+1] = '\n';
|
||
a_cHistoMalloc [ulLength+2] = '\0';
|
||
sprintf (a_cLine2, "%s\n\n", a_cHistoMalloc);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cHistoMalloc);
|
||
a_cHistoMalloc[ulLength++]= '*';/* reset the Histogram fill up with '*'*/
|
||
a_cHistoMalloc[ulLength++]= '*';/* reset the Histogram fill up with '*'*/
|
||
a_cHistoMalloc[ulLength]= '*';/* reset the Histogram fill up with '*'*/
|
||
}/* end of for of my malloc*/
|
||
|
||
#ifdef __ADD_PLACE_FOR_DEBUG_INFORMATION__
|
||
sprintf(a_cLine2, "%s\n", a_cLineEnd);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
|
||
ulLength = (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize));
|
||
Mmg_M_BigBoundSize(ulLength, C_uwAllocSize);
|
||
|
||
sprintf (a_cLine2, "Memory added for store the debug information:\t(%db; %.2fKb; %.2fMb)\n", ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
|
||
ulLength = (unsigned long) ( (p_stMyBlockInfo->ulNbMalloc))*(C_ucDebugInformationLoss<<C_uwShiftAllocSize);
|
||
sprintf (a_cLine2, "Used added Memory : \t(%db; %.2fKb; %.2fMb) (%.2f%%)\n", ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024), (float)ulLength/(p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize))*100);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
|
||
if (ulLength < (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize))){
|
||
ulLength = (unsigned long) (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize)) - ulLength;
|
||
sprintf (a_cLine2, "Remain of added Memory : \t(%db; %.2fKb; %.2fMb)\n", ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
}
|
||
else{
|
||
Mmg_fn_v_PrintInfoMalloc ("\tThe Memory added for store the debug information is FULL !!\n");
|
||
}
|
||
|
||
sprintf(a_cLine2, "%s\n", a_cLineEnd);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
#endif /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
|
||
/* print the remainder of the free space.*/
|
||
if (*(p_uaPtr+1) == (unitAlloc)0){
|
||
ulLength = (unsigned long) ((*p_uaPtr)<<C_uwShiftAllocSize );
|
||
sprintf(a_cLine2, "%s\n", a_cLineEnd);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
sprintf (a_cLine2, "Remain with memory added for debug information \t: 0x%X->0x%X\n",
|
||
(unsigned long)p_uaPtr, (unsigned long)(((char *)(p_uaPtr+*p_uaPtr)) -1));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
sprintf (a_cLine2, "\t(%db; %.2fKb; %.2fMb)\n",
|
||
ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
|
||
ulLength -= (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize));
|
||
ulLength += ( (p_stMyBlockInfo->ulNbMalloc)) * (C_ucDebugInformationLoss<<C_uwShiftAllocSize);
|
||
if (ulLength != 0){
|
||
sprintf (a_cLine2, "(pessimistic)Estimated remain for other allocations \t: 0x%X->0x%X\n",
|
||
(unsigned long)p_uaPtr, (unsigned long)(((char *)p_uaPtr)+ulLength-1));
|
||
}
|
||
else{
|
||
sprintf (a_cLine2, "(pessimistic)Estimated remain for other allocations ",
|
||
(unsigned long)p_uaPtr, (unsigned long)(((char *)p_uaPtr)+ulLength-1));
|
||
}
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
sprintf (a_cLine2, "\t(%db; %.2fKb; %.2fMb)\n",
|
||
ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
sprintf(a_cLine2, "%s\n\n", a_cLineEnd);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
}
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}/*lint !e715 p_stMyBlockInfo&ucBlockId&szModuleName& (line 1916) not referenced*/
|
||
/* end of Mmg_fn_vPrintMapOfBlock*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vPrintDebugMapOfBlock
|
||
DESCRIPTION : Print the map of static allocation for a block (only in debug mode)
|
||
INPUT : Module Id
|
||
Pointer on block info structure
|
||
Block Id
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
/* Modif#5 : new function*/
|
||
void Mmg_fn_vPrintDebugMapOfBlock (unsigned char ucModuleId, struct tdstBlockInfoPriv_ *p_stMyBlocksInfo, unsigned char ucBlockId){
|
||
/* --------------------*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
struct tdstBlockInfoPriv_ *p_stMyBlockInfo = p_stMyBlocksInfo+ucBlockId;
|
||
unsigned char ucI;
|
||
unsigned long ulI;
|
||
unsigned short uwCounterFree;
|
||
unsigned long ulLength,ulMaxSize=0;
|
||
char a_cHistoMalloc [C_ucNbColumnForHisto+3];/* +3 for '\n'+('\n'+)'\0'*/
|
||
char a_cHistoFree [C_ucNbColumnForHisto+3];/* +3 for '\n'+('\n'+)'\0'*/
|
||
char a_cLineEnd [C_ucNbColumnForHisto+2];/* +3 for '\n'+'\0'*/
|
||
char a_cLine [C_ucNbPrintedColumn], a_cLine2 [C_ucNbPrintedColumn];
|
||
|
||
unitAlloc * p_uaPtr;
|
||
|
||
/* fill up a_HistoMalloc with '*', a_HistoMalloc with 'O' & a_lineEnd with '_'*/
|
||
for (ucI=0; ucI < C_ucNbColumnForHisto+1; ucI++){
|
||
a_cHistoMalloc[ucI]= '*';
|
||
a_cHistoFree[ucI]= 'O';
|
||
a_cLineEnd[ucI]='_';
|
||
}
|
||
a_cLineEnd [C_ucNbColumnForHisto]='\0';
|
||
|
||
/* look for the maximum size of malloc or free*/
|
||
ulI=0;
|
||
p_uaPtr=(unitAlloc *)p_stMyBlockInfo->p_cBeginBlock;
|
||
while (p_uaPtr<(unitAlloc *)p_stMyBlockInfo->p_cEndBlock){
|
||
if (*(p_uaPtr+1) == C_uaBeginKey){
|
||
/* it's a malloc*/
|
||
ulLength = ((*p_uaPtr) - C_ucMallocHeaderSize - C_ucMallocFooterSize);
|
||
ulLength <<= C_uwShiftAllocSize;
|
||
if (ulLength>ulMaxSize) ulMaxSize = ulLength;
|
||
p_uaPtr += (*p_uaPtr);
|
||
ulI++;
|
||
}
|
||
else {
|
||
/* it's a free*/
|
||
if ((p_uaPtr != (unitAlloc *)0) && (*(p_uaPtr +1) != (unitAlloc)0)){/* Do not take the last free.*/
|
||
ulLength = (*p_uaPtr);
|
||
ulLength <<= C_uwShiftAllocSize;
|
||
if (ulLength > ulMaxSize) ulMaxSize = ulLength;
|
||
}
|
||
else {
|
||
break;/* this is the last free then we go out of the while with p_uaPtr pointed on the last free*/
|
||
}
|
||
p_uaPtr += (*p_uaPtr);
|
||
}
|
||
|
||
}/*end of while*/
|
||
if (ulI != p_stMyBlockInfo->ulNbMalloc){
|
||
/*p_uaPtr = (unitAlloc)ulI/0; // just for allowed a breack point*/
|
||
}
|
||
|
||
*a_cLine = '\n';
|
||
Erm_M_GetModuleInformation(a_cLine+1, ucModuleId);
|
||
sprintf (a_cLine+strlen(a_cLine),":\n");
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine );
|
||
|
||
sprintf (a_cLine2, "The Debug list of all Static Mallocs of the block # %d\n", ucBlockId);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
Mmg_fn_v_PrintInfoMalloc ("---------------------------------------------------\n\n");
|
||
/* print the map*/
|
||
uwCounterFree = 0;
|
||
ulI=0;
|
||
p_uaPtr=(unitAlloc *)p_stMyBlockInfo->p_cBeginBlock;
|
||
while (p_uaPtr<(unitAlloc *)p_stMyBlockInfo->p_cEndBlock){
|
||
if (*(p_uaPtr+1) == C_uaBeginKey){
|
||
/* it's a malloc*/
|
||
ulLength = ((*p_uaPtr) - C_ucMallocHeaderSize - C_ucMallocFooterSize)<< C_uwShiftAllocSize;
|
||
|
||
sprintf (a_cLine, "Malloc -%d-\t: 0x%X->0x%X\t\t(%db; %.2fKb; %.2fMb)\n",
|
||
ulI+1, (unsigned long)(p_uaPtr+C_ucMallocHeaderSize), ((unsigned long)(p_uaPtr+*p_uaPtr-C_ucMallocFooterSize))-1, ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
if (ulMaxSize) ulLength = ulLength * C_ucNbColumnForHisto / ulMaxSize;
|
||
else ulLength = 0;
|
||
if (!ulLength) ulLength = 1;
|
||
a_cHistoMalloc [ulLength] = '\n';
|
||
a_cHistoMalloc [ulLength+1] = '\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cHistoMalloc);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine );
|
||
|
||
|
||
/*lint -save -e790 : Suspicious truncation, integral to float*/
|
||
sprintf (a_cLine2, "Total place\t: 0x%X->0x%X\t\t(%db; %.2fKb; %.2fMb)\n",
|
||
(unsigned long)(p_uaPtr),
|
||
((unsigned long) (p_uaPtr + *p_uaPtr))-1,
|
||
(*p_uaPtr)<<C_uwShiftAllocSize,
|
||
(float)((*p_uaPtr)<<C_uwShiftAllocSize)/1024,
|
||
(float)((*p_uaPtr)<<C_uwShiftAllocSize)/(1024*1024) );
|
||
/*lint -restore*/
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
a_cHistoMalloc [ulLength+1] = '\n';
|
||
a_cHistoMalloc [ulLength+2] = '\0';
|
||
sprintf (a_cLine2, "%s\n\n", a_cHistoMalloc);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cHistoMalloc);
|
||
a_cHistoMalloc[ulLength++]= '*';/* reset the Histogram fill up with '*'*/
|
||
a_cHistoMalloc[ulLength++]= '*';/* reset the Histogram fill up with '*'*/
|
||
a_cHistoMalloc[ulLength]= '*';/* reset the Histogram fill up with '*'*/
|
||
|
||
ulI++;
|
||
p_uaPtr += (*p_uaPtr);
|
||
}
|
||
else {
|
||
/* it's a free*/
|
||
if ((p_uaPtr != (unitAlloc *)0) && (*(p_uaPtr +1) != (unitAlloc)0)){/* Do not take the last free.*/
|
||
|
||
uwCounterFree++;
|
||
ulLength = (unsigned long) ((*p_uaPtr) << C_uwShiftAllocSize) ;
|
||
sprintf (a_cLine, "Free -%d-\t: 0x%X->0x%X\t\t(%db; %.2fKb; %.2fMb)\n",
|
||
uwCounterFree, (unsigned long) p_uaPtr, (unsigned long)(((char *)(p_uaPtr+*p_uaPtr)) -1),
|
||
ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
if (ulMaxSize) ulLength = ulLength * C_ucNbColumnForHisto / ulMaxSize;
|
||
else ulLength = 0;
|
||
if (!ulLength) ulLength = 1;
|
||
a_cHistoFree [ulLength] = '\n';
|
||
a_cHistoFree [ulLength+1] = '\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cHistoFree);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine );
|
||
a_cHistoFree [ulLength+1] = '\n';
|
||
a_cHistoFree [ulLength+2] = '\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cHistoFree);
|
||
a_cHistoFree[ulLength++]= 'O';/* reset the Histofgram fill up with 'O' */
|
||
a_cHistoFree[ulLength++]= 'O';/* reset the Histofgram fill up with 'O' */
|
||
a_cHistoFree[ulLength]= 'O';/* reset the Histofgram fill up with 'O' */
|
||
}
|
||
else {
|
||
break;/* this is the last free then we go out of the while with p_uaPtr pointed on the last free*/
|
||
}
|
||
p_uaPtr += (*p_uaPtr);
|
||
}
|
||
|
||
}/*end of while*/
|
||
|
||
#ifdef __ADD_PLACE_FOR_DEBUG_INFORMATION__
|
||
sprintf(a_cLine2, "%s\n", a_cLineEnd);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
|
||
ulLength = (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize));
|
||
Mmg_M_BigBoundSize(ulLength, C_uwAllocSize);
|
||
|
||
sprintf (a_cLine2, "Memory added for store the debug information:\t(%db; %.2fKb; %.2fMb)\n", ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
|
||
ulLength = (unsigned long) ( (p_stMyBlockInfo->ulNbMalloc))*(C_ucDebugInformationLoss<<C_uwShiftAllocSize);
|
||
sprintf (a_cLine2, "Used added Memory : \t(%db; %.2fKb; %.2fMb) (%.2f%%)\n", ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024), (float)ulLength/(p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize))*100);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
|
||
if (ulLength < (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize))){
|
||
ulLength = (unsigned long) (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize)) - ulLength;
|
||
sprintf (a_cLine2, "Remain of added Memory : \t(%db; %.2fKb; %.2fMb)\n", ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
}
|
||
else{
|
||
Mmg_fn_v_PrintInfoMalloc ("\tThe Memory added for store the debug information is FULL !!\n");
|
||
}
|
||
|
||
sprintf(a_cLine2, "%s\n", a_cLineEnd);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
#endif /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
|
||
/* print the remainder of the free space.*/
|
||
if (*(p_uaPtr+1) == (unitAlloc)0){
|
||
ulLength = (unsigned long) ((*p_uaPtr)<<C_uwShiftAllocSize );
|
||
sprintf(a_cLine2, "%s\n", a_cLineEnd);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
sprintf (a_cLine2, "Remain with memory added for debug information \t: 0x%X->0x%X\n",
|
||
(unsigned long)p_uaPtr, (unsigned long)(((char *)(p_uaPtr+*p_uaPtr)) -1));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
sprintf (a_cLine2, "\t(%db; %.2fKb; %.2fMb)\n",
|
||
ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
ulLength -= (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize));
|
||
ulLength += ( (p_stMyBlockInfo->ulNbMalloc)) * (C_ucDebugInformationLoss<<C_uwShiftAllocSize);
|
||
if (ulLength != 0){
|
||
sprintf (a_cLine2, "(pessimistic)Estimated remain for other allocations \t: 0x%X->0x%X\n",
|
||
(unsigned long)p_uaPtr, (unsigned long)(((char *)p_uaPtr)+ulLength-1));
|
||
}
|
||
else{
|
||
sprintf (a_cLine2, "(pessimistic)Estimated remain for other allocations ",
|
||
(unsigned long)p_uaPtr, (unsigned long)(((char *)p_uaPtr)+ulLength-1));
|
||
}
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
sprintf (a_cLine2, "\t(%db; %.2fKb; %.2fMb)\n",
|
||
ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
sprintf(a_cLine2, "%s\n\n", a_cLineEnd);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine2);
|
||
}
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}/*lint !e715 p_stMyBlockInfo&ucBlockId&szModuleName& (line 1916) not referenced*/
|
||
/* end of Mmg_fn_vPrintDebugMapOfBlock*/
|
||
|
||
/* ##-###########################
|
||
## Management of Statistic
|
||
############################## */
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vPrintBlockStatistic
|
||
DESCRIPTION : Print statistic on a block (only in debug mode)
|
||
INPUT : Module Id
|
||
Pointer on block info structure
|
||
Block Id
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_vPrintBlockStatistic (unsigned char ucModuleId, struct tdstBlockInfoPriv_ *p_stMyBlocksInfo, unsigned char ucBlockId){
|
||
/* -----------------------*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
struct tdstBlockInfoPriv_ *p_stMyBlockInfo = p_stMyBlocksInfo+ucBlockId;
|
||
tdstMallocInfo * p_stMyMallocInfo;
|
||
unsigned short uwI;
|
||
unsigned long ulI;
|
||
unsigned char ucPtr;
|
||
unsigned long ulLargestMalloc=0, ulSmallestMalloc=0xffffffff, ulLargestFree=0, ulSmallestFree=0xffffffff;
|
||
unsigned long ulIdLargestMalloc=0xffffffff,ulIdSmallestMalloc=0xffffffff;
|
||
unsigned char ucPrintedLength;
|
||
unsigned long ulMaxPrint;
|
||
unsigned long ulDebugInfoRemain;
|
||
unsigned short uwCounterFree;
|
||
unsigned long ulLengthMalloc=0, ulLengthFree=0, ulLength;
|
||
char a_cMap [C_ucNbColumnForHisto+3];/* +3 for '\n'+(\n)+'\0'*/
|
||
char a_cLine [C_ucNbPrintedColumn];
|
||
|
||
unitAlloc * p_uaPtr;/* used for scan the free space. After scaning the all the free list, p_uaPtr points at the last free*/
|
||
|
||
|
||
#ifdef D_CheckSystemForBlockWithoutFree
|
||
if (p_stMyBlockInfo->p_cFirstFree == C_FirstFreeValueForBlockWithoutFree){
|
||
Mmg_M_UpdateLastError(E_uwMmgPbNoAvailableFunctionForBlockWithoutFree, NULL)
|
||
}
|
||
#endif /*D_CheckSystemForBlockWithoutFree*/
|
||
|
||
/* look for the maximum & mimimum size of all the mallocs*/
|
||
p_stMyMallocInfo = p_stMyBlockInfo->d_stMallocInfo;
|
||
for (ulI=0; ulI<p_stMyBlockInfo->ulNbMalloc; ulI++, p_stMyMallocInfo++){
|
||
ulLength = (unsigned long)(*((unitAlloc *)p_stMyMallocInfo->p_cBeginMalloc - C_ucMallocHeaderSize));
|
||
ulLengthMalloc += ulLength;
|
||
if (ulLength>ulLargestMalloc){
|
||
ulLargestMalloc = ulLength;
|
||
ulIdLargestMalloc = ulI;
|
||
}
|
||
if (ulLength<ulSmallestMalloc){
|
||
ulSmallestMalloc = ulLength;
|
||
ulIdSmallestMalloc = ulI;
|
||
}
|
||
}
|
||
ulLargestMalloc -= C_ucDebugInformationLoss;
|
||
ulSmallestMalloc -= C_ucDebugInformationLoss;
|
||
|
||
/* look for the maximum & mimimum size of all the frees except the last free space.*/
|
||
uwCounterFree = 0;
|
||
for ( p_uaPtr = (unitAlloc *) p_stMyBlockInfo->p_cFirstFree;
|
||
(p_uaPtr != (unitAlloc *)0) && (*(p_uaPtr +1) != (unitAlloc)0);/* Do not take the last free.*/
|
||
p_uaPtr = (unitAlloc *) *(p_uaPtr+1)/*go to next*/){
|
||
uwCounterFree++;
|
||
ulLengthFree += (*p_uaPtr);
|
||
if (*p_uaPtr > (unitAlloc) ulLargestFree) ulLargestFree = (unsigned long) (*p_uaPtr);
|
||
if (*p_uaPtr < (unitAlloc) ulSmallestFree) ulSmallestFree = (unsigned long) (*p_uaPtr);
|
||
}
|
||
|
||
#ifdef __ADD_PLACE_FOR_DEBUG_INFORMATION__
|
||
ulDebugInfoRemain = (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize));
|
||
Mmg_M_BigBoundSize(ulDebugInfoRemain, C_uwAllocSize);
|
||
ulDebugInfoRemain >>= C_uwShiftAllocSize;/* convert into unitAlloc*/
|
||
if ( ulDebugInfoRemain > (unsigned long)((p_stMyBlockInfo->ulNbMalloc )*C_ucDebugInformationLoss) ){
|
||
ulDebugInfoRemain = ulDebugInfoRemain - (unsigned long)((p_stMyBlockInfo->ulNbMalloc )*C_ucDebugInformationLoss);
|
||
/* ulDebugInfoRemain = remain for debug information in UnitAlloc*/
|
||
/* -------------*/
|
||
}
|
||
else ulDebugInfoRemain = 0;
|
||
#else /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
ulDebugInfoRemain = 0;
|
||
#endif /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
|
||
/*print the debug map & information*/
|
||
ulMaxPrint = ulLengthFree + ulLengthMalloc + (*p_uaPtr)/*the full real last free*/ - ulDebugInfoRemain;/*lint !e613: Possible use of null pointer (p_uaPtr)*/
|
||
|
||
*a_cLine = '\n';
|
||
Erm_M_GetModuleInformation(a_cLine+1, ucModuleId);
|
||
sprintf (a_cLine+strlen(a_cLine),":\n");
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine );
|
||
|
||
Mmg_fn_v_PrintInfoMalloc ("=====================================\n");
|
||
sprintf (a_cLine," Statistics of the static block #%d:\n", ucBlockId);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
Mmg_fn_v_PrintInfoMalloc ("=====================================\n");
|
||
|
||
#ifdef __ADD_PLACE_FOR_DEBUG_INFORMATION__
|
||
ulLength = (unsigned long) p_stMyBlockInfo->p_cEndBlock - (unsigned long) p_stMyBlockInfo->p_cBeginBlock + 1 - (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize));
|
||
sprintf (a_cLine, "\t-Usefull size (without the 'AddedDebugMemory'): 0x%X->0x%X\t(%db; %.2fKb; %.2fMb)\n", (unsigned long)(p_stMyBlockInfo->p_cBeginBlock), (unsigned long)(p_stMyBlockInfo->p_cEndBlock), ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
ulLength = (unsigned long) (p_stMyBlockInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize));
|
||
sprintf (a_cLine, "\t-Size for the 'AddedDebugMemory': 0x%X->0x%X\t\t(%db; %.2fKb; %.2fMb)\n", (unsigned long)(p_stMyBlockInfo->p_cBeginBlock), (unsigned long)(p_stMyBlockInfo->p_cEndBlock), ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
sprintf (a_cLine, "\t-The 'AddedDebugMemory' correspond to %d allocations\n", p_stMyBlockInfo->ulMaxNbStaticMalloc);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
sprintf (a_cLine, "\t-There are %d alloactions used now,i.e %.2f%% of the 'AddedDebugMemory'\n",
|
||
(p_stMyBlockInfo->ulNbMalloc),
|
||
(float)((p_stMyBlockInfo->ulNbMalloc)*100/ p_stMyBlockInfo->ulMaxNbStaticMalloc) );
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
#endif /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
|
||
ulLength = (unsigned long) p_stMyBlockInfo->p_cEndBlock - (unsigned long) p_stMyBlockInfo->p_cBeginBlock + 1;
|
||
sprintf (a_cLine, "\t-The full size: 0x%X->0x%X\t\t(%db; %.2fKb; %.2fMb)\n", (unsigned long)(p_stMyBlockInfo->p_cBeginBlock), (unsigned long)(p_stMyBlockInfo->p_cEndBlock), ulLength, (float)ulLength/1024, (float)ulLength/(1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
if ((ulLength-(ulDebugInfoRemain<<C_uwShiftAllocSize))){
|
||
sprintf (a_cLine, "\t-The maximum address is 0x%X (with %d allocations & %d frees), %.2f%% of all the block has been used\n", (unsigned long)(p_stMyBlockInfo->p_cMaxMem), p_stMyBlockInfo->ulCountMallocBeforeMaxMem, p_stMyBlockInfo->ulCountFreeBeforeMaxMem,
|
||
(float)((unsigned long) p_stMyBlockInfo->p_cMaxMem - (unsigned long) p_stMyBlockInfo->p_cBeginBlock)*100/(ulLength-(ulDebugInfoRemain<<C_uwShiftAllocSize))
|
||
);/*lint !e790: Suspicious truncation, integral to float*/
|
||
}
|
||
else
|
||
sprintf (a_cLine, "\t-The maximum address is 0x%X (with %d allocations & %d frees)\n",
|
||
(unsigned long)(p_stMyBlockInfo->p_cMaxMem),
|
||
p_stMyBlockInfo->ulCountMallocBeforeMaxMem,
|
||
p_stMyBlockInfo->ulCountFreeBeforeMaxMem);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
sprintf (a_cLine, "\t-Address of the first Free Space: 0x%X\n",(unsigned long) (p_stMyBlockInfo->p_cFirstFree));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
sprintf (a_cLine, "\t-%d requested reallocations\n",p_stMyBlockInfo->ulNbTotalRealloc);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
|
||
|
||
/* compute the general Map */
|
||
/* -----------------------*/
|
||
/*---------------------------*/
|
||
/* the unallocated free space */
|
||
/*---------------------------*/
|
||
if (ulMaxPrint) ucPrintedLength = (unsigned char) (ulLengthFree * C_ucNbColumnForHisto / ulMaxPrint);
|
||
else ucPrintedLength = 0;
|
||
if ((ulLengthFree) && (ucPrintedLength == 0)) ucPrintedLength=1;
|
||
for (uwI=0; uwI < ucPrintedLength; uwI++){
|
||
a_cMap[uwI]='-';
|
||
}
|
||
ucPtr = (unsigned char) uwI;
|
||
/************************************/
|
||
/* the allocated space without loss*/
|
||
/************************************/
|
||
ulLengthMalloc -= (p_stMyBlockInfo->ulNbMalloc*C_ucDebugInformationLoss); /* loss*/
|
||
if (ulMaxPrint){
|
||
ucPrintedLength = (unsigned char)(
|
||
ulLengthMalloc
|
||
* C_ucNbColumnForHisto / ulMaxPrint);
|
||
}
|
||
else ucPrintedLength =0;
|
||
if ((ulLengthMalloc) && (ucPrintedLength == 0)) ucPrintedLength=1;
|
||
for (uwI=0; uwI < ucPrintedLength; uwI++){
|
||
a_cMap[ucPtr + uwI]='*';
|
||
}
|
||
ucPtr += (unsigned char) uwI;
|
||
/*+++++++++++++++++++++++++++++*/
|
||
/* the loss of allocated & free space*/
|
||
/*+++++++++++++++++++++++++++++*/
|
||
if (ulMaxPrint){
|
||
ucPrintedLength =(unsigned char)((p_stMyBlockInfo->ulNbMalloc )*C_ucDebugInformationLoss /* loss*/
|
||
* C_ucNbColumnForHisto / ulMaxPrint);
|
||
}
|
||
else ucPrintedLength = 0;
|
||
if ((ulLengthMalloc) && (ucPrintedLength == 0)) ucPrintedLength=1;
|
||
for (uwI=0; uwI < ucPrintedLength; uwI++){
|
||
a_cMap[ucPtr + uwI]='+';
|
||
}
|
||
ucPtr += (unsigned char) uwI;
|
||
|
||
/*OOOOOOOOOOOOOOOO*/
|
||
/* the last first*/
|
||
/*OOOOOOOOOOOOOOOO*/
|
||
for (uwI=ucPtr; uwI < C_ucNbColumnForHisto; uwI++){
|
||
a_cMap[uwI]='O';
|
||
}
|
||
a_cMap[uwI]='\n';
|
||
a_cMap[uwI+1]='\0';
|
||
|
||
/* print the general Map */
|
||
#ifdef __ADD_PLACE_FOR_DEBUG_INFORMATION__
|
||
Mmg_fn_v_PrintInfoMalloc ("\n===================================================================\n");
|
||
Mmg_fn_v_PrintInfoMalloc ("= The General Map of the memory (without any 'AddedDebugMemory'): =\n");
|
||
Mmg_fn_v_PrintInfoMalloc ("===================================================================\n\n");
|
||
#else /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
Mmg_fn_v_PrintInfoMalloc ("\n==================================\n");
|
||
Mmg_fn_v_PrintInfoMalloc ("= The General Map of the memory: =\n");
|
||
Mmg_fn_v_PrintInfoMalloc ("==================================\n\n");
|
||
#endif /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
|
||
|
||
|
||
ulMaxPrint = M_Max(ulLengthFree, ulLengthMalloc);
|
||
ulMaxPrint = M_Max(ulMaxPrint, (*p_uaPtr) - ulDebugInfoRemain);/*lint !e613: Possible use of null pointer (p_uaPtr)*/
|
||
|
||
Mmg_fn_v_PrintInfoMalloc ("\n=========================\n");
|
||
Mmg_fn_v_PrintInfoMalloc ("= Legend & Explanation: =\n");
|
||
Mmg_fn_v_PrintInfoMalloc ("=========================\n\n");
|
||
/*----------------------------*/
|
||
/* the unallocated free space */
|
||
/*----------------------------*/
|
||
if (ulMaxPrint) ucPrintedLength = (unsigned char)(ulLengthFree * C_ucNbColumnForHisto / ulMaxPrint);
|
||
else ulLengthFree =0;
|
||
if (ucPrintedLength == 0) ucPrintedLength=1;
|
||
for (uwI=0; uwI < ucPrintedLength; uwI++){
|
||
a_cMap[uwI]='-';
|
||
}
|
||
a_cMap[uwI]='\n';
|
||
a_cMap[uwI+1]='\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
Mmg_fn_v_PrintInfoMalloc ("Free Unallocated space:\n");
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
ulLengthFree <<= C_uwShiftAllocSize;
|
||
sprintf (a_cLine, "\t-Request:%d; current:%d; size : \t%db (%.2fKb; %.2fMb)\n",p_stMyBlockInfo->ulNbTotalFree, uwCounterFree, ulLengthFree, (float)ulLengthFree / 1024, (float)ulLengthFree / (1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
|
||
if (uwCounterFree > 0){/* i.e ulLargestFree > 0*/
|
||
ulLargestFree <<= C_uwShiftAllocSize;
|
||
sprintf (a_cLine, "\t-Size of the largest Free: \t%db (%.2fKb; %.2fMb)\n", ulLargestFree, (float)ulLargestFree/ 1024, (float)ulLargestFree/ (1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
ulSmallestFree <<= C_uwShiftAllocSize;
|
||
sprintf (a_cLine, "\t-Size of the smallest Free: \t%db (%.2fKb; %.2fMb)\n", ulSmallestFree, (float)ulSmallestFree/ 1024, (float)ulSmallestFree/ (1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
if (uwCounterFree){
|
||
sprintf (a_cLine, "\t-Average size of Free space: \t%db (%.2fKb; %.2fMb)\n", ulLengthFree/uwCounterFree, ((float)ulLengthFree/(float)uwCounterFree)/ 1024, ((float)ulLengthFree/(float)uwCounterFree)/ (1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
}
|
||
}
|
||
|
||
a_cMap[uwI+1]='\n';
|
||
a_cMap[uwI+2]='\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
ulLengthFree >>= C_uwShiftAllocSize; /* restore the unitAlloc unit*/
|
||
|
||
/************************************/
|
||
/* the allocated space without loss*/
|
||
/************************************/
|
||
if (ulMaxPrint){
|
||
ucPrintedLength = (unsigned char)(
|
||
ulLengthMalloc
|
||
* C_ucNbColumnForHisto / ulMaxPrint);
|
||
}
|
||
else ucPrintedLength = 0;
|
||
if (ucPrintedLength == 0) ucPrintedLength=1;
|
||
for (uwI=0; uwI < ucPrintedLength; uwI++){
|
||
a_cMap[uwI]='*';
|
||
}
|
||
a_cMap[uwI]='\n';
|
||
a_cMap[uwI+1]='\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
Mmg_fn_v_PrintInfoMalloc ("Allocated space without loss (but with the field 'size of malloc'):\n");
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
ulLengthMalloc <<= C_uwShiftAllocSize;
|
||
sprintf (a_cLine, "\t-Request:%d; current:%d; size : \t%db (%.2fKb; %.2fMb)\n",p_stMyBlockInfo->ulNbTotalMalloc, p_stMyBlockInfo->ulNbMalloc, ulLengthMalloc, (float)ulLengthMalloc / 1024, (float)ulLengthMalloc / (1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
|
||
if (ulLargestMalloc > 0){/* i.e p_stMyBlockInfo->ulNbTotalMalloc >0*/
|
||
ulLargestMalloc <<= C_uwShiftAllocSize;
|
||
sprintf (a_cLine, "\t-The Largest Allocation: \t%db (%.2fKb; %.2fMb)\n", ulLargestMalloc, (float)ulLargestMalloc/ 1024, (float)ulLargestMalloc/ (1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
ulSmallestMalloc <<= C_uwShiftAllocSize;
|
||
sprintf (a_cLine, "\t-The Smallest Allocation: \t%db (%.2fKb; %.2fMb)\n", ulSmallestMalloc, (float)ulSmallestMalloc/ 1024, (float)ulSmallestMalloc/ (1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
if (p_stMyBlockInfo->ulNbMalloc){
|
||
sprintf (a_cLine, "\t-The average Allocation: \t%db (%.2fKb; %.2fMb)\n", ulLengthMalloc/p_stMyBlockInfo->ulNbMalloc, ((float)ulLengthMalloc/(float)p_stMyBlockInfo->ulNbMalloc)/ 1024, ((float)ulLengthMalloc/(float)p_stMyBlockInfo->ulNbMalloc)/ (1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
}
|
||
}
|
||
|
||
a_cMap[uwI+1]='\n';
|
||
a_cMap[uwI+2]='\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
ulLengthMalloc >>= C_uwShiftAllocSize;/* restore the unitAlloc unit*/
|
||
|
||
/*+++++++++++++++++++++++++++++*/
|
||
/* the loss of allocated */
|
||
/*+++++++++++++++++++++++++++++*/
|
||
if (ulMaxPrint){
|
||
ucPrintedLength = (unsigned char)((
|
||
((p_stMyBlockInfo->ulNbMalloc)*C_ucDebugInformationLoss)) /* loss*/
|
||
* C_ucNbColumnForHisto / ulMaxPrint);
|
||
}
|
||
else ucPrintedLength = 0;
|
||
if (ucPrintedLength == 0) ucPrintedLength=1;
|
||
for (uwI=0; uwI < ucPrintedLength; uwI++){
|
||
a_cMap[uwI]='+';
|
||
}
|
||
a_cMap[uwI]='\n';
|
||
a_cMap[uwI+1]='\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
Mmg_fn_v_PrintInfoMalloc ("The debug loss of the allocated space:\n");
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
ulLength = ((p_stMyBlockInfo->ulNbMalloc)*C_ucDebugInformationLoss); /* loss*/
|
||
ulLength <<= C_uwShiftAllocSize;
|
||
if ((unsigned long)p_stMyBlockInfo->p_cEndBlock - (unsigned long)p_stMyBlockInfo->p_cBeginBlock + 1 - (ulDebugInfoRemain<<C_uwShiftAllocSize))
|
||
sprintf (a_cLine, "\t-Size : %db (%.2fKb; %.2fMb) = %.2f%% of the all the available space\n", ulLength, (float)ulLength / 1024, (float)ulLength / (1024*1024), (float) ulLength*100 /(float)((unsigned long)p_stMyBlockInfo->p_cEndBlock - (unsigned long)p_stMyBlockInfo->p_cBeginBlock + 1 - (ulDebugInfoRemain<<C_uwShiftAllocSize)));/*lint !e790: Suspicious truncation, integral to float*/
|
||
else
|
||
sprintf (a_cLine, "\t-Size : %db (%.2fKb; %.2fMb)\n", ulLength, (float)ulLength / 1024, (float)ulLength / (1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
a_cMap[uwI+1]='\n';
|
||
a_cMap[uwI+2]='\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
|
||
/*OOOOOOOOOOOOOOOO*/
|
||
/* the last first*/
|
||
/*OOOOOOOOOOOOOOOO */
|
||
|
||
if (ulMaxPrint)
|
||
ucPrintedLength = (unsigned char)( ( ((unitAlloc)*p_uaPtr) - ulDebugInfoRemain)
|
||
* C_ucNbColumnForHisto / ulMaxPrint);/*lint !e613: Possible use of null pointer (p_uaPtr)*/
|
||
else ucPrintedLength = 0;
|
||
if (ucPrintedLength == 0) ucPrintedLength=1;
|
||
for (uwI=0; uwI < ucPrintedLength; uwI++){
|
||
a_cMap[uwI]='O';
|
||
}
|
||
a_cMap[uwI]='\n';
|
||
a_cMap[uwI+1]='\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
Mmg_fn_v_PrintInfoMalloc ("Remain (last Free space):\n");
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
ulLength = *p_uaPtr;/*lint !e613: Possible use of null pointer (p_uaPtr)*/
|
||
ulLength -=ulDebugInfoRemain;
|
||
ulLength <<= C_uwShiftAllocSize;
|
||
if ((unsigned long)p_stMyBlockInfo->p_cEndBlock - (unsigned long)p_stMyBlockInfo->p_cBeginBlock + 1 - (ulDebugInfoRemain<<C_uwShiftAllocSize))
|
||
sprintf (a_cLine, "\t-Size : %db (%.2fKb; %.2fMb) = %.2f%% of the all the available space\n", ulLength, (float)ulLength / 1024, (float)ulLength / (1024*1024), (float) ulLength*100 /(float)((unsigned long)p_stMyBlockInfo->p_cEndBlock - (unsigned long)p_stMyBlockInfo->p_cBeginBlock + 1 - (ulDebugInfoRemain<<C_uwShiftAllocSize)));/*lint !e790: Suspicious truncation, integral to float*/
|
||
else
|
||
sprintf (a_cLine, "\t-Size : %db (%.2fKb; %.2fMb)\n", ulLength, (float)ulLength / 1024, (float)ulLength / (1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
a_cMap[uwI+1]='\n';
|
||
a_cMap[uwI+2]='\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}/*lint !e715: p_stMyBlockInfo&ucBlockId& (line 2075) not referenced*/
|
||
/* end of Mmg_fn_vPrintBlockStatistic*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vPrintDynamicMallocStatistic
|
||
DESCRIPTION : Print statistic on a dynamic allocation of a module (only in debug mode)
|
||
INPUT : Module Id
|
||
Pointer on block info structure
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __DYNAMIC_MALLOC_ALLOWED__
|
||
void Mmg_fn_vPrintDynamicMallocStatistic (unsigned char ucModuleId, struct tdstDynInfo_ *p_stMyDynInfo){
|
||
/* -------------------------------*/
|
||
tdstMallocInfo * p_stMyMallocInfo;
|
||
unsigned long ulI;
|
||
unsigned long ulMaxPrint;
|
||
unsigned long ulLargestMalloc=0, ulSmallestMalloc=0xffffffff;
|
||
unsigned long ulIdLargestMalloc=0xffffffff,ulIdSmallestMalloc=0xffffffff;
|
||
unsigned char ucPrintedLength;
|
||
unsigned long ulLengthMalloc=0, ulLength, ulLoss;
|
||
char a_cMap [C_ucNbColumnForHisto+3];/* +3 for '\n'+(\n)+'\0'*/
|
||
char a_cLine [C_ucNbPrintedColumn];
|
||
|
||
/* look for the maximum & mimimum size of all the mallocs*/
|
||
p_stMyMallocInfo = p_stMyDynInfo->d_stDynamicMallocInfo;
|
||
for (ulI=0; ulI<p_stMyDynInfo->ulNbDynamicMalloc; ulI++, p_stMyMallocInfo++){
|
||
ulLength = (unsigned long)(*((unitAlloc *)p_stMyMallocInfo->p_cBeginMalloc - C_ucMallocHeaderSize));
|
||
ulLengthMalloc += ulLength;
|
||
if (ulLength>ulLargestMalloc){
|
||
ulLargestMalloc = ulLength;
|
||
ulIdLargestMalloc = ulI;
|
||
}
|
||
if (ulLength<ulSmallestMalloc){
|
||
ulSmallestMalloc = ulLength;
|
||
ulIdSmallestMalloc = ulI;
|
||
}
|
||
}
|
||
*a_cLine= '\n';
|
||
Erm_M_GetModuleInformation(a_cLine+1, ucModuleId);
|
||
sprintf (a_cLine+strlen(a_cLine),":\n");
|
||
Mmg_fn_v_PrintInfoMalloc(a_cLine );
|
||
|
||
Mmg_fn_v_PrintInfoMalloc ("==================================\n");
|
||
sprintf (a_cLine," Statistics of dynamic allocation :\n");
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
Mmg_fn_v_PrintInfoMalloc ("==================================\n");
|
||
sprintf (a_cLine, "\t-%d requested reallocations\n\n",p_stMyDynInfo->ulNbTotalDynamicRealloc);
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
|
||
/************************************/
|
||
/* the allocated space without loss*/
|
||
/************************************/
|
||
|
||
ulLoss = p_stMyDynInfo->ulNbDynamicMalloc * (C_ucMallocHeaderSize+C_ucMallocFooterSize-C_ucOptimizedMallocHeaderSize-C_ucOptimizedMallocFooterSize);
|
||
ulMaxPrint = M_Max(ulLoss, ulLengthMalloc);/* why not! ulLoss > ulLengthMalloc ?*/
|
||
ulLength = ulLengthMalloc - ulLoss;
|
||
|
||
if (ulMaxPrint){
|
||
ucPrintedLength = (unsigned char)(
|
||
ulLengthMalloc
|
||
* C_ucNbColumnForHisto / ulMaxPrint);
|
||
}
|
||
else ucPrintedLength = 0;
|
||
if (ucPrintedLength == 0) ucPrintedLength=1;
|
||
for (ulI=0; ulI < ucPrintedLength; ulI++){
|
||
a_cMap[ulI]='*';
|
||
}
|
||
a_cMap[ulI]='\n';
|
||
a_cMap[ulI+1]='\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
Mmg_fn_v_PrintInfoMalloc ("Total allocated space without loss:\n");
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
ulLengthMalloc <<= C_uwShiftAllocSize;
|
||
sprintf (a_cLine, "\t-Request:%d; current:%d; size : \t%db (%.2fKb; %.2fMb)\n",p_stMyDynInfo->ulNbTotalDynamicMalloc, p_stMyDynInfo->ulNbDynamicMalloc, ulLengthMalloc, (float)ulLengthMalloc / 1024, (float)ulLengthMalloc / (1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
ulLargestMalloc <<= C_uwShiftAllocSize;
|
||
sprintf (a_cLine, "\t-The Largest Allocation: \t%db (%.2fKb; %.2fMb)\n", ulLargestMalloc, (float)ulLargestMalloc/ 1024, (float)ulLargestMalloc/ (1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
ulSmallestMalloc <<= C_uwShiftAllocSize;
|
||
sprintf (a_cLine, "\t-The Smallest Allocation: \t%db (%.2fKb; %.2fMb)\n", ulSmallestMalloc, (float)ulSmallestMalloc/ 1024, (float)ulSmallestMalloc/ (1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
if (p_stMyDynInfo->ulNbDynamicMalloc){
|
||
sprintf (a_cLine, "\t-The average Allocation: \t%db (%.2fKb; %.2fMb)\n", ulLengthMalloc/p_stMyDynInfo->ulNbDynamicMalloc, ((float)ulLengthMalloc/(float)p_stMyDynInfo->ulNbDynamicMalloc)/ 1024, ((float)ulLengthMalloc/(float)p_stMyDynInfo->ulNbDynamicMalloc)/ (1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
}
|
||
a_cMap[ulI+1]='\n';
|
||
a_cMap[ulI+2]='\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
ulLengthMalloc >>= C_uwShiftAllocSize;/* restore the unitAlloc unit*/
|
||
|
||
/*+++++++++++++++++++++++++++++*/
|
||
/* the loss of allocated space*/
|
||
/*+++++++++++++++++++++++++++++*/
|
||
if (ulMaxPrint) ucPrintedLength = (unsigned char)(ulLoss * C_ucNbColumnForHisto / ulMaxPrint);
|
||
else ucPrintedLength = 0;
|
||
if (ucPrintedLength == 0) ucPrintedLength=1;
|
||
for (ulI=0; ulI < ucPrintedLength; ulI++){
|
||
a_cMap[ulI]='+';
|
||
}
|
||
a_cMap[ulI]='\n';
|
||
a_cMap[ulI+1]='\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
Mmg_fn_v_PrintInfoMalloc ("The debug loss of the allocated space:\n");
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
ulLength = ulLoss;
|
||
ulLength <<= C_uwShiftAllocSize;
|
||
if ((ulLengthMalloc << C_uwShiftAllocSize)+ulLength)
|
||
sprintf (a_cLine, "\t-Size : %db (%.2fKb; %.2fMb) = %.2f%% of all the allocation space\n", ulLength, (float)ulLength / 1024, (float)ulLength / (1024*1024), (float)ulLength*100/(float)((ulLengthMalloc << C_uwShiftAllocSize)+ulLength));/*lint !e790: Suspicious truncation, integral to float*/
|
||
else
|
||
sprintf (a_cLine, "\t-Size : %db (%.2fKb; %.2fMb)\n", ulLength, (float)ulLength / 1024, (float)ulLength / (1024*1024));
|
||
Mmg_fn_v_PrintInfoMalloc (a_cLine);
|
||
a_cMap[ulI+1]='\n';
|
||
a_cMap[ulI+2]='\0';
|
||
Mmg_fn_v_PrintInfoMalloc (a_cMap);
|
||
}/*lint !e715: p_stMyDynInfo&szModuleName (line 2521) not referenced*/
|
||
#endif/* __DYNAMIC_MALLOC_ALLOWED__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
/* end of Mmg_fn_vPrintDynamicMallocStatistic */
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_v_ClearLogFile
|
||
DESCRIPTION : Clear the log file C_szMmgLogFileName
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_v_ClearLogFile(){
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
FILE *hpMmgLogFile;
|
||
remove (C_szMmgLogFileName);/*lint !e534*/
|
||
hpMmgLogFile = fopen( C_szMmgLogFileName, "w" );
|
||
#ifdef _DEBUG
|
||
if (GetLastError())
|
||
{
|
||
LPVOID lpMsgBuf;
|
||
|
||
FormatMessage(
|
||
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
|
||
NULL,
|
||
GetLastError(),
|
||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language*/
|
||
(LPTSTR) &lpMsgBuf,
|
||
0,
|
||
NULL
|
||
);/*lint !e534*/
|
||
|
||
/* Display the string.*/
|
||
Erm_fn_iMessageBox(lpMsgBuf, C_szMmgLogFileName, MB_OK|MB_ICONINFORMATION );
|
||
|
||
/* Free the buffer.*/
|
||
LocalFree( lpMsgBuf );
|
||
}
|
||
#endif /*_DEBUG*/
|
||
if (hpMmgLogFile) fclose(hpMmgLogFile);
|
||
|
||
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}
|
||
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_v_PrintInfoMalloc
|
||
DESCRIPTION : Add a string in the log file C_szMmgLogFileName
|
||
INPUT : String to print
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_v_PrintInfoMalloc(char *p_cTxt)
|
||
{
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
FILE *hpMmgLogFile;
|
||
hpMmgLogFile = fopen( C_szMmgLogFileName, "a" );
|
||
if (hpMmgLogFile){
|
||
fprintf (hpMmgLogFile,"%s", p_cTxt);
|
||
fclose(hpMmgLogFile);
|
||
}
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}
|
||
|
||
|
||
|
||
/* ##-###########################
|
||
## debug function just for the developper
|
||
############################## */
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vTestNbFreeIntheCurentMode
|
||
DESCRIPTION : Check the validity of nb frre on a channel(only in debug mode)
|
||
INPUT : Channel Id
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_vTestNbFreeIntheCurentMode(unsigned char ucChannel)
|
||
/*not use for the moment*/
|
||
{
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
tdstBlockInfoPriv * p_stMyBlockInfo = (tdstBlockInfoPriv *) g_d_stCurrentModeInfo[ucChannel].p_vTdstBlockInfoOrTdstDynInfo;
|
||
unitAlloc * p_uaTmp;/*temporary pointer: if we reduce the allocation p_uaTmp=pointer at the new free space. // !! voir a renomer*/
|
||
unsigned short uwI;
|
||
|
||
/* count the real number of free*/
|
||
p_uaTmp = (unitAlloc*)p_stMyBlockInfo->p_cFirstFree;
|
||
for (uwI=0; *(p_uaTmp+1) != (unitAlloc)0; uwI++, p_uaTmp = (unitAlloc*) *(p_uaTmp+1));/*lint !e722: Suspicious use of ;*/
|
||
if (p_stMyBlockInfo->uwNbFree != uwI){
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
sprintf(szErrTxt, "uwNbFree(%d) != the real number of actual free(%d)\n", p_stMyBlockInfo->uwNbFree, uwI);
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBbFree, szErrTxt, ucChannel);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithCurrentModeInfo (E_uwMmgPbBbFree, szErrTxt, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
#endif /*__WARNING3_ERR_MMG__*/
|
||
p_stMyBlockInfo->uwNbFree = uwI;
|
||
}
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
}
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vTestNbFree
|
||
DESCRIPTION : Check the validity of nb free in a static bloc (only in debug mode)
|
||
INPUT : Module Id
|
||
Block Id
|
||
Pointer on a block info structure
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_vTestNbFree(unsigned char ucModuleId, unsigned char ucBlockId, struct tdstBlockInfoPriv_ *p_stBlockInfo)
|
||
{
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
unitAlloc * p_uaTmp;/*temporary pointer: if we reduce the allocation p_uaTmp=pointer at the new free space. // !! voir a renomer*/
|
||
unsigned short uwI;
|
||
|
||
/* if (p_stBlockInfo->p_cFirstFree != p_stBlockInfo->p_cEndBlock) {*/
|
||
/* count the real number of free*/
|
||
p_uaTmp = (unitAlloc*)p_stBlockInfo->p_cFirstFree;
|
||
for (uwI=0; *(p_uaTmp+1) != (unitAlloc)0; uwI++, p_uaTmp = (unitAlloc*) *(p_uaTmp+1));/*lint !e722: Suspicious use of ;*/
|
||
if (p_stBlockInfo->uwNbFree != uwI){
|
||
#ifdef __WARNING3_ERR_MMG__
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
sprintf(szErrTxt, "uwNbFree(%d) != the real number of actual free(%d)\n", p_stBlockInfo->uwNbFree, uwI);
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(ucModuleId, ucBlockId, E_uwMmgPbBbFree, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastErrorWithModuleIdAnducModeReference(ucModuleId, ucBlockId, E_uwMmgPbBbFree, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
|
||
#endif /*__WARNING3_ERR_MEM__*/
|
||
|
||
p_stBlockInfo->uwNbFree = uwI;
|
||
}
|
||
/* }*/
|
||
#endif /* __DEBUG_MALLOC_MODE__*/
|
||
}/*lint !e715*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vBlockGarbageCollector4Ch
|
||
DESCRIPTION : Do a garbage collector on a block, beware all pointer that point into
|
||
the bloc must be pass in parameter (even local pointer in the block)
|
||
INPUT : Table of pointer (point into the block)
|
||
Max Malloc in the block
|
||
Channel Id
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_vBlockGarbageCollector4Ch(void** a_pp_vTab[], unsigned short uwMaxNbMallocInBlock, unsigned char ucChannel){
|
||
unsigned short uwI, uwJ;
|
||
void ** pp_vTmp;
|
||
char *p_cMyFirstFree = ((tdstBlockInfoPriv *)(g_d_stCurrentModeInfo[ucChannel].p_vTdstBlockInfoOrTdstDynInfo))->p_cFirstFree;
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
char szTxt[100];
|
||
char * p_vSv;
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
|
||
|
||
#ifdef D_CheckSystemForBlockWithoutFree
|
||
if (p_cMyFirstFree == C_FirstFreeValueForBlockWithoutFree){
|
||
Mmg_M_UpdateLastError(E_uwMmgPbNoAvailableFunctionForBlockWithoutFree, NULL)
|
||
}
|
||
#endif /*D_CheckSystemForBlockWithoutFree*/
|
||
|
||
|
||
/* sort a_pp_cTab*/
|
||
for (uwI=0; uwI < /*C_uwNumberOfMallocMax*/uwMaxNbMallocInBlock-1; uwI++){
|
||
for (uwJ=(unsigned short)(uwI+1); uwJ < uwMaxNbMallocInBlock; uwJ++){
|
||
if (*(a_pp_vTab[uwJ]) < *(a_pp_vTab[uwI])){
|
||
pp_vTmp = a_pp_vTab[uwI];
|
||
a_pp_vTab[uwI] = a_pp_vTab[uwJ];
|
||
a_pp_vTab[uwJ] = pp_vTmp;
|
||
}
|
||
}
|
||
}
|
||
|
||
for( uwI = 0; uwI < uwMaxNbMallocInBlock; uwI++ ){
|
||
|
||
if (*(a_pp_vTab[uwI])>(void *) p_cMyFirstFree ){
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
p_vSv = (void *) (*(a_pp_vTab[uwI]));
|
||
*(a_pp_vTab[uwI]) = (void *) Mmg_fn_p_vRealloc (*(a_pp_vTab[uwI]),((*(((unitAlloc *)(*(a_pp_vTab[uwI]))) - 2)) - (C_ucMallocHeaderSize + C_ucMallocFooterSize))<<C_uwShiftAllocSize);/* 2 for the [starting key] + [size of the malloc]*/
|
||
sprintf (szTxt, "Mmg_fn_p_vRealloc (0X%X,%d) ==> 0X%X\n", p_vSv, ((*(((unitAlloc *)(*(a_pp_vTab[uwI]))) - 2)) - (C_ucMallocHeaderSize + C_ucMallocFooterSize))<<C_uwShiftAllocSize, *(a_pp_vTab[uwI]) );
|
||
Mmg_fn_v_PrintInfoMalloc (szTxt);
|
||
#else /*__DEBUG_MALLOC_MODE__*/
|
||
*(a_pp_vTab[uwI]) = (void *) Mmg_fn_p_vRealloc (*(a_pp_vTab[uwI]),((*(((unitAlloc *)(*(a_pp_vTab[uwI]))) - 1)) - (C_ucMallocHeaderSize + C_ucMallocFooterSize))<<C_uwShiftAllocSize);/* 1 for the [size of the malloc]*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}
|
||
}
|
||
}/*Mmg_fn_vBlockGarbageCollector*/
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vBlockGarbageCollector4Ch
|
||
DESCRIPTION : return Block Id & beginning address if found
|
||
INPUT : Pointer on a zone
|
||
pointer to stock the block Id
|
||
pointer to stock the beginning address of the block
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_vWhereIs (void * p_vPtr, unsigned short *p_uwModuleBlockId, void ** pp_vBeginAdr){
|
||
unsigned char ucModuleId, ucBlockId;
|
||
tdstBlockInfoPriv *a_stMyBlockInfo;
|
||
|
||
*p_uwModuleBlockId = 0xFFFF;
|
||
for (ucModuleId=0; (ucModuleId<g_ucErmNbOfModule) && (*p_uwModuleBlockId == 0xFFFF); ucModuleId++){
|
||
a_stMyBlockInfo = g_a_p_stMmgModuleBlocksInfo[ucModuleId];
|
||
if (a_stMyBlockInfo != NULL){
|
||
for (ucBlockId=0; (ucBlockId<g_a_ucBlocksNbInModule[ucModuleId]) && (*p_uwModuleBlockId == 0xFFFF); ucBlockId++, a_stMyBlockInfo++){
|
||
if ( (a_stMyBlockInfo != NULL) && (a_stMyBlockInfo->p_cBeginBlock != C_p_cBlockNotValidKey)){
|
||
if ((p_vPtr >= (void *)a_stMyBlockInfo->p_cBeginBlock) && (p_vPtr <= (void *)a_stMyBlockInfo->p_cEndBlock)){
|
||
*p_uwModuleBlockId = (ucModuleId<<8) | ucBlockId;
|
||
*pp_vBeginAdr = (void *)a_stMyBlockInfo->p_cBeginBlock;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#ifdef __FATAL_ERR_MMG__
|
||
#ifdef _DEBUG
|
||
if (*p_uwModuleBlockId == 0xFFFF){
|
||
char szTxt[50];
|
||
sprintf (szTxt, "In Mmg_fn_vWhereIs(0X%X, ...)\n", p_vPtr);
|
||
Mmg_M_UpdateLastErrorWithoutMessage(E_uwMmgPbInvalidStaticAddress,szTxt);
|
||
}
|
||
#endif /*_DEBUG*/
|
||
#endif __FATAL_ERR_MMG__
|
||
}/*Mmg_fn_vWhereIs */
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_p_vGiveTheBeginingAddress
|
||
DESCRIPTION : return the beginning address of a block
|
||
INPUT : Block Id
|
||
OUTPUT : address of the block beginning
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void * Mmg_fn_p_vGiveTheBeginingAddress (unsigned short uwModuleBlockId){
|
||
unsigned char ucModuleId = uwModuleBlockId>>8;
|
||
unsigned char ucBlockId = uwModuleBlockId & 0xFF;
|
||
|
||
#if defined(__FATAL_ERR_MMG__) && defined(_DEBUG)
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
#endif /*__ERROR_STRINGS__*/
|
||
if (ucModuleId >= g_ucErmNbOfModule){
|
||
char szTxt[50];
|
||
sprintf (szTxt, "ModuleId = %d, but only %d modules are initialized \n", ucModuleId, g_ucErmNbOfModule);
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidModuleId,szTxt);
|
||
}
|
||
if (g_a_p_stMmgModuleBlocksInfo[ucModuleId]== NULL){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "In Module:[");
|
||
Erm_M_GetModuleInformation(szErrTxt+strlen(szErrTxt), ucModuleId);
|
||
sprintf (szErrTxt+strlen(szErrTxt), "]\n");
|
||
Mmg_M_UpdateLastError(E_uwMmgPbNoStaticMemory,szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbNoStaticMemory,NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
if (ucBlockId >= g_a_ucBlocksNbInModule[ucModuleId]){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "BlockId = %d, but there are only %d Block\nin the module [", ucBlockId, g_a_ucBlocksNbInModule[ucModuleId]);
|
||
Erm_M_GetModuleInformation(szErrTxt+strlen(szErrTxt), ucModuleId);
|
||
sprintf (szErrTxt+strlen(szErrTxt), "]\n");
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlockId,szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlockId,NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
if ((g_a_p_stMmgModuleBlocksInfo[ucModuleId])[ucBlockId].p_cBeginBlock == C_p_cBlockNotValidKey){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "The Block#%d in the module [", ucBlockId);
|
||
Erm_M_GetModuleInformation(szErrTxt+strlen(szErrTxt), ucModuleId);
|
||
sprintf (szErrTxt+strlen(szErrTxt), "] is not valide:\nit's should be not well initialize ! Because :\np_cBeginBlock = C_p_cBlockNotValidKey (0X%X)\n", C_p_cBlockNotValidKey);
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlockId,szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlockId,NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*defined(__FATAL_ERR_MMG__) && defined(_DEBUG)*/
|
||
return ((g_a_p_stMmgModuleBlocksInfo[ucModuleId])[ucBlockId].p_cBeginBlock);
|
||
|
||
}/*Mmg_fn_p_vGiveTheBeginingAddress*/
|
||
|
||
#ifdef _DEBUG
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vLockAlloaction
|
||
DESCRIPTION : Allow blocking of all alloc operation
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_vLockAlloaction(){
|
||
g_ucBLockedAllocation = C_ucTrue;
|
||
}
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vUnLockAlloaction
|
||
DESCRIPTION : Allow unblocking of all alloc operation
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_vUnLockAlloaction(){
|
||
g_ucBLockedAllocation = C_ucFalse;
|
||
}
|
||
#endif _DEBUG
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_ucGiveChannelId
|
||
DESCRIPTION : Provide a unique channel identificator for a couple (Thraed,group)
|
||
BEWARE : always use the default group
|
||
INPUT : Thraed Id
|
||
Group Id
|
||
OUTPUT : Channel Id
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
LAST MODIFICATIONS : 25-11-97/Carlos Torres Check group & re-use of release channel
|
||
=======================================================================================*/
|
||
unsigned char Mmg_fn_ucGiveChannelId(unsigned long ulThreadId, unsigned char ucGroupId){
|
||
unsigned char ucI= 1;/*1 for jump the defaulf channel*/
|
||
unsigned char b_ucFound = C_ucFalse;
|
||
tdstChannelInfo * p_stChannelInfo = g_stGeneralChannelInfo.d_stTabChannelInfo+1;/*1 for jump the defaulf channel*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* cannot release channel already release*/
|
||
if (ucGroupId != C_ucMmgDefaultGroup) {
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
sprintf (szErrTxt, "You choose the group %d to obtain a channel",ucGroupId);
|
||
Mmg_M_UpdateLastError(E_uwMmgInvalidGroup, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgInvalidGroup, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif
|
||
|
||
/* try to find an existing channel or a free channel*/
|
||
while((ucI < g_stGeneralChannelInfo.ucNbchannelUsed) &&
|
||
(!b_ucFound) &&
|
||
(p_stChannelInfo->ucGroupId == C_ucMmgDefaultGroup)) {
|
||
if ((p_stChannelInfo->ulThreadId == ulThreadId) && (p_stChannelInfo->ucGroupId == ucGroupId)) {
|
||
b_ucFound = C_ucTrue;
|
||
}
|
||
else {
|
||
ucI++;
|
||
p_stChannelInfo++;
|
||
}
|
||
}
|
||
|
||
if (b_ucFound) {
|
||
return ucI;
|
||
}
|
||
else {/*! b_ucFound*/
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
if (ucI >= g_stGeneralChannelInfo.ucMAxNbChannel){
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
sprintf (szErrTxt, "You can only use %d channel(s) available\nPlease check the ucMaxNbChannel parameter when you call Mmg_fn_vFirstInitMmgModule() function", g_stGeneralChannelInfo.ucMAxNbChannel);
|
||
Mmg_M_UpdateLastError(E_uwMmgPbTooManyChannel, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbTooManyChannel, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /* __DEBUG_MALLOC_MODE__ */
|
||
|
||
p_stChannelInfo->ulThreadId = ulThreadId;
|
||
p_stChannelInfo->ucGroupId = ucGroupId;
|
||
|
||
/* set the last channel used*/
|
||
if (ucI == g_stGeneralChannelInfo.ucNbchannelUsed)
|
||
g_stGeneralChannelInfo.ucNbchannelUsed++;
|
||
return (ucI);
|
||
}
|
||
}/*Mmg_fn_ucGiveChannelId*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_ucGiveChannelId
|
||
DESCRIPTION : Provide a unique channel identificator for a couple (Thraed,group)
|
||
BEWARE : always use the default group
|
||
INPUT : Thraed Id
|
||
Group Id
|
||
OUTPUT : Channel Id
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
void Mmg_fn_vReleaseChannelId(unsigned char ucChannelId) {
|
||
/* get channel info in the table*/
|
||
tdstChannelInfo * p_stChannelInfo = g_stGeneralChannelInfo.d_stTabChannelInfo+ucChannelId;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
/* cannot release default channel*/
|
||
if (ucChannelId == C_ucMmgDefaultChannel) {
|
||
Mmg_M_UpdateLastError(E_uwMmgPbDftChannelCannotBeFree, NULL);
|
||
return;
|
||
}
|
||
|
||
/* cannot release channel >= MaxChannel */
|
||
if (ucChannelId >= g_stGeneralChannelInfo.ucMAxNbChannel) {
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
sprintf (szErrTxt, "You try to release the channel %d, but you can only use %d channel",ucChannelId, g_stGeneralChannelInfo.ucMAxNbChannel);
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalChannel, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalChannel, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
return;
|
||
}
|
||
|
||
/* cannot release channel already release*/
|
||
if ((p_stChannelInfo->ucGroupId != C_ucMmgDefaultGroup) ||
|
||
(ucChannelId >= g_stGeneralChannelInfo.ucNbchannelUsed)) {
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
sprintf (szErrTxt, "You try to release the channel %d, but it was already released",ucChannelId);
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalChannel, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalChannel, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
return;
|
||
}
|
||
#endif
|
||
|
||
/* set invalid group*/
|
||
p_stChannelInfo->ucGroupId = C_ucMmgInvalidGroup;
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_v_SetModeAlloc
|
||
DESCRIPTION : Set the mode dynamic or static (choosing a block) for a channel
|
||
INPUT : Module Id
|
||
New Mode
|
||
Channel Id
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_v_SetModeAlloc(unsigned char ucModuleId, unsigned char ucNewMode, unsigned char ucChannel)
|
||
/* ------------------ */
|
||
{
|
||
(g_d_stCurrentModeInfo[ucChannel]).ucMode = (ucNewMode);
|
||
(g_d_stCurrentModeInfo[ucChannel]).ucModuleId = ucModuleId;
|
||
if ((ucNewMode) != E_ucDynamic){
|
||
(g_d_stCurrentModeInfo[ucChannel]).p_vTdstBlockInfoOrTdstDynInfo = (void *) (g_a_p_stMmgModuleBlocksInfo[ucModuleId]+ucNewMode);
|
||
}
|
||
else{
|
||
#ifdef __DYNAMIC_MALLOC_ALLOWED__
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
(g_d_stCurrentModeInfo[ucChannel]).p_vTdstBlockInfoOrTdstDynInfo = (void *) g_d_p_stMmgModuleDynInfo[ucModuleId];
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
#else /*__DYNAMIC_MALLOC_ALLOWED__*/
|
||
(g_d_stCurrentModeInfo[ucChannel]).p_vTdstBlockInfoOrTdstDynInfo = NULL;
|
||
Mmg_M_UpdateFatalDebugError(E_uwMmgPbCanNotUseDynMode);
|
||
#endif /*__DYNAMIC_MALLOC_ALLOWED__*/
|
||
}
|
||
}/*Mmg_fn_v_SetModeAlloc*/
|
||
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vFirstInitMmgModule
|
||
DESCRIPTION : Initialization of the Mmg module MUST be use before using MMG functions
|
||
INPUT : Max number of channel authorized
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_vFirstInitMmgModule (unsigned char ucMaxNbChannel){
|
||
unsigned char ucI;
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
#endif /*__ERROR_STRINGS__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if ((ucMaxNbChannel < 1) || (ucMaxNbChannel > C_MaxNbPossibleChannel)) {
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "The range of ucMaxNbChannel is [1, C_MaxNbPossibleChannel=%d], But Your ucMaxNbChannel =%d", C_MaxNbPossibleChannel, ucMaxNbChannel);
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalNbOfChannel, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalNbOfChannel, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
g_d_stCurrentModeInfo = (struct tdstCurrentModeInfo_ *) malloc (ucMaxNbChannel * sizeof (struct tdstCurrentModeInfo_));
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (g_d_stCurrentModeInfo == NULL){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "g_d_stCurrentModeInfo is not allocated");
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInFirstInitMmgModule, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInFirstInitMmgModule, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
g_stGeneralChannelInfo.d_stTabChannelInfo = (struct tdstChannelInfo_ *) malloc (ucMaxNbChannel * sizeof (struct tdstChannelInfo_ ));
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (g_stGeneralChannelInfo.d_stTabChannelInfo == NULL){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "g_stGeneralChannelInfo.d_stTabChannelInfo is not allocated");
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInFirstInitMmgModule, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInFirstInitMmgModule, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
g_stGeneralChannelInfo.ucMAxNbChannel = ucMaxNbChannel;
|
||
g_stGeneralChannelInfo.ucNbchannelUsed = 1;
|
||
|
||
#ifdef __DYNAMIC_MALLOC_ALLOWED__
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
g_d_p_stMmgModuleDynInfo = (struct tdstDynInfo_ **) malloc (sizeof(struct tdstDynInfo_ *) * C_ucNbOfMaxModule);
|
||
if (g_d_p_stMmgModuleDynInfo == NULL){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "g_d_p_stMmgModuleDynInfo is not allocated");
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInFirstInitMmgModule, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInFirstInitMmgModule, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
#endif /*__DYNAMIC_MALLOC_ALLOWED__*/
|
||
|
||
for (ucI=0; ucI<C_ucNbOfMaxModule; ucI++) {
|
||
g_a_p_stMmgModuleBlocksInfo[ucI] = NULL;
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __DYNAMIC_MALLOC_ALLOWED__
|
||
g_d_p_stMmgModuleDynInfo[ucI] = NULL;
|
||
#endif /*__DYNAMIC_MALLOC_ALLOWED__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}
|
||
Mmg_MCreateCriticalSection();
|
||
}/*Mmg_fn_vFirstInitMmgModule*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vStopMmgModule
|
||
DESCRIPTION : Destroy all ressource allocated by MMG. MUST be use before the end of the program
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
||
void Mmg_fn_vStopMmgModule(){
|
||
unsigned char ucI;
|
||
for (ucI = 0; ucI < g_ucErmNbOfModule; ucI++){/* scan each module*/
|
||
Mmg_fn_v_StopMmg(ucI);
|
||
}
|
||
Mmg_MDeleteCriticalSection();
|
||
free (g_d_stCurrentModeInfo);
|
||
g_d_stCurrentModeInfo = NULL;
|
||
free (g_stGeneralChannelInfo.d_stTabChannelInfo);
|
||
g_stGeneralChannelInfo.d_stTabChannelInfo = NULL;
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
||
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_v_InitMmg
|
||
DESCRIPTION : Initialization of Mmg for another module. MUST be done before the module
|
||
can use MMG functions.
|
||
INPUT : Module Id
|
||
Max static block
|
||
Max dynamic allocation allowed
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_v_InitMmg(unsigned char ucModuleId, unsigned char ucMaxBlocksNb, unsigned long ulMaxNbDynamicMalloc)
|
||
/* ---------------- */
|
||
{
|
||
unsigned char ucI;
|
||
tdstBlockInfoPriv *p_stMyBlockInfo;
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
#endif /*__ERROR_STRINGS__*/
|
||
if (ucModuleId == C_ucModuleNotInitialized){
|
||
Mmg_M_UpdateFatalDebugError(E_uwMmgPbCanNotInitMmg);
|
||
}
|
||
else{
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
#if (defined(USE_PROFILER) && !defined(U64))
|
||
{
|
||
static long bFirstCall = TRUE;
|
||
if (bFirstCall)
|
||
{
|
||
MMG_fn_vInitMemoryRasterDeclaration ();
|
||
bFirstCall = FALSE;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
if (ucMaxBlocksNb > 0){
|
||
g_a_p_stMmgModuleBlocksInfo[ucModuleId] = (tdstBlockInfoPriv *) malloc (sizeof (tdstBlockInfoPriv) * ucMaxBlocksNb);
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
|
||
if (g_a_p_stMmgModuleBlocksInfo[ucModuleId] == NULL){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "The g_d_p_stMmgModuleDynInfo[%d] (i.e for the module ", ucModuleId);
|
||
Erm_M_GetModuleInformation(szErrTxt+strlen(szErrTxt), ucModuleId);
|
||
sprintf (szErrTxt+strlen(szErrTxt), ") is not allocated");
|
||
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInInitMmg, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInInitMmg, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
|
||
#ifdef __DYNAMIC_MALLOC_ALLOWED__
|
||
g_d_p_stMmgModuleDynInfo[ucModuleId] = (tdstDynInfo *) malloc (sizeof(tdstDynInfo));
|
||
if (g_d_p_stMmgModuleDynInfo[ucModuleId] == NULL){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "The g_d_p_stMmgModuleDynInfo[%d] (i.e for the module ", ucModuleId);
|
||
Erm_M_GetModuleInformation(szErrTxt+strlen(szErrTxt), ucModuleId);
|
||
sprintf (szErrTxt+strlen(szErrTxt), ") is not allocated");
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInInitMmg, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInInitMmg, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
g_d_p_stMmgModuleDynInfo[ucModuleId]->ulMaxNbDynamicMalloc = ulMaxNbDynamicMalloc;
|
||
g_d_p_stMmgModuleDynInfo[ucModuleId]->d_stDynamicMallocInfo = malloc (sizeof(tdstMallocInfo) * ulMaxNbDynamicMalloc);
|
||
if (g_d_p_stMmgModuleDynInfo[ucModuleId]->d_stDynamicMallocInfo == NULL){
|
||
#ifdef __ERROR_STRINGS__
|
||
sprintf (szErrTxt, "The g_d_p_stMmgModuleDynInfo[%d]->d_stDynamicMallocInfo (i.e for the module ", ucModuleId);
|
||
Erm_M_GetModuleInformation(szErrTxt+strlen(szErrTxt), ucModuleId);
|
||
sprintf (szErrTxt+strlen(szErrTxt), ") is not allocated");
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInInitMmg, szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInInitMmg, NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__DYNAMIC_MALLOC_ALLOWED__*/
|
||
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
for (ucI=0, p_stMyBlockInfo = g_a_p_stMmgModuleBlocksInfo[ucModuleId];ucI<ucMaxBlocksNb; ucI++, p_stMyBlockInfo++){
|
||
p_stMyBlockInfo->p_cBeginBlock = C_p_cBlockNotValidKey;
|
||
}
|
||
g_a_ucBlocksNbInModule[ucModuleId] = ucMaxBlocksNb;
|
||
}
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __DYNAMIC_MALLOC_ALLOWED__
|
||
Mmg_M_InitDynInfo(g_d_p_stMmgModuleDynInfo[ucModuleId]);
|
||
#endif /*__DYNAMIC_MALLOC_ALLOWED__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
}
|
||
Mmg_fn_v_ClearLogFile();
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}/*Mmg_fn_v_InitMmg*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_v_InitMmg
|
||
DESCRIPTION : Destroy all ressource allocated for the management of memory for a module
|
||
INPUT : Module Id
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
||
void Mmg_fn_v_StopMmg(unsigned char ucModuleId){
|
||
unsigned char ucI;
|
||
|
||
if (g_a_p_stMmgModuleBlocksInfo[ucModuleId]!= NULL){
|
||
/*delete evey initialized block */
|
||
for (ucI=0; ucI<g_a_ucBlocksNbInModule[ucModuleId]; ucI++){
|
||
if (g_a_p_stMmgModuleBlocksInfo[ucModuleId][ucI].p_cBeginBlock != C_p_cBlockNotValidKey){
|
||
/* the block right initialized*/
|
||
Mmg_fn_vDeleteBlock (ucI, ucModuleId, g_a_p_stMmgModuleBlocksInfo[ucModuleId]);
|
||
}
|
||
}
|
||
|
||
free (g_a_p_stMmgModuleBlocksInfo[ucModuleId]);
|
||
g_a_p_stMmgModuleBlocksInfo[ucModuleId] = NULL;
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __DYNAMIC_MALLOC_ALLOWED__
|
||
free(g_d_p_stMmgModuleDynInfo[ucModuleId]->d_stDynamicMallocInfo);
|
||
g_d_p_stMmgModuleDynInfo[ucModuleId]->d_stDynamicMallocInfo = NULL;
|
||
free (g_d_p_stMmgModuleDynInfo[ucModuleId]);
|
||
g_d_p_stMmgModuleDynInfo[ucModuleId] = NULL;
|
||
#endif /*__DYNAMIC_MALLOC_ALLOWED__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
}
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
||
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_v_PrintAllocationsUsedForMmg
|
||
DESCRIPTION : Print statistic concerning the memory used to manage allocation
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
void Mmg_fn_v_PrintAllocationsUsedForMmg(){
|
||
#ifdef __ERROR_STRINGS__
|
||
unsigned char ucI, ucJ, ucNbModuleUsedMmg =0;
|
||
unsigned long ulSize, ulStaticSubTotal,ulDynamicMemoryUsed = 0, ulStaticMemoryUsed = 0;
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
unsigned long ulSizeForTraceOfEachAllocation;
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
#ifdef __ADD_PLACE_FOR_DEBUG_INFORMATION__
|
||
unsigned long ulSize2;
|
||
#endif /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
#if defined(__DEBUG_MALLOC_MODE__) && defined(__DYNAMIC_MALLOC_ALLOWED__)
|
||
unsigned long ulDynamicSubTotal;
|
||
#endif /*defined(__DEBUG_MALLOC_MODE__) && defined(__DYNAMIC_MALLOC_ALLOWED__)*/
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
tdstBlockInfoPriv *p_stMyBlocksInfo;
|
||
|
||
Erm_fn_v_Printsz ("\n|-----------------------------------------|\n");
|
||
Erm_fn_v_Printsz ("| Memory Used for the management of Mmg : |\n");
|
||
Erm_fn_v_Printsz ("|-----------------------------------------|\n");
|
||
|
||
for (ucI = 0; ucI < g_ucErmNbOfModule; ucI++){/* scan each module*/
|
||
ulStaticSubTotal = 0;
|
||
#if defined(__DEBUG_MALLOC_MODE__) && defined(__DYNAMIC_MALLOC_ALLOWED__)
|
||
ulDynamicSubTotal = 0;
|
||
#endif/* defined(__DEBUG_MALLOC_MODE__) && defined(__DYNAMIC_MALLOC_ALLOWED__)*/
|
||
if (Mmg_M_b_ucTheModuleUseStaticMemory(ucI)){/*this module use the static memory and perhaps the dynamic*/
|
||
ucNbModuleUsedMmg ++;
|
||
sprintf (szErrTxt, "=> module (#%d) : ", ucI);
|
||
Erm_M_GetModuleInformation(szErrTxt+strlen(szErrTxt), ucI);
|
||
sprintf (szErrTxt+strlen(szErrTxt), "\n");
|
||
Erm_fn_v_Printsz (szErrTxt);
|
||
#if defined(__DEBUG_MALLOC_MODE__) && defined(__DYNAMIC_MALLOC_ALLOWED__)
|
||
ulSize = (sizeof(struct tdstDynInfo_) * C_ucNbOfMaxModule);
|
||
ulSize2 = sizeof(tdstMallocInfo) * g_d_p_stMmgModuleDynInfo[ucI]->ulMaxNbDynamicMalloc;
|
||
ulDynamicSubTotal = ulSize+ulSize2;
|
||
sprintf (szErrTxt, "\t-> Dynamic Memory : General data (%db)+ Data for %d allocations (%db) = %db (%.2fKb; %.2fMb)\n",
|
||
ulSize,
|
||
g_d_p_stMmgModuleDynInfo[ucI]->ulMaxNbDynamicMalloc, ulSize2,
|
||
ulDynamicSubTotal, (float)ulDynamicSubTotal/1024, (float)ulDynamicSubTotal/(1024*1024));
|
||
Erm_fn_v_Printsz (szErrTxt);
|
||
#endif /*defined (__DEBUG_MALLOC_MODE__) && defined(__DYNAMIC_MALLOC_ALLOWED__)*/
|
||
ulSize = (sizeof (tdstBlockInfoPriv) * Mmg_M_ucGetNbOfBlocksUsedInModule(ucI));
|
||
ulStaticSubTotal = ulSize;
|
||
sprintf (szErrTxt,"\t-> Static Memory : General Data for %d Block(s) = %d\n", Mmg_M_ucGetNbOfBlocksUsedInModule(ucI), ulSize);
|
||
Erm_fn_v_Printsz (szErrTxt);
|
||
for (ucJ=0, p_stMyBlocksInfo = g_a_p_stMmgModuleBlocksInfo[ucI]; ucJ<g_a_ucBlocksNbInModule[ucI]; ucJ++, p_stMyBlocksInfo++){
|
||
if (p_stMyBlocksInfo->p_cBeginBlock != C_p_cBlockNotValidKey){
|
||
#ifdef __ADD_PLACE_FOR_DEBUG_INFORMATION__
|
||
ulSize = (long) (p_stMyBlocksInfo->p_cEndBlock - p_stMyBlocksInfo->p_cBeginBlock)+1;
|
||
ulSize2 = (p_stMyBlocksInfo->ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<<C_uwShiftAllocSize));
|
||
ulSizeForTraceOfEachAllocation =
|
||
ulStaticSubTotal += ulSize;
|
||
sprintf (szErrTxt, "\t\t* Block #%d: %db allocated + %db for 2*%d 'Check Keys' = %db (%.2fKb; %.2fMb)\n",
|
||
ucJ,
|
||
ulSize-ulSize2,
|
||
ulSize2, p_stMyBlocksInfo->ulMaxNbStaticMalloc,
|
||
ulSize, (float)ulSize/1024, (float)ulSize/(1024*1024));
|
||
Erm_fn_v_Printsz (szErrTxt);
|
||
#else /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
ulSize =(long) (p_stMyBlocksInfo->p_cEndBlock - p_stMyBlocksInfo->p_cBeginBlock+1);
|
||
ulStaticSubTotal += ulSize;
|
||
sprintf (szErrTxt, "\t\t* Block #%d: %db (%.2fKb; %.2fMb) allocated\n",
|
||
ucJ, ulSize, (float)ulSize/1024, (float)ulSize/(1024*1024));
|
||
Erm_fn_v_Printsz (szErrTxt);
|
||
#endif /*__ADD_PLACE_FOR_DEBUG_INFORMATION__*/
|
||
}/*end of the if p_stMyBlockInfo->p_cBeginBlock != C_p_cBlockNotValidKey*/
|
||
}/*end of for*/
|
||
|
||
#if defined(__DEBUG_MALLOC_MODE__) && defined(__DYNAMIC_MALLOC_ALLOWED__)
|
||
ulSize = ulDynamicSubTotal + ulStaticSubTotal;
|
||
sprintf (szErrTxt,"\t-> Total Memory for the module #%d: Dynamic (%db)+ Static (%db) = %db (%.2fKb; %.2fMb)\n",
|
||
ucI,
|
||
ulDynamicSubTotal, ulStaticSubTotal,
|
||
ulSize, (float)ulSize/1024, (float)ulSize/(1024*1024));
|
||
Erm_fn_v_Printsz (szErrTxt);
|
||
#else /*defined(__DEBUG_MALLOC_MODE__) && defined(__DYNAMIC_MALLOC_ALLOWED__)*/
|
||
sprintf (szErrTxt,"\t-> Total Static Memory for the module #%d: %db (%.2fKb; %.2fMb)\n",
|
||
ucI,
|
||
ulStaticSubTotal, (float)ulStaticSubTotal/1024, (float)ulStaticSubTotal/(1024*1024));
|
||
Erm_fn_v_Printsz (szErrTxt);
|
||
#endif /*defined(__DEBUG_MALLOC_MODE__) && defined(__DYNAMIC_MALLOC_ALLOWED__)*/
|
||
}/* end if module used memeory.*/
|
||
#if defined(__DEBUG_MALLOC_MODE__) && defined(__DYNAMIC_MALLOC_ALLOWED__)
|
||
ulDynamicMemoryUsed+=ulDynamicSubTotal;
|
||
#endif /*defined(__DEBUG_MALLOC_MODE__) && defined(__DYNAMIC_MALLOC_ALLOWED__)*/
|
||
ulStaticMemoryUsed+=ulStaticSubTotal;
|
||
}/*for ucI*/
|
||
#if defined(__DEBUG_MALLOC_MODE__) && defined(__DYNAMIC_MALLOC_ALLOWED__)
|
||
ulSize = ulDynamicMemoryUsed + ulStaticMemoryUsed;
|
||
sprintf (szErrTxt, "=> Total Memory used for %d Modules/%d : Dynamic (%db)+ Static (%db) = %db (%.2fKb; %.2fMb)\n\n",
|
||
ucNbModuleUsedMmg, g_ucErmNbOfModule,
|
||
ulDynamicMemoryUsed, ulStaticMemoryUsed,
|
||
ulSize, (float)ulSize/1024, (float)ulSize/(1024*1024));
|
||
#else /*#if defined(__DEBUG_MALLOC_MODE__) && defined(__DYNAMIC_MALLOC_ALLOWED__)*/
|
||
sprintf (szErrTxt, "=> Total Static Memory used for %d Modules/%d : %db (%.2fKb; %.2fMb)\n\n",
|
||
ucNbModuleUsedMmg, g_ucErmNbOfModule,
|
||
ulStaticMemoryUsed, (float)ulStaticMemoryUsed/1024, (float)ulStaticMemoryUsed/(1024*1024));
|
||
#endif /*defined(__DEBUG_MALLOC_MODE__) && defined(__DYNAMIC_MALLOC_ALLOWED__)*/
|
||
Erm_fn_v_Printsz (szErrTxt);
|
||
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}/*Mmg_fn_v_PrintAllocationsUsedForMmg*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vGiveInformationBlock
|
||
DESCRIPTION : Give information data on a block
|
||
-> address of block beginning
|
||
-> address of block end
|
||
-> address of the first free
|
||
-> the maximum address reached (different of the last address used)
|
||
INPUT : Module Id
|
||
Block ID
|
||
pointer on structure of block info
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_vGiveInformationBlock(unsigned char ucModuleId, unsigned char ucBlockId, struct tdstBlockInfo_ *p_stMyBlockInfoForOutside){
|
||
struct tdstBlockInfoPriv_ * p_stMyStBlockInfo;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (ucBlockId >= g_a_ucBlocksNbInModule[ucModuleId]){
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
sprintf (szErrTxt, "BlockId = %d, but there are only %d Block\nin the module [", ucBlockId, g_a_ucBlocksNbInModule[ucModuleId]);
|
||
Erm_M_GetModuleInformation(szErrTxt+strlen(szErrTxt), ucModuleId);
|
||
sprintf (szErrTxt+strlen(szErrTxt), "]\n");
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlockId,szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlockId,NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
/*implicite else with the fatal error*/
|
||
p_stMyStBlockInfo = g_a_p_stMmgModuleBlocksInfo[ucModuleId]+ucBlockId;
|
||
p_stMyBlockInfoForOutside->p_cBeginBlock = p_stMyStBlockInfo->p_cBeginBlock;
|
||
p_stMyBlockInfoForOutside->p_cEndBlock = p_stMyStBlockInfo->p_cEndBlock;
|
||
p_stMyBlockInfoForOutside->p_cFirstFree = p_stMyStBlockInfo->p_cFirstFree;
|
||
p_stMyBlockInfoForOutside->p_cMaxMem = p_stMyStBlockInfo->p_cMaxMem;
|
||
}/*Mmg_fn_vGiveInformationBlock*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_vSaveInformationBlock
|
||
DESCRIPTION : Init a block with the following info structure
|
||
-> address of block beginning
|
||
-> address of block end
|
||
-> address of the first free
|
||
-> the maximum address reached (different of the last address used)
|
||
INPUT : Module Id
|
||
Block ID
|
||
pointer on structure of block info
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_vSaveInformationBlock(unsigned char ucModuleId, unsigned char ucBlockId, struct tdstBlockInfo_ *p_stMyBlockInfoFromOutside){
|
||
struct tdstBlockInfoPriv_ * p_stMyStBlockInfo;
|
||
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (ucBlockId >= g_a_ucBlocksNbInModule[ucModuleId]){
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
sprintf (szErrTxt, "BlockId = %d, but there are only %d Block\nin the module [", ucBlockId, g_a_ucBlocksNbInModule[ucModuleId]);
|
||
Erm_M_GetModuleInformation(szErrTxt+strlen(szErrTxt), ucModuleId);
|
||
sprintf (szErrTxt+strlen(szErrTxt), "]\n");
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlockId,szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlockId,NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
/*implicite else with the fatal error*/
|
||
p_stMyStBlockInfo = g_a_p_stMmgModuleBlocksInfo[ucModuleId]+ucBlockId;
|
||
p_stMyStBlockInfo->p_cBeginBlock = p_stMyBlockInfoFromOutside->p_cBeginBlock ;
|
||
p_stMyStBlockInfo->p_cEndBlock = p_stMyBlockInfoFromOutside->p_cEndBlock;
|
||
p_stMyStBlockInfo->p_cFirstFree = p_stMyBlockInfoFromOutside->p_cFirstFree;
|
||
p_stMyStBlockInfo->p_cMaxMem = p_stMyBlockInfoFromOutside->p_cMaxMem;
|
||
}/*Mmg_fn_vSaveInformationBlock*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_ulSizeOfUsefullMemory
|
||
DESCRIPTION : return the size of the usefull memory in a block
|
||
INPUT : Module Id
|
||
Block ID
|
||
OUTPUT : size of usefull memory
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
unsigned long Mmg_fn_ulSizeOfUsefullMemory (unsigned char ucModuleId, unsigned char ucBlockId){
|
||
unitAlloc * p_uaLastFree;
|
||
struct tdstBlockInfoPriv_ * p_stMyStBlockInfo;
|
||
|
||
#ifdef __DEBUG_MALLOC_MODE__
|
||
#ifdef __FATAL_ERR_MMG__
|
||
if (ucBlockId >= g_a_ucBlocksNbInModule[ucModuleId]){
|
||
#ifdef __ERROR_STRINGS__
|
||
char szErrTxt[C_ucSizeOfErrTxt];
|
||
sprintf (szErrTxt, "BlockId = %d, but there are only %d Block\nin the module [", ucBlockId, g_a_ucBlocksNbInModule[ucModuleId]);
|
||
Erm_M_GetModuleInformation(szErrTxt+strlen(szErrTxt), ucModuleId);
|
||
sprintf (szErrTxt+strlen(szErrTxt), "]\n");
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlockId,szErrTxt);
|
||
#else /*__ERROR_STRINGS__*/
|
||
Mmg_M_UpdateLastError(E_uwMmgPbInvalidBlockId,NULL);
|
||
#endif /*__ERROR_STRINGS__*/
|
||
}
|
||
#endif /*__FATAL_ERR_MMG__*/
|
||
#endif /*__DEBUG_MALLOC_MODE__*/
|
||
|
||
/*implicite else with the fatal error*/
|
||
p_stMyStBlockInfo = g_a_p_stMmgModuleBlocksInfo[ucModuleId]+ucBlockId;
|
||
|
||
if (p_stMyStBlockInfo->p_cFirstFree == C_FirstFreeValueForBlockWithoutFree ){/* Block with free*/
|
||
#ifdef D_CheckSystemForBlockWithoutFree
|
||
return (p_stMyStBlockInfo->p_cMaxMem - p_stMyStBlockInfo->p_cBeginBlock + 1);
|
||
#else /*D_CheckSystemForBlockWithoutFree*/
|
||
return (p_stMyStBlockInfo->p_cMaxMem - p_stMyStBlockInfo->p_cBeginBlock + 1
|
||
- (((tdstInformationHeaderOfBolckWithoutFree *)p_stMyStBlockInfo->p_cBeginBlock)->ucBoundededHeaderSize));
|
||
#endif /*D_CheckSystemForBlockWithoutFree*/
|
||
}
|
||
else{ /* Block with free*/
|
||
p_uaLastFree = (unitAlloc *)p_stMyStBlockInfo->p_cFirstFree;
|
||
while (((unitAlloc *)p_uaLastFree != NULL) && ((unitAlloc *)*(p_uaLastFree +1) != NULL) ){
|
||
p_uaLastFree = (unitAlloc *)*(p_uaLastFree +1);
|
||
}
|
||
|
||
if ( (p_uaLastFree != NULL) && ((char *)(p_uaLastFree + *(p_uaLastFree)))-1 == p_stMyStBlockInfo->p_cEndBlock ) {/* the block is not full */
|
||
return ( ((char *)(p_uaLastFree + C_ucFreeHeaderSize)) - p_stMyStBlockInfo->p_cBeginBlock);
|
||
}
|
||
else { /* the block is full */
|
||
return (p_stMyStBlockInfo->p_cEndBlock - p_stMyStBlockInfo->p_cBeginBlock + 1);
|
||
}
|
||
}
|
||
}/*Mmg_fn_ulSizeOfUsefullMemory */
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
|
||
#ifdef __ERROR_STRINGS__
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_v_UpdateLastErrorWithModuleId
|
||
DESCRIPTION : raise an error using module Id
|
||
INPUT : Module Id
|
||
Error to raise
|
||
Message to display
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_v_UpdateLastErrorWithModuleId(unsigned char ucModuleId,unsigned short uwMyErr, char *szPersonalTxt)
|
||
{
|
||
char szMyRealTxt[C_ucSizeOfErrTxt];
|
||
|
||
if (szPersonalTxt != NULL){
|
||
sprintf (szMyRealTxt, "In [");
|
||
Erm_M_GetModuleInformation(szMyRealTxt+strlen(szMyRealTxt), ucModuleId);
|
||
sprintf (szMyRealTxt+strlen(szMyRealTxt), "]\n%s", szPersonalTxt);
|
||
}
|
||
else{
|
||
sprintf (szMyRealTxt, "In [");
|
||
Erm_M_GetModuleInformation(szMyRealTxt+strlen(szMyRealTxt), ucModuleId);
|
||
sprintf (szMyRealTxt+strlen(szMyRealTxt), "]\n");
|
||
}
|
||
Erm_M_UpdateLastError (Mmg, C_ucErmDefaultChannel, uwMyErr, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, szMyRealTxt);
|
||
}
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_v_UpdateLastErrorWithCurrentModeInfo
|
||
DESCRIPTION : raise an error using channel
|
||
INPUT : Error to raise
|
||
Message to display
|
||
Channel Id
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_v_UpdateLastErrorWithCurrentModeInfo(unsigned short uwMyErr,char * szPersonalTxt,unsigned char ucChannel)
|
||
{
|
||
tdstCurrentModeInfo stCurrentModeInfo = g_d_stCurrentModeInfo[ucChannel];
|
||
char szMyRealTxt[C_ucSizeOfErrTxt];
|
||
|
||
if (stCurrentModeInfo.ucMode == E_ucDynamic)
|
||
if (szPersonalTxt != NULL){
|
||
sprintf (szMyRealTxt, "In [");
|
||
Erm_M_GetModuleInformation(szMyRealTxt+strlen(szMyRealTxt), stCurrentModeInfo.ucModuleId);
|
||
sprintf (szMyRealTxt+strlen(szMyRealTxt), "], for Dynamic mode\n%s", szPersonalTxt);
|
||
}
|
||
else{
|
||
sprintf (szMyRealTxt, "In [");
|
||
Erm_M_GetModuleInformation(szMyRealTxt+strlen(szMyRealTxt), stCurrentModeInfo.ucModuleId);
|
||
sprintf (szMyRealTxt+strlen(szMyRealTxt), "], for Dynamic mode\n");
|
||
}
|
||
else
|
||
if (szPersonalTxt != NULL){
|
||
sprintf (szMyRealTxt, "In [");
|
||
Erm_M_GetModuleInformation(szMyRealTxt+strlen(szMyRealTxt), stCurrentModeInfo.ucModuleId);
|
||
sprintf (szMyRealTxt+strlen(szMyRealTxt), "], for Static mode (Block #%d)\n%s", stCurrentModeInfo.ucMode, szPersonalTxt);
|
||
}
|
||
else{
|
||
sprintf (szMyRealTxt, "In [");
|
||
Erm_M_GetModuleInformation(szMyRealTxt+strlen(szMyRealTxt), stCurrentModeInfo.ucModuleId);
|
||
sprintf (szMyRealTxt+strlen(szMyRealTxt), "], for Static mode (Block #%d)\n", stCurrentModeInfo.ucMode);
|
||
}
|
||
Mmg_M_szAddChannelInfoToSzInitTxt(szMyRealTxt, ucChannel);
|
||
Erm_M_UpdateLastError (Mmg, C_ucErmDefaultChannel, uwMyErr, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, szMyRealTxt);
|
||
}/* end of Mmg_fn_v_UpdateLastErrorWithCurrentModeInfo*/
|
||
|
||
/* ##F#===================================================================================
|
||
NAME : Mmg_fn_v_UpdateLastErrorWithModuleIdAnducModeReference
|
||
DESCRIPTION : raise an error using module id and allocation mode
|
||
INPUT : Module Id
|
||
Allocation Mode
|
||
Error to raise
|
||
Message to display
|
||
=========================================================================================
|
||
CREATION : 06-11-97/Pierrick Crepy
|
||
=======================================================================================*/
|
||
void Mmg_fn_v_UpdateLastErrorWithModuleIdAnducModeReference(unsigned char ucModuleId, unsigned char ucMode, unsigned short uwMyErr, char *szPersonalTxt)
|
||
{
|
||
char szMyRealTxt[C_ucSizeOfErrTxt];
|
||
if (ucMode == E_ucDynamic)
|
||
if (szPersonalTxt != NULL){
|
||
sprintf (szMyRealTxt, "In [");
|
||
Erm_M_GetModuleInformation(szMyRealTxt+strlen(szMyRealTxt), ucModuleId);
|
||
sprintf (szMyRealTxt+strlen(szMyRealTxt), "], for Dynamic mode\n%s", szPersonalTxt);
|
||
}
|
||
else{
|
||
sprintf (szMyRealTxt, "In [");
|
||
Erm_M_GetModuleInformation(szMyRealTxt+strlen(szMyRealTxt), ucModuleId);
|
||
sprintf (szMyRealTxt+strlen(szMyRealTxt), "], for Dynamic mode\n");
|
||
}
|
||
else
|
||
if (szPersonalTxt != NULL){
|
||
sprintf (szMyRealTxt, "In [");
|
||
Erm_M_GetModuleInformation(szMyRealTxt+strlen(szMyRealTxt), ucModuleId);
|
||
sprintf (szMyRealTxt+strlen(szMyRealTxt), "], for Static mode (Block #%d)\n%s", ucMode, szPersonalTxt);
|
||
}
|
||
else{
|
||
sprintf (szMyRealTxt, "In [");
|
||
Erm_M_GetModuleInformation(szMyRealTxt+strlen(szMyRealTxt), ucModuleId);
|
||
sprintf (szMyRealTxt+strlen(szMyRealTxt), "], for Static mode (Block #%d)\n", ucMode);
|
||
}
|
||
Erm_M_UpdateLastError (Mmg, C_ucErmDefaultChannel, uwMyErr, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, szMyRealTxt);
|
||
}/*end Mmg_fn_v_UpdateLastErrorWithModuleIdAnducModeReference*/
|
||
#endif /*__ERROR_STRINGS__*/
|