home *** CD-ROM | disk | FTP | other *** search
- // Copyright 1993 by Jon Dart. All Rights Reserved.
-
- #include "pool.h"
-
- Pool::Pool( const unsigned chunk_size )
- {
- my_chunk_size = chunk_size;
- memChain = freeChunks = NULL;
- nextMem = NULL;
- freeChain = NULL;
- }
-
- void *Pool::allocate( size_t size )
- {
- if (!freeChain)
- {
- size += sizeof(void*);
- if (!memChain ||
- size >= (int)my_chunk_size - (nextMem - memChain->mem))
-
- {
- chunk *newChunk;
- if (freeChunks)
- {
- newChunk = freeChunks;
- freeChunks = freeChunks->next;
- }
- else
- {
- newChunk = new chunk;
- newChunk->mem = new char[(unsigned int)my_chunk_size];
- }
- newChunk->next = memChain;
- memChain = newChunk;
- nextMem = newChunk->mem;
- }
-
- char *p = nextMem;
- nextMem += size;
- *((void**)p) = NULL;
- return (void*)(p+sizeof(void*));
- }
- else
- {
- void **next = (void**)(freeChain);
- void *p = (char*)(freeChain) + sizeof(void*);
- freeChain = *next;
- return p;
- }
- }
-
- void Pool::free( void *p )
- {
- void *q = (void*)((char*)p-sizeof(void*));
- *((void**)q) = freeChain;
- freeChain = (void*)q;
- }
-
- void Pool::freeAll(Boolean final)
- {
- if (final)
- {
- // delete free chunks
- chunk *c = freeChunks;
- while (c)
- {
- chunk *nxt = c->next;
- delete [] c->mem;
- delete c;
- c = nxt;
- }
- }
- chunk *c = memChain;
- while(c)
- {
- chunk *nxt = c->next;
- if (final)
- {
- delete [] c->mem;
- delete c;
- }
- else
- {
- c->next = freeChunks;
- freeChunks = c;
- }
- c = nxt;
- }
- memChain = NULL;
- nextMem = NULL;
- freeChain = NULL;
- if (final)
- freeChunks = NULL;
- }
-