boot.library is no more, *.handler to *-handler.
[AROS.git] / compiler / alib / liballocpooled.c
bloba343d2b4632b019443d1588a7f10ee18eddc95d1
1 /*
2 Copyright © 1995-2007, The AROS Development Team. All rights reserved.
3 Original version from libnix
4 $Id$
5 */
7 #include "pool.h"
8 #include <proto/exec.h>
10 /*****************************************************************************
12 NAME */
13 #include <proto/alib.h>
15 APTR LibAllocPooled (
17 /* SYNOPSIS */
18 APTR pool,
19 ULONG memSize)
21 /* FUNCTION
23 INPUTS
25 RESULT
27 NOTES
29 EXAMPLE
31 BUGS
33 SEE ALSO
35 INTERNALS
37 HISTORY
38 06.12.96 digulla Created after original from libnix
40 ******************************************************************************/
42 # define poolHeader ((POOL *)pool)
43 ULONG *puddle = NULL;
45 if (SysBase->LibNode.lib_Version >= 39)
46 return (AllocPooled (pool, memSize));
48 if (poolHeader != NULL && memSize != 0)
50 ULONG size;
52 if (poolHeader->ThreshSize > memSize)
54 struct MemHeader * a = (struct MemHeader *)poolHeader->PuddleList.mlh_Head;
56 for(;;)
58 if (a->mh_Node.ln_Succ!=NULL)
60 if (a->mh_Node.ln_Type
61 && (puddle = (ULONG *)Allocate (a, memSize)) != NULL
63 break;
65 a = (struct MemHeader *)a->mh_Node.ln_Succ;
67 else
69 size = poolHeader->PuddleSize
70 + sizeof (struct MemHeader)
71 + 2 * sizeof (ULONG);
73 if (!(puddle = (ULONG *)AllocMem (size, poolHeader->MemoryFlags)) )
74 return NULL;
76 *puddle ++ = size;
78 a = (struct MemHeader *)puddle;
80 a->mh_Node.ln_Type = NT_MEMORY;
81 a->mh_Lower =
82 a->mh_First = (struct MemChunk *)(
83 (UBYTE *)a
84 + sizeof (struct MemHeader)
85 + sizeof (UBYTE *)
87 a->mh_First->mc_Next = NULL;
88 a->mh_Free =
89 a->mh_First->mc_Bytes = poolHeader->PuddleSize;
90 a->mh_Upper = (char *)a->mh_First + a->mh_Free;
92 AddHead ((struct List *)&poolHeader->PuddleList, &a->mh_Node);
94 puddle = (ULONG *)Allocate (a, memSize);
96 break;
101 We do have to clear memory here. It may have been dirtied
102 by somebody using it beforehand.
104 if (poolHeader->MemoryFlags & MEMF_CLEAR)
106 ULONG *p = puddle;
108 memSize += 7;
109 memSize >>= 3;
113 *p++=0;
114 *p++=0;
115 } while (--memSize);
118 else
120 size = memSize + sizeof (struct MinNode) + 2 * sizeof (ULONG);
122 if ((puddle = (ULONG *)AllocMem (size, poolHeader->MemoryFlags)))
124 *puddle ++ = size;
126 AddTail ((struct List *)&poolHeader->PuddleList
127 , (struct Node *)puddle
130 puddle = (ULONG *)((struct MinNode *)puddle + 1);
132 *puddle ++ = 0;
137 return puddle;
138 } /* LibAllocPooled */