/* ##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 é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__*/
