home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / misc / emu / AROSdev.lha / AROS / compiler / alib / liballocpooled.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-01-27  |  2.5 KB  |  139 lines

  1. /*
  2.     (C) 1995-96 AROS - The Amiga Replacement OS
  3.     Original version from libnix
  4.     $Id: liballocpooled.c,v 1.2 1997/01/27 00:16:37 ldp Exp $
  5.  
  6.     Desc:
  7.     Lang: english
  8. */
  9. #include "pool.h"
  10. #include <proto/exec.h>
  11.  
  12. /*****************************************************************************
  13.  
  14.     NAME */
  15. #include <proto/alib.h>
  16.  
  17.     APTR LibAllocPooled (
  18.  
  19. /*  SYNOPSIS */
  20.     APTR  pool,
  21.     ULONG memSize)
  22.  
  23. /*  FUNCTION
  24.  
  25.     INPUTS
  26.  
  27.     RESULT
  28.  
  29.     NOTES
  30.  
  31.     EXAMPLE
  32.  
  33.     BUGS
  34.  
  35.     SEE ALSO
  36.  
  37.     INTERNALS
  38.  
  39.     HISTORY
  40.     06.12.96 digulla Created after original from libnix
  41.  
  42. ******************************************************************************/
  43. {
  44. #   define poolHeader    ((POOL *)pool)
  45.     ULONG *puddle = NULL;
  46.  
  47.     if (SysBase->LibNode.lib_Version >= 39)
  48.     return (AllocPooled (pool, memSize));
  49.  
  50.     if (poolHeader != NULL && memSize != 0)
  51.     {
  52.     ULONG size;
  53.  
  54.     if (poolHeader->ThreshSize>memSize)
  55.     {
  56.         struct MemHeader * a = (struct MemHeader *)poolHeader->PuddleList.mlh_Head;
  57.  
  58.         for(;;)
  59.         {
  60.         if (a->mh_Node.ln_Succ!=NULL)
  61.         {
  62.             if (a->mh_Node.ln_Type
  63.             && (puddle = (ULONG *)Allocate (a, memSize)) != NULL
  64.             )
  65.             break;
  66.  
  67.             a = (struct MemHeader *)a->mh_Node.ln_Succ;
  68.         }
  69.         else
  70.         {
  71.             size = poolHeader->PuddleSize
  72.             + sizeof (struct MemHeader)
  73.             + 2 * sizeof (ULONG);
  74.  
  75.             if (!(puddle = (ULONG *)AllocMem (size, poolHeader->MemoryFlags)) )
  76.             return NULL;
  77.  
  78.             *puddle ++ = size;
  79.  
  80.             a = (struct MemHeader *)puddle;
  81.  
  82.             a->mh_Node.ln_Type     = NT_MEMORY;
  83.             a->mh_Lower      =
  84.             a->mh_First = (struct MemChunk *)(
  85.                 (UBYTE *)a
  86.                 + sizeof (struct MemHeader)
  87.                 + sizeof (UBYTE *)
  88.             );
  89.             a->mh_First->mc_Next = NULL;
  90.             a->mh_Free         =
  91.             a->mh_First->mc_Bytes = poolHeader->PuddleSize;
  92.             a->mh_Upper      = (char *)a->mh_First + a->mh_Free;
  93.  
  94.             AddHead ((struct List *)&poolHeader->PuddleList, &a->mh_Node);
  95.  
  96.             puddle = (ULONG *)Allocate (a, memSize);
  97.  
  98.             break;
  99.         }
  100.         }
  101. /* Twice ??? The memory should have been cleared by AllocMem() already.
  102.         if (poolHeader->MemoryFlags & MEMF_CLEAR)
  103.         {
  104.         p = puddle;
  105.  
  106.         memSize  += 7;
  107.         memSize >>= 3;
  108.  
  109.         do
  110.         {
  111.             *p++=0;
  112.             *p++=0;
  113.         } while (--memSize);
  114.         }
  115. */
  116.     }
  117.     else
  118.     {
  119.         size = memSize + sizeof (struct MinNode) + 2 * sizeof (ULONG);
  120.  
  121.         if ((puddle = (ULONG *)AllocMem (size, poolHeader->MemoryFlags)))
  122.         {
  123.         *puddle ++ = size;
  124.  
  125.         AddTail ((struct List *)&poolHeader->PuddleList
  126.             , (struct Node *)puddle
  127.         );
  128.  
  129.         puddle = (ULONG *)((struct MinNode *)puddle + 1);
  130.  
  131.         *puddle ++ = 0;
  132.         }
  133.     }
  134.     }
  135.  
  136.     return puddle;
  137. } /* LibAllocPooled */
  138.  
  139.