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

  1. /*
  2.     (C) 1995-96 AROS - The Amiga Replacement OS
  3.     Original version from libnix
  4.     $Id: libfreepooled.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.     void LibFreePooled (
  18.  
  19. /*  SYNOPSIS */
  20.     APTR  pool,
  21.     APTR  memory,
  22.     ULONG memSize)
  23.  
  24. /*  FUNCTION
  25.  
  26.     INPUTS
  27.  
  28.     RESULT
  29.  
  30.     NOTES
  31.  
  32.     EXAMPLE
  33.  
  34.     BUGS
  35.  
  36.     SEE ALSO
  37.  
  38.     INTERNALS
  39.  
  40.     HISTORY
  41.     06.12.96 digulla Created after original from libnix
  42.  
  43. ******************************************************************************/
  44. {
  45. #   define poolHeader ((POOL *)pool)
  46.  
  47.     if (SysBase->LibNode.lib_Version >= 39)
  48.     {
  49.     FreePooled (poolHeader, memory, memSize);
  50.     return;
  51.     }
  52.  
  53.     if (poolHeader!=NULL && memory!=NULL)
  54.     {
  55.     ULONG size,
  56.         * puddle = (ULONG *)((struct MinNode *)memory - 1) - 1;
  57.  
  58.     if (poolHeader->ThreshSize>memSize)
  59.     {
  60.         struct MemHeader * a = (struct MemHeader *)&poolHeader->PuddleList.mlh_Head;
  61.  
  62.         for(;;)
  63.         {
  64.         a = (struct MemHeader *)a->mh_Node.ln_Succ;
  65.  
  66.         if (a->mh_Node.ln_Succ == NULL)
  67.             return;
  68.  
  69.         if (a->mh_Node.ln_Type && memory >= a->mh_Lower
  70.             && memory < a->mh_Upper
  71.         )
  72.             break;
  73.         }
  74.  
  75.         Deallocate (a, memory, memSize);
  76.  
  77.         if (a->mh_Free != poolHeader->PuddleSize)
  78.         return;
  79.  
  80.         puddle = (ULONG *)&a->mh_Node;
  81.     }
  82.  
  83.     Remove ((struct Node *)puddle);
  84.  
  85.     size = *--puddle;
  86.     FreeMem (puddle, size);
  87.     }
  88. } /* LibFreePooled */
  89.  
  90.