2 Copyright (C) 1995-2014, The AROS Development Team. All rights reserved.
5 Desc: Delete a memory pool including all its memory.
9 #include <aros/libcall.h>
10 #include <exec/memory.h>
11 #include <exec/memheaderext.h>
12 #include <proto/exec.h>
14 #include "exec_intern.h"
15 #include "exec_util.h"
19 /*****************************************************************************
23 AROS_LH1(void, DeletePool
,
26 AROS_LHA(APTR
, poolHeader
, A0
),
29 struct ExecBase
*, SysBase
, 117, Exec
)
32 Delete a pool including all its memory.
35 poolHeader - The pool allocated with CreatePool() or NULL.
46 CreatePool(), AllocPooled(), FreePooled(), AllocVecPooled(),
51 ******************************************************************************/
55 ASSERT_VALID_PTR_OR_NULL(poolHeader
);
57 D(bug("[exec] DeletePool(0x%p)\n", poolHeader
));
59 /* It is legal to DeletePool(NULL) */
60 if (poolHeader
!= NULL
)
62 struct TraceLocation tp
= CURRENT_LOCATION("DeletePool");
64 if (IsManagedMem(poolHeader
))
66 /* Do nothing, everything is handled in FreeMemHeader */
70 struct Pool
*pool
= poolHeader
+ MEMHEADER_TOTAL
;
71 struct Node
*p
, *p2
; /* Avoid casts */
74 if (pool
->PoolMagic
!= POOL_MAGIC
)
76 PoolManagerAlert(PME_DEL_POOL_INV_POOL
, 0, 0, NULL
, NULL
, poolHeader
);
80 D(bug("[DeletePool] Pool header 0x%p\n", pool
));
81 pool
->PoolMagic
= 0x0;
84 * We are going to deallocate the whole pool.
85 * Scan mungwall's allocations list and remove all chunks belonging to the pool.
87 MungWall_Scan(pool
, &tp
, SysBase
);
90 * Free the list of puddles.
91 * Remember that initial puddle containing the pool structure is also in this list.
92 * We do not need to free it until everything else is freed.
94 for (p
= (struct Node
*)pool
->PuddleList
.mlh_Head
; p
->ln_Succ
; p
= p2
)
98 D(bug("[DeletePool] Puddle 0x%p...", p
));
103 FreeMemHeader(p
, &tp
, SysBase
);
110 /* Free the last puddle, containing the pool header */
111 D(bug("[DeletePool] Freeing initial puddle 0x%p\n", poolHeader
));
112 FreeMemHeader(poolHeader
, &tp
, SysBase
);