2 Copyright © 1995-2012, The AROS Development Team. All rights reserved.
5 Desc: Free memory allocated by Allocate().
9 #include <aros/debug.h>
10 #include <exec/execbase.h>
11 #include <exec/alerts.h>
12 #include <aros/libcall.h>
13 #include <exec/memory.h>
14 #include <exec/memheaderext.h>
15 #include <proto/exec.h>
17 #include "exec_util.h"
20 /*****************************************************************************
24 AROS_LH3(void, Deallocate
,
27 AROS_LHA(struct MemHeader
*, freeList
, A0
),
28 AROS_LHA(APTR
, memoryBlock
, A1
),
29 AROS_LHA(IPTR
, byteSize
, D0
),
32 struct ExecBase
*, SysBase
, 32, Exec
)
35 Free block of memory associated with a given MemHandler structure.
38 freeList - Pointer to the MemHeader structure
39 memoryBlock - Pointer to the memory to be freed
40 byteSize - Size of the block
45 The start and end borders of the block are aligned to
46 a multiple of sizeof(struct MemChunk) and to include the block.
57 ******************************************************************************/
61 if ((freeList
->mh_Node
.ln_Type
== NT_MEMORY
) &&
62 (freeList
->mh_Attributes
& MEMF_MANAGED
) &&
63 (((struct MemHeaderExt
*)freeList
)->mhe_Magic
== MEMHEADER_EXT_MAGIC
)
66 struct MemHeaderExt
*mhe
= (struct MemHeaderExt
*)freeList
;
69 mhe
->mhe_Free(mhe
, memoryBlock
, byteSize
);
73 struct TraceLocation tp
= CURRENT_LOCATION("Deallocate");
75 /* If there is no memory free nothing */
76 if(!byteSize
|| !memoryBlock
)
79 #if !defined(NO_CONSISTENCY_CHECKS)
80 /* Test if our block really fits into this MemHeader. */
81 if ((memoryBlock
< freeList
->mh_Lower
) || (memoryBlock
+ byteSize
> freeList
->mh_Upper
+ 1))
83 /* Something is completely wrong. */
84 bug("[MM] Memory allocator error\n");
85 bug("[MM] Attempt to free %u bytes at 0x%p from MemHeader 0x%p\n", byteSize
, memoryBlock
, freeList
);
86 bug("[MM] Block does not fit into MemHeader (0x%p - 0x%p)\n", freeList
->mh_Lower
, freeList
->mh_Upper
);
88 Alert(AN_BadFreeAddr
);
93 stdDealloc(freeList
, NULL
/* by design */, memoryBlock
, byteSize
, &tp
, SysBase
);