2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
5 Allocate memory from a specific MemHeader.
10 #include <aros/debug.h>
11 #include <exec/alerts.h>
12 #include <aros/libcall.h>
13 #include <aros/macros.h>
14 #include <exec/memory.h>
15 #include <proto/exec.h>
17 #include "exec_intern.h"
18 #include "exec_util.h"
21 /*****************************************************************************
25 AROS_LH2(APTR
, Allocate
,
28 AROS_LHA(struct MemHeader
*, freeList
, A0
),
29 AROS_LHA(ULONG
, byteSize
, D0
),
32 struct ExecBase
*, SysBase
, 31, Exec
)
35 Allocate memory out of a private region handled by the MemHeader
39 freeList - Pointer to the MemHeader structure which holds the memory
40 byteSize - Number of bytes you want to get
43 A pointer to the number of bytes you wanted or NULL if the memory
47 The memory is aligned to sizeof(struct MemChunk). All requests
48 are rounded up to a multiple of that size.
52 \* Get a MemHeader structure and some private memory *\
53 mh=(struct MemHeader *)
54 AllocMem(sizeof(struct MemHeader)+POOLSIZE,MEMF_ANY);
57 \* Build a private pool *\
58 mh->mh_First=(struct MemChunk *)(mh+1);
59 mh->mh_First->mc_Next=NULL;
60 mh->mh_First->mc_Bytes=POOLSIZE;
65 mem1=Allocate(mh,1000);
66 mem2=Allocate(mh,2000);
67 \* Do something with memory... *\
69 \* Free everything at once *\
70 FreeMem(mh,sizeof(struct MemHeader)+POOLSIZE);
74 Does not work with managed memory blocks because of backwards
82 ******************************************************************************/
86 struct TraceLocation tp
= CURRENT_LOCATION("Allocate");
89 D(bug("[exec] Allocate(0x%p, %u)\n", freeList
, byteSize
));
90 ASSERT_VALID_PTR(freeList
);
92 /* Zero bytes requested? May return everything ;-). */
96 /* Is there enough free memory in the list? */
97 if(freeList
->mh_Free
<byteSize
)
100 res
= stdAlloc(freeList
, byteSize
, 0, &tp
, SysBase
);
102 if ((PrivExecBase(SysBase
)->IntFlags
& EXECF_MungWall
) && res
) {
103 MUNGE_BLOCK(res
, MEMFILL_ALLOC
, byteSize
);