107 p->nEntrySize = nEntrySize;
108 p->nEntriesAlloc = 0;
110 p->pEntriesFree = NULL;
112 if ( nEntrySize * (1 << 10) < (1<<16) )
113 p->nChunkSize = (1 << 10);
115 p->nChunkSize = (1<<16) / nEntrySize;
116 if (
p->nChunkSize < 8 )
119 p->nChunksAlloc = 64;
146 printf(
"Fixed memory manager: Entry = %5d. Chunk = %5d. Chunks used = %5d.\n",
147 p->nEntrySize,
p->nChunkSize,
p->nChunks );
148 printf(
" Entries used = %8d. Entries peak = %8d. Memory used = %8d. Memory alloc = %8d.\n",
149 p->nEntriesUsed,
p->nEntriesMax,
p->nEntrySize *
p->nEntriesUsed,
p->nMemoryAlloc );
151 for ( i = 0; i <
p->nChunks; i++ )
190 if (
p->nEntriesUsed ==
p->nEntriesAlloc )
192 assert(
p->pEntriesFree == NULL );
193 if (
p->nChunks ==
p->nChunksAlloc )
195 p->nChunksAlloc *= 2;
198 p->pEntriesFree =
ABC_ALLOC(
char,
p->nEntrySize *
p->nChunkSize );
199 p->nMemoryAlloc +=
p->nEntrySize *
p->nChunkSize;
201 pTemp =
p->pEntriesFree;
202 for ( i = 1; i <
p->nChunkSize; i++ )
204 *((
char **)pTemp) = pTemp +
p->nEntrySize;
205 pTemp +=
p->nEntrySize;
208 *((
char **)pTemp) = NULL;
210 p->pChunks[
p->nChunks++ ] =
p->pEntriesFree;
212 p->nEntriesAlloc +=
p->nChunkSize;
216 if (
p->nEntriesMax <
p->nEntriesUsed )
217 p->nEntriesMax =
p->nEntriesUsed;
219 pTemp =
p->pEntriesFree;
220 p->pEntriesFree = *((
char **)pTemp);
240 *((
char **)pEntry) =
p->pEntriesFree;
241 p->pEntriesFree = pEntry;
261 for ( i = 1; i <
p->nChunks; i++ )
265 pTemp =
p->pChunks[0];
266 for ( i = 1; i <
p->nChunkSize; i++ )
268 *((
char **)pTemp) = pTemp +
p->nEntrySize;
269 pTemp +=
p->nEntrySize;
272 *((
char **)pTemp) = NULL;
274 p->pEntriesFree =
p->pChunks[0];
276 p->nMemoryAlloc =
p->nEntrySize *
p->nChunkSize;
278 p->nEntriesAlloc =
p->nChunkSize;
295 return p->nMemoryAlloc;
311 return p->nEntriesMax;
338 p->nChunkSize = (1 << 12);
339 p->nChunksAlloc = 64;
366 printf(
"Flexible memory manager: Chunk size = %d. Chunks used = %d.\n",
367 p->nChunkSize,
p->nChunks );
368 printf(
" Entries used = %d. Memory used = %d. Memory alloc = %d.\n",
369 p->nEntriesUsed,
p->nMemoryUsed,
p->nMemoryAlloc );
371 for ( i = 0; i <
p->nChunks; i++ )
392 if (
p->pCurrent == NULL ||
p->pCurrent + nBytes >
p->pEnd )
394 if (
p->nChunks ==
p->nChunksAlloc )
396 p->nChunksAlloc *= 2;
399 if ( nBytes >
p->nChunkSize )
403 p->nChunkSize = 2 * nBytes;
406 p->pEnd =
p->pCurrent +
p->nChunkSize;
407 p->nMemoryAlloc +=
p->nChunkSize;
409 p->pChunks[
p->nChunks++ ] =
p->pCurrent;
411 assert(
p->pCurrent + nBytes <= p->pEnd );
415 p->nMemoryUsed += nBytes;
418 p->pCurrent += nBytes;
436 if (
p->nChunks == 0 )
439 for ( i = 1; i <
p->nChunks; i++ )
442 p->nMemoryAlloc =
p->nChunkSize;
444 p->pCurrent =
p->pChunks[0];
445 p->pEnd =
p->pCurrent +
p->nChunkSize;
463 return p->nMemoryUsed;
499 for ( i = 0; i <
p->nMems; i++ )
502 p->nMapSize = (4<<
p->nMems);
505 for ( k = 1; k <= 4; k++ )
506 p->pMap[k] =
p->pMems[0];
507 for ( i = 0; i <
p->nMems; i++ )
508 for ( k = (4<<i)+1; k <= (8<<i); k++ )
509 p->pMap[k] =
p->pMems[i];
529 for ( i = 0; i <
p->nMems; i++ )
531 if (
p->pLargeChunks )
533 for ( i = 0; i <
p->nLargeChunks; i++ )
557 if ( nBytes >
p->nMapSize )
561 if (
p->nLargeChunks ==
p->nLargeChunksAlloc )
563 if (
p->nLargeChunksAlloc == 0 )
564 p->nLargeChunksAlloc = 32;
565 p->nLargeChunksAlloc *= 2;
566 p->pLargeChunks = (
void **)
ABC_REALLOC(
char *,
p->pLargeChunks,
p->nLargeChunksAlloc );
568 p->pLargeChunks[
p->nLargeChunks++ ] =
ABC_ALLOC(
char, nBytes );
569 return (
char *)
p->pLargeChunks[
p->nLargeChunks - 1 ];
590 if ( nBytes >
p->nMapSize )
611 int i, nMemTotal = 0;
612 for ( i = 0; i <
p->nMems; i++ )
613 nMemTotal +=
p->pMems[i]->nMemoryAlloc;
#define ABC_ALLOC(type, num)
#define ABC_REALLOC(type, obj, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
char * Mem_StepEntryFetch(Mem_Step_t *p, int nBytes)
int Mem_FixedReadMemUsage(Mem_Fixed_t *p)
void Mem_FixedStop(Mem_Fixed_t *p, int fVerbose)
Mem_Flex_t * Mem_FlexStart()
void Mem_StepStop(Mem_Step_t *p, int fVerbose)
int Mem_FixedReadMaxEntriesUsed(Mem_Fixed_t *p)
char * Mem_FlexEntryFetch(Mem_Flex_t *p, int nBytes)
int Mem_FlexReadMemUsage(Mem_Flex_t *p)
char * Mem_FixedEntryFetch(Mem_Fixed_t *p)
void Mem_FixedRestart(Mem_Fixed_t *p)
Mem_Step_t * Mem_StepStart(int nSteps)
void Mem_FlexStop2(Mem_Flex_t *p)
Mem_Fixed_t * Mem_FixedStart(int nEntrySize)
FUNCTION DEFINITIONS ///.
void Mem_StepEntryRecycle(Mem_Step_t *p, char *pEntry, int nBytes)
void Mem_FlexRestart(Mem_Flex_t *p)
void Mem_FlexStop(Mem_Flex_t *p, int fVerbose)
int Mem_StepReadMemUsage(Mem_Step_t *p)
void Mem_FixedEntryRecycle(Mem_Fixed_t *p, char *pEntry)
struct Mem_Step_t_ Mem_Step_t
typedefABC_NAMESPACE_HEADER_START struct Mem_Fixed_t_ Mem_Fixed_t
DECLARATIONS ///.
struct Mem_Flex_t_ Mem_Flex_t