100 p->nEntrySize = nEntrySize;
101 p->nEntriesAlloc = 0;
103 p->pEntriesFree = NULL;
105 if ( nEntrySize * (1 << 10) < (1<<16) )
106 p->nChunkSize = (1 << 10);
108 p->nChunkSize = (1<<16) / nEntrySize;
109 if (
p->nChunkSize < 8 )
112 p->nChunksAlloc = 64;
139 printf(
"Fixed memory manager: Entry = %5d. Chunk = %5d. Chunks used = %5d.\n",
140 p->nEntrySize,
p->nChunkSize,
p->nChunks );
141 printf(
" Entries used = %8d. Entries peak = %8d. Memory used = %8d. Memory alloc = %8d.\n",
142 p->nEntriesUsed,
p->nEntriesMax,
p->nEntrySize *
p->nEntriesUsed,
p->nMemoryAlloc );
144 for ( i = 0; i <
p->nChunks; i++ )
167 if (
p->nEntriesUsed ==
p->nEntriesAlloc )
169 assert(
p->pEntriesFree == NULL );
170 if (
p->nChunks ==
p->nChunksAlloc )
172 p->nChunksAlloc *= 2;
175 p->pEntriesFree =
ABC_ALLOC(
char,
p->nEntrySize *
p->nChunkSize );
176 p->nMemoryAlloc +=
p->nEntrySize *
p->nChunkSize;
178 pTemp =
p->pEntriesFree;
179 for ( i = 1; i <
p->nChunkSize; i++ )
181 *((
char **)pTemp) = pTemp +
p->nEntrySize;
182 pTemp +=
p->nEntrySize;
185 *((
char **)pTemp) = NULL;
187 p->pChunks[
p->nChunks++ ] =
p->pEntriesFree;
189 p->nEntriesAlloc +=
p->nChunkSize;
193 if (
p->nEntriesMax <
p->nEntriesUsed )
194 p->nEntriesMax =
p->nEntriesUsed;
196 pTemp =
p->pEntriesFree;
197 p->pEntriesFree = *((
char **)pTemp);
217 *((
char **)pEntry) =
p->pEntriesFree;
218 p->pEntriesFree = pEntry;
238 for ( i = 1; i <
p->nChunks; i++ )
242 pTemp =
p->pChunks[0];
243 for ( i = 1; i <
p->nChunkSize; i++ )
245 *((
char **)pTemp) = pTemp +
p->nEntrySize;
246 pTemp +=
p->nEntrySize;
249 *((
char **)pTemp) = NULL;
251 p->pEntriesFree =
p->pChunks[0];
253 p->nMemoryAlloc =
p->nEntrySize *
p->nChunkSize;
255 p->nEntriesAlloc =
p->nChunkSize;
272 return p->nMemoryAlloc;
299 p->nChunkSize = (1 << 12);
300 p->nChunksAlloc = 64;
327 printf(
"Flexible memory manager: Chunk size = %d. Chunks used = %d.\n",
328 p->nChunkSize,
p->nChunks );
329 printf(
" Entries used = %d. Memory used = %d. Memory alloc = %d.\n",
330 p->nEntriesUsed,
p->nMemoryUsed,
p->nMemoryAlloc );
332 for ( i = 0; i <
p->nChunks; i++ )
353 if (
p->pCurrent == NULL ||
p->pCurrent + nBytes >
p->pEnd )
355 if (
p->nChunks ==
p->nChunksAlloc )
357 p->nChunksAlloc *= 2;
360 if ( nBytes >
p->nChunkSize )
364 p->nChunkSize = 2 * nBytes;
367 p->pEnd =
p->pCurrent +
p->nChunkSize;
368 p->nMemoryAlloc +=
p->nChunkSize;
370 p->pChunks[
p->nChunks++ ] =
p->pCurrent;
372 assert(
p->pCurrent + nBytes <= p->pEnd );
376 p->nMemoryUsed += nBytes;
379 p->pCurrent += nBytes;
396 return p->nMemoryAlloc;
431 for ( i = 0; i <
p->nMems; i++ )
434 p->nMapSize = (4<<
p->nMems);
437 for ( k = 1; k <= 4; k++ )
438 p->pMap[k] =
p->pMems[0];
439 for ( i = 0; i <
p->nMems; i++ )
440 for ( k = (4<<i)+1; k <= (8<<i); k++ )
441 p->pMap[k] =
p->pMems[i];
461 for ( i = 0; i <
p->nMems; i++ )
483 if ( nBytes >
p->nMapSize )
507 if ( nBytes >
p->nMapSize )
528 int i, nMemTotal = 0;
529 for ( i = 0; i <
p->nMems; i++ )
530 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
struct Msat_MmFlex_t_ Msat_MmFlex_t
struct Msat_MmFixed_t_ Msat_MmFixed_t
Msat_MmFixed_t * Msat_MmFixedStart(int nEntrySize)
FUNCTION DEFINITIONS ///.
struct Msat_MmStep_t_ Msat_MmStep_t
int Msat_MmFlexReadMemUsage(Msat_MmFlex_t *p)
void Msat_MmFixedStop(Msat_MmFixed_t *p, int fVerbose)
void Msat_MmFixedEntryRecycle(Msat_MmFixed_t *p, char *pEntry)
int Msat_MmStepReadMemUsage(Msat_MmStep_t *p)
void Msat_MmStepStop(Msat_MmStep_t *p, int fVerbose)
char * Msat_MmStepEntryFetch(Msat_MmStep_t *p, int nBytes)
Msat_MmFlex_t * Msat_MmFlexStart()
Msat_MmFixed_t * Msat_MmFixedStart(int nEntrySize)
FUNCTION DEFINITIONS ///.
void Msat_MmFlexStop(Msat_MmFlex_t *p, int fVerbose)
void Msat_MmStepEntryRecycle(Msat_MmStep_t *p, char *pEntry, int nBytes)
char * Msat_MmFlexEntryFetch(Msat_MmFlex_t *p, int nBytes)
void Msat_MmFixedRestart(Msat_MmFixed_t *p)
int Msat_MmFixedReadMemUsage(Msat_MmFixed_t *p)
Msat_MmStep_t * Msat_MmStepStart(int nSteps)
char * Msat_MmFixedEntryFetch(Msat_MmFixed_t *p)