70 p->nEntrySize = nEntrySize;
73 p->pEntriesFree = NULL;
75 if ( nEntrySize * (1 << 10) < (1<<16) )
76 p->nChunkSize = (1 << 10);
78 p->nChunkSize = (1<<16) / nEntrySize;
79 if (
p->nChunkSize < 8 )
109 printf(
"Fixed memory manager: Entry = %5d. Chunk = %5d. Chunks used = %5d.\n",
110 p->nEntrySize,
p->nChunkSize,
p->nChunks );
111 printf(
" Entries used = %8d. Entries peak = %8d. Memory used = %8d. Memory alloc = %8d.\n",
112 p->nEntriesUsed,
p->nEntriesMax,
p->nEntrySize *
p->nEntriesUsed,
p->nMemoryAlloc );
114 for ( i = 0; i <
p->nChunks; i++ )
137 if (
p->nEntriesUsed ==
p->nEntriesAlloc )
139 assert(
p->pEntriesFree == NULL );
140 if (
p->nChunks ==
p->nChunksAlloc )
142 p->nChunksAlloc *= 2;
145 p->pEntriesFree =
ABC_ALLOC(
char,
p->nEntrySize *
p->nChunkSize );
146 p->nMemoryAlloc +=
p->nEntrySize *
p->nChunkSize;
148 pTemp =
p->pEntriesFree;
149 for ( i = 1; i <
p->nChunkSize; i++ )
151 *((
char **)pTemp) = pTemp +
p->nEntrySize;
152 pTemp +=
p->nEntrySize;
155 *((
char **)pTemp) = NULL;
157 p->pChunks[
p->nChunks++ ] =
p->pEntriesFree;
159 p->nEntriesAlloc +=
p->nChunkSize;
163 if (
p->nEntriesMax <
p->nEntriesUsed )
164 p->nEntriesMax =
p->nEntriesUsed;
166 pTemp =
p->pEntriesFree;
167 p->pEntriesFree = *((
char **)pTemp);
187 *((
char **)pEntry) =
p->pEntriesFree;
188 p->pEntriesFree = pEntry;
208 for ( i = 1; i <
p->nChunks; i++ )
212 pTemp =
p->pChunks[0];
213 for ( i = 1; i <
p->nChunkSize; i++ )
215 *((
char **)pTemp) = pTemp +
p->nEntrySize;
216 pTemp +=
p->nEntrySize;
219 *((
char **)pTemp) = NULL;
221 p->pEntriesFree =
p->pChunks[0];
223 p->nMemoryAlloc =
p->nEntrySize *
p->nChunkSize;
225 p->nEntriesAlloc =
p->nChunkSize;
242 return p->nMemoryAlloc;
#define ABC_ALLOC(type, num)
#define ABC_REALLOC(type, obj, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
struct Fraig_MemFixed_t_ Fraig_MemFixed_t
STRUCTURE DEFINITIONS ///.
int Fraig_MemFixedReadMemUsage(Fraig_MemFixed_t *p)
Fraig_MemFixed_t * Fraig_MemFixedStart(int nEntrySize)
FUNCTION DEFINITIONS ///.
void Fraig_MemFixedStop(Fraig_MemFixed_t *p, int fVerbose)
void Fraig_MemFixedEntryRecycle(Fraig_MemFixed_t *p, char *pEntry)
char * Fraig_MemFixedEntryFetch(Fraig_MemFixed_t *p)
void Fraig_MemFixedRestart(Fraig_MemFixed_t *p)