home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / ARASAN_S.ZIP / POOL.CPP < prev    next >
C/C++ Source or Header  |  1994-02-24  |  2KB  |  95 lines

  1. // Copyright 1993 by Jon Dart.  All Rights Reserved.
  2.  
  3. #include "pool.h"
  4.  
  5. Pool::Pool( const unsigned chunk_size )
  6. {
  7.    my_chunk_size = chunk_size;
  8.    memChain = freeChunks = NULL;
  9.    nextMem = NULL;
  10.    freeChain = NULL;
  11. }
  12.  
  13. void *Pool::allocate( size_t size )
  14. {
  15.     if (!freeChain)
  16.     {
  17.      size += sizeof(void*);
  18.     if (!memChain || 
  19.         size >= (int)my_chunk_size - (nextMem - memChain->mem))
  20.                 
  21.     {
  22.        chunk *newChunk;
  23.        if (freeChunks)
  24.        {
  25.         newChunk = freeChunks;
  26.         freeChunks = freeChunks->next;
  27.        }
  28.        else
  29.        {
  30.              newChunk = new chunk;
  31.              newChunk->mem = new char[(unsigned int)my_chunk_size];
  32.        }
  33.        newChunk->next = memChain;
  34.        memChain = newChunk;
  35.        nextMem = newChunk->mem;
  36.     }
  37.  
  38.     char *p = nextMem;
  39.     nextMem += size;
  40.     *((void**)p) = NULL;
  41.     return (void*)(p+sizeof(void*));
  42.     }
  43.     else
  44.     {
  45.     void **next = (void**)(freeChain);
  46.     void *p = (char*)(freeChain) + sizeof(void*);
  47.     freeChain = *next;
  48.     return p;
  49.     }
  50. }
  51.  
  52. void Pool::free( void *p )
  53. {
  54.     void *q = (void*)((char*)p-sizeof(void*));
  55.     *((void**)q) = freeChain;
  56.     freeChain = (void*)q;
  57. }
  58.  
  59. void Pool::freeAll(Boolean final)
  60. {
  61.     if (final)
  62.     {
  63.        // delete free chunks
  64.        chunk *c = freeChunks;
  65.        while (c)
  66.        {
  67.       chunk *nxt = c->next;
  68.       delete [] c->mem;
  69.       delete c;
  70.       c = nxt;
  71.        }
  72.     }
  73.     chunk *c = memChain;
  74.     while(c)
  75.     {
  76.     chunk *nxt = c->next;
  77.     if (final)
  78.     {
  79.        delete [] c->mem;
  80.        delete c;
  81.     }
  82.     else
  83.     {
  84.        c->next = freeChunks;
  85.        freeChunks = c;
  86.     }
  87.     c = nxt;
  88.     }
  89.     memChain = NULL;
  90.     nextMem = NULL;
  91.     freeChain = NULL;
  92.     if (final)
  93.     freeChunks = NULL;
  94. }
  95.