home *** CD-ROM | disk | FTP | other *** search
- /*
- (C) 1995-96 AROS - The Amiga Replacement OS
- Original version from libnix
- $Id: libfreepooled.c,v 1.2 1997/01/27 00:16:37 ldp Exp $
-
- Desc:
- Lang: english
- */
- #include "pool.h"
- #include <proto/exec.h>
-
- /*****************************************************************************
-
- NAME */
- #include <proto/alib.h>
-
- void LibFreePooled (
-
- /* SYNOPSIS */
- APTR pool,
- APTR memory,
- ULONG memSize)
-
- /* FUNCTION
-
- INPUTS
-
- RESULT
-
- NOTES
-
- EXAMPLE
-
- BUGS
-
- SEE ALSO
-
- INTERNALS
-
- HISTORY
- 06.12.96 digulla Created after original from libnix
-
- ******************************************************************************/
- {
- # define poolHeader ((POOL *)pool)
-
- if (SysBase->LibNode.lib_Version >= 39)
- {
- FreePooled (poolHeader, memory, memSize);
- return;
- }
-
- if (poolHeader!=NULL && memory!=NULL)
- {
- ULONG size,
- * puddle = (ULONG *)((struct MinNode *)memory - 1) - 1;
-
- if (poolHeader->ThreshSize>memSize)
- {
- struct MemHeader * a = (struct MemHeader *)&poolHeader->PuddleList.mlh_Head;
-
- for(;;)
- {
- a = (struct MemHeader *)a->mh_Node.ln_Succ;
-
- if (a->mh_Node.ln_Succ == NULL)
- return;
-
- if (a->mh_Node.ln_Type && memory >= a->mh_Lower
- && memory < a->mh_Upper
- )
- break;
- }
-
- Deallocate (a, memory, memSize);
-
- if (a->mh_Free != poolHeader->PuddleSize)
- return;
-
- puddle = (ULONG *)&a->mh_Node;
- }
-
- Remove ((struct Node *)puddle);
-
- size = *--puddle;
- FreeMem (puddle, size);
- }
- } /* LibFreePooled */
-
-