/* ##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 ---------------------------------------------------------------------------------------*/ #include "ERM.h" #include "MMG/CpaMmg.h" #include "..\PrivMmg.h" /* ##F#=================================================================================== NAME : Mmg_fn_vPrintUsedStaticMemory DESCRIPTION : this function print the state of the statsic memory in the file C_szErrorLogFileName INPUT : Module Id poniter on a block structure ========================================================================================= CREATION : 06-11-97/Pierrick Crepy =======================================================================================*/ void Mmg_fn_vPrintUsedStaticMemory(unsigned char ucModuleId, struct tdstBlockInfoPriv_ * a_stMyBlockInfo, unsigned char ucModuleMaxBlocksNb){ unsigned char ucBlockId; char szTxt[200]; unsigned long ulNbMalloc; unsigned long ulNbFree; tdstBlockInfoPriv *p_stMyBlockInfo; unitAlloc * p_uaPtr; unitAlloc * p_uaFreePtr; unitAlloc uaTotalAllocatedSize; unitAlloc uaTotalFreeSize; unitAlloc uaRemainSpace; unitAlloc uaBlockSize; unitAlloc uaMaxUsed; sprintf (szTxt, "\n===> Print the used Static memory on "); Erm_M_GetModuleInformation (szTxt+strlen(szTxt), ucModuleId); sprintf (szTxt+strlen(szTxt), " : <===\n"); Erm_fn_v_Printsz (szTxt); #ifdef __DEBUG_MALLOC_MODE__ Erm_fn_v_Printsz ("===> With __DEBUG_MALLOC_MODE__ <===\n\n"); #else /*__DEBUG_MALLOC_MODE__*/ Erm_fn_v_Printsz ("===> Without __DEBUG_MALLOC_MODE__ <===\n\n"); #endif /*__DEBUG_MALLOC_MODE__*/ sprintf( szTxt, "Module Id = %d\n", ucModuleId ); Erm_fn_v_Printsz( szTxt ); if( a_stMyBlockInfo == NULL ) { Erm_fn_v_Printsz( "\tThe info are not valid !!!\n" ); return; } for (ucBlockId=0; ucBlockIdp_cBeginBlock != C_p_cBlockNotValidKey) && (p_stMyBlockInfo->p_cFirstFree == C_FirstFreeValueForBlockWithoutFree) ){ uaBlockSize = p_stMyBlockInfo->p_cEndBlock - p_stMyBlockInfo->p_cBeginBlock +1; uaMaxUsed = p_stMyBlockInfo->p_cMaxMem - p_stMyBlockInfo->p_cBeginBlock +1; #ifdef D_CheckSystemForBlockWithoutFree uaMaxUsed -= (((tdstInformationHeaderOfBolckWithoutFree *)p_stMyBlockInfo->p_cBeginBlock)->ucBoundededHeaderSize); uaBlockSize -= (((tdstInformationHeaderOfBolckWithoutFree *)p_stMyBlockInfo->p_cBeginBlock)->ucBoundededHeaderSize); #endif /*D_CheckSystemForBlockWithoutFree*/ Erm_fn_v_Printsz ("\t\t --> MaxMen status: The higher address used in this block without Free\n"); sprintf (szTxt, "\t\t\t -> %.2f%%%% used i.e %ldb (%.2fKb; %.2fMb) / %ldb (%.2fKb; %.2fMb)\n", ((float)uaMaxUsed * 100 / (float)uaBlockSize), (unsigned long)uaMaxUsed, (float)uaMaxUsed/1024, (float)uaMaxUsed/(1024*1024), (unsigned long)uaBlockSize, (float)uaBlockSize/1024, (float)uaBlockSize/(1024*1024) ); Erm_fn_v_Printsz (szTxt); continue;/* go to the next Block (ucBlockId)*/ } p_uaPtr=(unitAlloc *)p_stMyBlockInfo->p_cBeginBlock; p_uaFreePtr = (unitAlloc *)p_stMyBlockInfo->p_cFirstFree; uaTotalAllocatedSize = 0; uaTotalFreeSize = 0; ulNbFree = 0; ulNbMalloc =0; while (p_uaPtr < (unitAlloc *)p_stMyBlockInfo->p_cEndBlock){/* scan all malloc*/ if (p_uaFreePtr == p_uaPtr){/* it's a free */ if (((unitAlloc *) *(p_uaFreePtr+1)) != (unitAlloc *) 0){ /* not the last free*/ p_uaFreePtr = (unitAlloc *) *(p_uaFreePtr+1); /* go to the next free*/ ulNbFree++; uaTotalFreeSize += *p_uaPtr; } } else{/* this is a malloc*/ uaTotalAllocatedSize += *p_uaPtr; ulNbMalloc++; } p_uaPtr += *(p_uaPtr); }/*end of while*/ if (p_uaPtr != (unitAlloc *)(p_stMyBlockInfo->p_cEndBlock + 1)){ Erm_fn_v_Printsz ("\t\t --> not valid (should be not initialized)\n"); } else { uaBlockSize = p_stMyBlockInfo->p_cEndBlock - p_stMyBlockInfo->p_cBeginBlock +1; uaMaxUsed = p_stMyBlockInfo->p_cMaxMem - p_stMyBlockInfo->p_cBeginBlock +1; if ( (unitAlloc *) (p_uaFreePtr) == (unitAlloc *) NULL){ /*all the space is used !!*/ uaRemainSpace = 0; } else { uaRemainSpace = ((*p_uaFreePtr)<ulMaxNbStaticMalloc*(C_ucDebugInformationLoss<ulCountMallocBeforeMaxMem * C_ucDebugInformationLoss)) << C_uwShiftAllocSize; uaTotalAllocatedSize -= ( (ulNbMalloc * C_ucDebugInformationLoss)); #endif /*__DEBUG_MALLOC_MODE__*/ uaTotalAllocatedSize <<= C_uwShiftAllocSize; uaTotalFreeSize <<= C_uwShiftAllocSize; Erm_fn_v_Printsz ("\t\t --> MaxMen status: The higher allocation\n"); sprintf (szTxt, "\t\t\t -> %.2f%%%% used i.e %ldb (%.2fKb; %.2fMb) / %ldb (%.2fKb; %.2fMb)\n", ((float)uaMaxUsed * 100 / (float)uaBlockSize), (unsigned long)uaMaxUsed, (float)uaMaxUsed/1024, (float)uaMaxUsed/(1024*1024), (unsigned long)uaBlockSize, (float)uaBlockSize/1024, (float)uaBlockSize/(1024*1024) ); Erm_fn_v_Printsz (szTxt); #ifdef __DEBUG_MALLOC_MODE__ sprintf (szTxt, "\t\t\t -> With %d allocation(s) & %d free(s)\n", p_stMyBlockInfo->ulCountMallocBeforeMaxMem, p_stMyBlockInfo->ulCountFreeBeforeMaxMem); Erm_fn_v_Printsz (szTxt); #endif /*__DEBUG_MALLOC_MODE__*/ Erm_fn_v_Printsz ("\t\t --> Current status:\n"); sprintf (szTxt, "\t\t\t ->%.2f%%%% used for allocation, i.e %ldb (%.2fKb; %.2fMb) / %ldb (%.2fKb; %.2fMb)\n", ((float)uaTotalAllocatedSize * 100 / (float)uaBlockSize), (unsigned long)uaTotalAllocatedSize, (float)uaTotalAllocatedSize/1024, (float)uaTotalAllocatedSize/(1024*1024), (unsigned long)uaBlockSize, (float)uaBlockSize/1024, (float)uaBlockSize/(1024*1024) ); Erm_fn_v_Printsz (szTxt); #ifndef __DEBUG_MALLOC_MODE__ sprintf (szTxt, "\t\t\t ->%.2f%%%% lost for the management of free, i.e %ldb (%.2fKb; %.2fMb) / %ldb (%.2fKb; %.2fMb)\n", ((float)uaTotalFreeSize * 100 / (float)uaBlockSize), (unsigned long)uaTotalFreeSize, (float)uaTotalFreeSize/1024, (float)uaTotalFreeSize/(1024*1024), (unsigned long)uaBlockSize, (float)uaBlockSize/1024, (float)uaBlockSize/(1024*1024) ); Erm_fn_v_Printsz (szTxt); sprintf (szTxt, "\t\t\t ->%.2f%%%% remain i.e %ldb (%.2fKb; %.2fMb) / %ldb (%.2fKb; %.2fMb)\n", ((float)uaRemainSpace * 100 / (float)uaBlockSize), (unsigned long)uaRemainSpace, (float)uaRemainSpace/1024, (float)uaRemainSpace/(1024*1024), (unsigned long)uaBlockSize, (float)uaBlockSize/1024, (float)uaBlockSize/(1024*1024) ); Erm_fn_v_Printsz (szTxt); #endif /*__DEBUG_MALLOC_MODE__*/ sprintf (szTxt, "\t\t\t -> There are %d allocation(s) & %d free(s)\n", ulNbMalloc, ulNbFree); Erm_fn_v_Printsz (szTxt); } }/* end of the for block*/ }/* Mmg_fn_vPrintUsedStaticMemory*/