129 p->nEntrySize = nEntrySize;
130 p->nEntriesAlloc = 0;
132 p->pEntriesFree = NULL;
134 if ( nEntrySize * (1 << 10) < (1<<16) )
135 p->nChunkSize = (1 << 10);
137 p->nChunkSize = (1<<16) / nEntrySize;
138 if (
p->nChunkSize < 8 )
141 p->nChunksAlloc = 64;
163 printf(
"Fixed memory manager: Entry = %5d. Chunk = %5d. Chunks used = %5d.\n",
164 p->nEntrySize,
p->nChunkSize,
p->nChunks );
165 printf(
" Entries used = %8d. Entries peak = %8d. Memory used = %8d. Memory alloc = %8d.\n",
166 p->nEntriesUsed,
p->nEntriesMax,
p->nEntrySize *
p->nEntriesUsed,
p->nMemoryAlloc );
185 for ( i = 0; i <
p->nChunks; i++ )
208 if (
p->nEntriesUsed ==
p->nEntriesAlloc )
210 assert(
p->pEntriesFree == NULL );
211 if (
p->nChunks ==
p->nChunksAlloc )
213 p->nChunksAlloc *= 2;
216 p->pEntriesFree =
ABC_ALLOC(
char,
p->nEntrySize *
p->nChunkSize );
217 p->nMemoryAlloc +=
p->nEntrySize *
p->nChunkSize;
219 pTemp =
p->pEntriesFree;
220 for ( i = 1; i <
p->nChunkSize; i++ )
222 *((
char **)pTemp) = pTemp +
p->nEntrySize;
223 pTemp +=
p->nEntrySize;
226 *((
char **)pTemp) = NULL;
228 p->pChunks[
p->nChunks++ ] =
p->pEntriesFree;
230 p->nEntriesAlloc +=
p->nChunkSize;
234 if (
p->nEntriesMax <
p->nEntriesUsed )
235 p->nEntriesMax =
p->nEntriesUsed;
237 pTemp =
p->pEntriesFree;
238 p->pEntriesFree = *((
char **)pTemp);
258 *((
char **)pEntry) =
p->pEntriesFree;
259 p->pEntriesFree = pEntry;
279 for ( i = 1; i <
p->nChunks; i++ )
283 pTemp =
p->pChunks[0];
284 for ( i = 1; i <
p->nChunkSize; i++ )
286 *((
char **)pTemp) = pTemp +
p->nEntrySize;
287 pTemp +=
p->nEntrySize;
290 *((
char **)pTemp) = NULL;
292 p->pEntriesFree =
p->pChunks[0];
294 p->nMemoryAlloc =
p->nEntrySize *
p->nChunkSize;
296 p->nEntriesAlloc =
p->nChunkSize;
313 return p->nMemoryAlloc;
329 return p->nEntriesMax;
355 p->nChunkSize = (1 << 12);
356 p->nChunksAlloc = 64;
378 printf(
"Flexible memory manager: Chunk size = %d. Chunks used = %d.\n",
379 p->nChunkSize,
p->nChunks );
380 printf(
" Entries used = %d. Memory used = %d. Memory alloc = %d.\n",
381 p->nEntriesUsed,
p->nMemoryUsed,
p->nMemoryAlloc );
401 for ( i = 0; i <
p->nChunks; i++ )
422 if (
p->pCurrent == NULL ||
p->pCurrent + nBytes >
p->pEnd )
424 if (
p->nChunks ==
p->nChunksAlloc )
426 p->nChunksAlloc *= 2;
429 if ( nBytes >
p->nChunkSize )
433 p->nChunkSize = 2 * nBytes;
436 p->pEnd =
p->pCurrent +
p->nChunkSize;
437 p->nMemoryAlloc +=
p->nChunkSize;
439 p->pChunks[
p->nChunks++ ] =
p->pCurrent;
441 assert(
p->pCurrent + nBytes <= p->pEnd );
445 p->nMemoryUsed += nBytes;
448 p->pCurrent += nBytes;
465 return p->nMemoryAlloc;
501 for ( i = 0; i <
p->nMems; i++ )
504 p->nMapSize = (4<<
p->nMems);
507 for ( k = 1; k <= 4; k++ )
508 p->pMap[k] =
p->pMems[0];
509 for ( i = 0; i <
p->nMems; i++ )
510 for ( k = (4<<i)+1; k <= (8<<i); k++ )
511 p->pMap[k] =
p->pMems[i];
531 for ( i = 0; i <
p->nMems; i++ )
533 if (
p->pLargeChunks )
535 for ( i = 0; i <
p->nLargeChunks; i++ )
559 if ( nBytes >
p->nMapSize )
563 if (
p->nLargeChunks ==
p->nLargeChunksAlloc )
565 if (
p->nLargeChunksAlloc == 0 )
566 p->nLargeChunksAlloc = 32;
567 p->nLargeChunksAlloc *= 2;
568 p->pLargeChunks =
ABC_REALLOC(
void *,
p->pLargeChunks,
p->nLargeChunksAlloc );
570 p->pLargeChunks[
p->nLargeChunks++ ] =
ABC_ALLOC(
char, nBytes );
571 return (
char *)
p->pLargeChunks[
p->nLargeChunks - 1 ];
592 if ( nBytes >
p->nMapSize )
613 int i, nMemTotal = 0;
614 for ( i = 0; i <
p->nMems; i++ )
615 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