reman3/Rayman_X/cpa/tempgrp/GEO/GeoMem.c

385 lines
12 KiB
C

/*#define GEO_D_DebugMalloc*/
/*#define GEO_D_DebugStatistic*/
#include <assert.h>
#include "cpa_std.h"
#include "acp_base.h"
#define __DeclareGlobalVariableErrGEO_h__
#include "GEO\ErrGEO.h"
#undef __DeclareGlobalVariableErrGEO_h__
#define __DeclareGlobalVariableMmgGEO_h__
#include "GEO\MmgGEO.h"
#undef __DeclareGlobalVariableMmgGEO_h__
#include "GEO\GEOMem.h"
#include "Gli\Init_Gli.h"
#ifndef U64
#include "SCR.h"
#endif
#include "Gam\ZeMem.h"
/* XB 16/06/99 */
#ifdef U64
extern char _lddcodeSegmentStart[], _lddcodeSegmentEnd[];
#endif /* U64 */
/* End XB 16/06/99 */
/* XB 22/06/99 */
#ifndef U64
extern CPA_EXPORT void GLI_TEX_vSignalCurrentMemoryChannel(unsigned char ucCurrentChannel);
extern CPA_EXPORT void GLI_TEX_vKillMemoryChannel(unsigned char ucCurrentChannel);
#endif /* U64 */
/* End XB 22/06/99 */
#if !defined(RETAIL) || defined(FINAL_VERSION_FOR_TESTERS)
void GEO_PrintUsedStaticMemory()
{
Mmg_M_PrintUsedStaticMemoryInModule(GEO);
}
#endif /* !defined(RETAIL) || defined(FINAL_VERSION_FOR_TESTERS) */
/**************************************************************************/
/*XB*/
#ifdef CHECK_MEMORY
void GEO_CheckMemory(void)
{
Mmg_M_CheckMemory(GEO);
}
#endif /* CHECK_MEMORY */
/*End XB*/
/**************************************************************************/
/* XB 02/06/99 */
#ifndef FINAL_VERSION
unsigned long GEO_fn_ulGetUsedStaticMemory(void)
{
return Mmg_M_GetUsedStaticMemory(GEO);
}
#endif /* FINAL_VERSION */
/* End XB 02/06/99 */
void
GEO_xInitGEOError()
{
Erm_M_InitErrMsg(GEO);
Mmg_M_InitMmg(GEO);
/* XB 22/06/99 */
#ifndef U64
GLI_TEX_vSignalCurrentMemoryChannel(E_ucDynamic);
#endif /* U64 */
/* End XB 22/06/99 */
#if defined(_DEBUG)
GEO_g_bDynamicAllocation = GEO_C_CanUseDynamic;
#else
GEO_g_bDynamicAllocation = GEO_C_CanNotUseDynamic;
#endif /* _DEBUG */
}
void
GEO_xCreateMemoryChannel(unsigned char ucChannel,unsigned long ulSize)
{
#ifndef U64
Mmg_M_InitBlockV5_1_0(GEO, ucChannel, ulSize,300000);
#else /* !U64 */
if((ucChannel==ACP_U64_FixMemoryChannel)||(ucChannel==ACP_U64_LevelMemoryChannel))
{
#ifdef CHECK_MEMORY
Mmg_M_InitSpecificBlock(GEO, ucChannel, ulSize, 300000, 8, C_BlockWithFreeFlag | C_Check_AlignementFlag | C_Check_OverflowFlag);
#else /* CHECK_MEMORY */
Mmg_M_InitSpecificBlock(GEO, ucChannel, ulSize, 300000, 8, C_BlockWithoutFreeFlag | C_Check_AlignementFlag | C_Check_OverflowFlag);
#endif /* CHECK_MEMORY */
}
else
/* XB 16/06/99 */
if(ucChannel==ACP_U64_LDDMemoryChannel)
{
g_ucUseLDDBloc=1;
#ifdef CHECK_MEMORY
Mmg_M_InitSpecificBlock(GEO, ucChannel, _lddcodeSegmentEnd-_lddcodeSegmentStart-4, 300000, 4, C_BlockWithFreeFlag | C_Check_AlignementFlag | C_Check_OverflowFlag);
#else /* CHECK_MEMORY */
Mmg_M_InitSpecificBlock(GEO, ucChannel, _lddcodeSegmentEnd-_lddcodeSegmentStart-4, 300000, 4, C_BlockWithoutFreeFlag | C_Check_AlignementFlag | C_Check_OverflowFlag);
#endif /* CHECK_MEMORY */
g_ucUseLDDBloc=0;
}
else
/* End XB 16/06/99 */
{
#ifdef CHECK_MEMORY
Mmg_M_InitSpecificBlock(GEO, ucChannel, ulSize, 300000, 4, C_BlockWithFreeFlag | C_Check_AlignementFlag | C_Check_OverflowFlag);
#else /* CHECK_MEMORY */
Mmg_M_InitSpecificBlock(GEO, ucChannel, ulSize, 300000, 4, C_BlockWithoutFreeFlag | C_Check_AlignementFlag | C_Check_OverflowFlag);
#endif /* CHECK_MEMORY */
}
#endif /* !U64 */
}
void
GEO_xSelectMemoryChannel(unsigned char ucChannel)
{
if ((E_ucGEOMaxBlocksNb < ucChannel)
&& (ucChannel != E_ucDynamic))
{
Erm_M_ClearLastError ( C_ucErmDefaultChannel );
Erm_M_UpdateLastError( GEO, C_ucErmDefaultChannel, E_uwGEOUnAvailableChannel , C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, "Malloc allocation");
}
g_ucGEOMMemMallocMode = ucChannel;
/* XB 22/06/99 */
#ifndef U64
GLI_vSignalCurrentMemoryChannel(ucChannel);
#endif /* U64 */
/* End XB 22/06/99 */
}
void
GEO_xDeleteMemoryChannel(unsigned char ucChannel)
{
if ((E_ucGEOMaxBlocksNb < ucChannel)
&& (ucChannel != E_ucDynamic))
{
Erm_M_ClearLastError ( C_ucErmDefaultChannel );
Erm_M_UpdateLastError( GEO, C_ucErmDefaultChannel, E_uwGEOUnAvailableChannel , C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, "Malloc allocation");
}
/* XB 22/06/99 */
#ifndef U64
GLI_vKillMemoryChannel(ucChannel);
#endif /* U64 */
/* End XB 22/06/99 */
Mmg_M_DeleteBlock(GEO, ucChannel);
}
/**************************************************************************/
/* XB 22/06/99 */
#ifdef U64
void *GEO_PRI_fn_pvMalloc(unsigned long _ulSize)
{
void *pvBuffer=NULL;
if(_ulSize!=0)
{
#ifndef FINAL_VERSION
g_ucModuleIdForDebug=0;
#endif /* FINAL_VERSION */
pvBuffer=Mmg_fn_p_vAlloc4Ch(_ulSize,C_ucMmgDefaultChannel);
#ifndef FINAL_VERSION
g_ucModuleIdForDebug=0xff;
#endif /* FINAL_VERSION */
}
return pvBuffer;
}
#endif /* U64 */
/* End XB 22/06/99 */
/**************************************************************************/
/* XB 22/06/99 */
#ifdef U64
void *GEO_fn_pvMalloc(unsigned long _ulSize)
{
void *pvBuffer;
M_GEOInitMem();
pvBuffer=GEO_PRI_fn_pvMalloc(_ulSize);
memset(pvBuffer,0,_ulSize);
return pvBuffer;
}
#endif /* U64 */
/* End XB 22/06/99 */
/**************************************************************************/
/* XB 22/06/99 */
#ifdef U64
void *GEO_fn_pvMallocAlign8(unsigned long _ulSize)
{
void *pvBuffer=NULL;
Mmg_M_SetModeAlloc4Ch(GEO,g_ucGEOMMemMallocMode+2,C_ucMmgDefaultChannel);
pvBuffer=GEO_PRI_fn_pvMalloc(_ulSize);
memset(pvBuffer,0,_ulSize);
return pvBuffer;
}
#endif /* U64 */
/* End XB 22/06/99 */
/**************************************************************************/
/* XB 22/06/99 */
#ifdef U64
void *GEO_fn_pvMallocLDD(unsigned long _ulSize)
{
void *pvBuffer=NULL;
Mmg_M_SetModeAlloc4Ch(GEO,ACP_U64_LDDMemoryChannel,C_ucMmgDefaultChannel);
pvBuffer=GEO_PRI_fn_pvMalloc(_ulSize);
return pvBuffer;
}
#endif /* U64 */
/* End XB 22/06/99 */
#define GEO_C_NumberOfSource 200
#if defined(_DEBUG)&&(defined(GEO_D_DebugStatistic)||defined(GEO_D_DebugMalloc))
unsigned long GEO_g_ulNumberOfAllocation = 0;
#endif /* _DEBUG&&(GEO_D_DebugStatistic||GEO_D_DebugMalloc) */
#if defined(_DEBUG)&&defined(GEO_D_DebugStatistic)
unsigned long GEO_g_ulMaxSources = 0;
struct GEO_tdstAllocInformation_
{
char GEO_szSourceName[_MAX_PATH];
unsigned long GEO_ulSourceLine;
unsigned short GEO_usSourceBloc;
unsigned long GEO_ulSourceSize;
unsigned long GEO_ulSourceNumberOfAlloc;
unsigned long GEO_ulSourceNumberOfRealloc;
unsigned long GEO_ulSourceNumberOfFree;
} GEO_g_a_stAllocInformation[GEO_C_NumberOfSource];
#endif /*_DEBUG&&GEO_D_DebugStatistic*/
#ifndef _FIRE_DEADCODE_U64_
void
GEO_fn_vMemoryLogFile(void *p_vPointer,unsigned char ucAction,char *szFile,unsigned long ulLine,unsigned long ulSize)
{
#if defined(_DEBUG)&&(defined(GEO_D_DebugStatistic)||defined(GEO_D_DebugMalloc))
/* static unsigned long GEO_g_ulNumberOfAllocation = 0;*/
unsigned short uwBlocId;
void *p_vBeginBloc;
#endif /* _DEBUG&&(GEO_D_DebugStatistic||GEO_D_DebugMalloc) */
#if defined(_DEBUG)&&defined(GEO_D_DebugStatistic)
unsigned long i;
#endif /*_DEBUG&&GEO_D_DebugStatistic*/
#if defined(_DEBUG)&&defined(GEO_D_DebugMalloc)
FILE *p_stFile;
char szFileName[30];
#endif /* _DEBUG && GEO_D_DebugMalloc */
#if defined(_DEBUG)&&(defined(GEO_D_DebugStatistic)||defined(GEO_D_DebugMalloc))
Mmg_fn_vWhereIs((void*)p_vPointer,&uwBlocId,&p_vBeginBloc);
if (ucAction==GEO_C_ActionMalloc)
GEO_g_ulNumberOfAllocation++;
else if (ucAction==GEO_C_ActionFree)
GEO_g_ulNumberOfAllocation--;
#endif /* _DEBUG&&(GEO_D_DebugStatistic||GEO_D_DebugMalloc) */
#if defined(_DEBUG)&&defined(GEO_D_DebugStatistic)
for (i=0;i<GEO_g_ulMaxSources&&(stricmp(szFile,GEO_g_a_stAllocInformation[i].GEO_szSourceName)||GEO_g_a_stAllocInformation[i].GEO_ulSourceLine!=ulLine||GEO_g_a_stAllocInformation[i].GEO_usSourceBloc!=uwBlocId);i++);
if (i==GEO_g_ulMaxSources)
{
strcpy(GEO_g_a_stAllocInformation[i].GEO_szSourceName,szFile);
GEO_g_a_stAllocInformation[i].GEO_ulSourceLine=ulLine;
GEO_g_a_stAllocInformation[i].GEO_usSourceBloc = uwBlocId;
GEO_g_a_stAllocInformation[i].GEO_ulSourceSize=0;
GEO_g_a_stAllocInformation[i].GEO_ulSourceNumberOfAlloc=0;
GEO_g_a_stAllocInformation[i].GEO_ulSourceNumberOfRealloc=0;
GEO_g_a_stAllocInformation[i].GEO_ulSourceNumberOfFree=0;
GEO_g_ulMaxSources++;
if (GEO_g_ulMaxSources>=GEO_C_NumberOfSource)
Erm_M_UpdateLastError( GEO, C_ucErmDefaultChannel,E_uwGEOIncreaseNumberOfSource, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
}
if (ucAction==GEO_C_ActionMalloc)
{
GEO_g_a_stAllocInformation[i].GEO_ulSourceSize+=ulSize;
GEO_g_a_stAllocInformation[i].GEO_ulSourceNumberOfAlloc++;
}
else if (ucAction==GEO_C_ActionRealloc)
{
GEO_g_a_stAllocInformation[i].GEO_ulSourceSize+=ulSize;
GEO_g_a_stAllocInformation[i].GEO_ulSourceNumberOfRealloc++;
}
else if (ucAction==GEO_C_ActionFree)
{
GEO_g_a_stAllocInformation[i].GEO_ulSourceNumberOfFree++;
}
#endif /*_DEBUG&&GEO_D_DebugStatistic*/
#if defined(_DEBUG)&&defined(GEO_D_DebugMalloc)
sprintf(szFileName,"Mem%04x.log",uwBlocId);
if ((p_stFile = fopen(szFileName,"rt"))!=NULL)
fclose(p_stFile);
else
GEO_g_ulNumberOfAllocation = 0;
p_stFile = fopen(szFileName,"at");
if (p_stFile!=NULL)
{
if (ucAction==GEO_C_ActionMalloc)
fprintf(p_stFile,"Malloc : Number=#%010d, Block=#%04x, Offset=%p (%20s,%10d)\n",GEO_g_ulNumberOfAllocation,uwBlocId,(long)p_vPointer-(long)p_vBeginBloc,szFile,ulLine);
else if (ucAction==GEO_C_ActionRealloc)
fprintf(p_stFile,"Realloc : Number=#%010d, Block=#%04x, Offset=%p (%20s,%10d)\n",GEO_g_ulNumberOfAllocation,uwBlocId,(long)p_vPointer-(long)p_vBeginBloc,szFile,ulLine);
else if (ucAction==GEO_C_ActionFree)
fprintf(p_stFile,"Free : Number=#%010d, Block=#%04x, Offset=%p (%20s,%10d)\n",GEO_g_ulNumberOfAllocation,uwBlocId,(long)p_vPointer-(long)p_vBeginBloc,szFile,ulLine);
fclose(p_stFile);
}
#endif /* _DEBUG && GEO_D_DebugMalloc */
}
int GEO_fn_vMemorySort(const void *elem1, const void *elem2)
{
#if defined(_DEBUG)&&defined(GEO_D_DebugStatistic)
return(((struct GEO_tdstAllocInformation_*)elem2)->GEO_ulSourceSize-((struct GEO_tdstAllocInformation_*)elem1)->GEO_ulSourceSize);
#else
return(0);
#endif /*_DEBUG&&GEO_D_DebugStatistic*/
}
void
GEO_fn_vPrintMemoryInformation(void)
{
#if defined(_DEBUG)&&defined(GEO_D_DebugStatistic)
FILE *p_stFile;
unsigned long i;
qsort(GEO_g_a_stAllocInformation,GEO_g_ulMaxSources, sizeof(struct GEO_tdstAllocInformation_),GEO_fn_vMemorySort);
if ((p_stFile = fopen("GeoMemInfo.log","wt"))!=NULL)
{
for (i=0;i<GEO_g_ulMaxSources;i++)
{
fprintf(p_stFile,"%s (line %d, bloc %04x) :\n",GEO_g_a_stAllocInformation[i].GEO_szSourceName,GEO_g_a_stAllocInformation[i].GEO_ulSourceLine,GEO_g_a_stAllocInformation[i].GEO_usSourceBloc);
fprintf(p_stFile," Number of allocations : %d\n",GEO_g_a_stAllocInformation[i].GEO_ulSourceNumberOfAlloc);
fprintf(p_stFile," Number of reallocations : %d\n",GEO_g_a_stAllocInformation[i].GEO_ulSourceNumberOfRealloc);
fprintf(p_stFile," Number of free : %d\n",GEO_g_a_stAllocInformation[i].GEO_ulSourceNumberOfFree);
fprintf(p_stFile," Total size of allocation : %d\n",GEO_g_a_stAllocInformation[i].GEO_ulSourceSize);
}
fprintf(p_stFile,"\nTotal number of allocation : %d\n",GEO_g_ulNumberOfAllocation);
}
fclose(p_stFile);
#endif /*_DEBUG&&GEO_D_DebugStatistic*/
}
unsigned char
GEO_fn_ucGetBlocNumberOf(void *p_vPointer)
{
unsigned char ucReturn;
unsigned short uwBlocId;
void *p_vBeginBloc;
Mmg_fn_vWhereIs((void*)p_vPointer,&uwBlocId,&p_vBeginBloc);
ucReturn = (unsigned char)(uwBlocId&0x00ff);
return(ucReturn);
}
#endif /* _FIRE_DEADCODE_U64_ */