103 p->nEntrySize = nEntrySize;
104 p->nEntriesAlloc = 0;
106 p->pEntriesFree = NULL;
108 p->nChunkSize = nEntriesMax / 8;
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;
236 if (
p->nChunks == 0 )
239 for ( i = 1; i <
p->nChunks; i++ )
243 pTemp =
p->pChunks[0];
244 for ( i = 1; i <
p->nChunkSize; i++ )
246 *((
char **)pTemp) = pTemp +
p->nEntrySize;
247 pTemp +=
p->nEntrySize;
250 *((
char **)pTemp) = NULL;
252 p->pEntriesFree =
p->pChunks[0];
254 p->nMemoryAlloc =
p->nEntrySize *
p->nChunkSize;
256 p->nEntriesAlloc =
p->nChunkSize;
273 return p->nMemoryAlloc;
289 return p->nEntriesMax;
316 p->nChunkSize = (1 << 18);
317 p->nChunksAlloc = 64;
344 printf(
"Flexible memory manager: Chunk size = %d. Chunks used = %d.\n",
345 p->nChunkSize,
p->nChunks );
346 printf(
" Entries used = %d. Memory used = %d. Memory alloc = %d.\n",
347 p->nEntriesUsed,
p->nMemoryUsed,
p->nMemoryAlloc );
349 for ( i = 0; i <
p->nChunks; i++ )
370 if (
p->pCurrent == NULL ||
p->pCurrent + nBytes >
p->pEnd )
372 if (
p->nChunks ==
p->nChunksAlloc )
374 p->nChunksAlloc *= 2;
377 if ( nBytes >
p->nChunkSize )
381 p->nChunkSize = 2 * nBytes;
384 p->pEnd =
p->pCurrent +
p->nChunkSize;
385 p->nMemoryAlloc +=
p->nChunkSize;
387 p->pChunks[
p->nChunks++ ] =
p->pCurrent;
389 assert(
p->pCurrent + nBytes <= p->pEnd );
393 p->nMemoryUsed += nBytes;
396 p->pCurrent += nBytes;
414 if (
p->nChunks == 0 )
417 for ( i = 1; i <
p->nChunks; i++ )
420 p->nMemoryAlloc =
p->nChunkSize;
422 p->pCurrent =
p->pChunks[0];
423 p->pEnd =
p->pCurrent +
p->nChunkSize;
441 return p->nMemoryUsed;
477 for ( i = 0; i <
p->nMems; i++ )
480 p->nMapSize = (4<<
p->nMems);
483 for ( k = 1; k <= 4; k++ )
484 p->pMap[k] =
p->pMems[0];
485 for ( i = 0; i <
p->nMems; i++ )
486 for ( k = (4<<i)+1; k <= (8<<i); k++ )
487 p->pMap[k] =
p->pMems[i];
490 p->nChunksAlloc = 64;
510 for ( i = 0; i <
p->nMems; i++ )
512 if (
p->nChunksAlloc )
514 for ( i = 0; i <
p->nChunks; i++ )
538 if ( nBytes >
p->nMapSize )
540 if (
p->nChunks ==
p->nChunksAlloc )
542 p->nChunksAlloc *= 2;
545 p->pChunks[
p->nChunks++ ] =
ABC_ALLOC(
char, nBytes );
546 return p->pChunks[
p->nChunks-1];
567 if ( nBytes >
p->nMapSize )
588 int i, nMemTotal = 0;
589 for ( i = 0; i <
p->nMems; i++ )
590 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
void Gia_MmFixedRestart(Gia_MmFixed_t *p)
void Gia_MmFixedEntryRecycle(Gia_MmFixed_t *p, char *pEntry)
void Gia_MmStepStop(Gia_MmStep_t *p, int fVerbose)
Gia_MmFlex_t * Gia_MmFlexStart()
Gia_MmStep_t * Gia_MmStepStart(int nSteps)
void Gia_MmStepEntryRecycle(Gia_MmStep_t *p, char *pEntry, int nBytes)
Gia_MmFixed_t * Gia_MmFixedStart(int nEntrySize, int nEntriesMax)
FUNCTION DEFINITIONS ///.
char * Gia_MmFixedEntryFetch(Gia_MmFixed_t *p)
int Gia_MmStepReadMemUsage(Gia_MmStep_t *p)
char * Gia_MmStepEntryFetch(Gia_MmStep_t *p, int nBytes)
void Gia_MmFlexStop(Gia_MmFlex_t *p, int fVerbose)
char * Gia_MmFlexEntryFetch(Gia_MmFlex_t *p, int nBytes)
int Gia_MmFixedReadMaxEntriesUsed(Gia_MmFixed_t *p)
void Gia_MmFixedStop(Gia_MmFixed_t *p, int fVerbose)
int Gia_MmFlexReadMemUsage(Gia_MmFlex_t *p)
int Gia_MmFixedReadMemUsage(Gia_MmFixed_t *p)
void Gia_MmFlexRestart(Gia_MmFlex_t *p)
struct Gia_MmFlex_t_ Gia_MmFlex_t
Gia_MmFixed_t * Gia_MmFixedStart(int nEntrySize, int nEntriesMax)
FUNCTION DEFINITIONS ///.
struct Gia_MmFixed_t_ Gia_MmFixed_t
BASIC TYPES ///.
struct Gia_MmStep_t_ Gia_MmStep_t