grub2: bring back build of aros-side grub2 tools
[AROS.git] / rom / exec / deletepool.c
blob4541ce6f2f7d3359805469728894e2604598207f
1 /*
2 Copyright (C) 1995-2014, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: Delete a memory pool including all its memory.
6 Lang: english
7 */
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"
16 #include "memory.h"
17 #include "mungwall.h"
19 /*****************************************************************************
21 NAME */
23 AROS_LH1(void, DeletePool,
25 /* SYNOPSIS */
26 AROS_LHA(APTR, poolHeader, A0),
28 /* LOCATION */
29 struct ExecBase *, SysBase, 117, Exec)
31 /* FUNCTION
32 Delete a pool including all its memory.
34 INPUTS
35 poolHeader - The pool allocated with CreatePool() or NULL.
37 RESULT
39 NOTES
41 EXAMPLE
43 BUGS
45 SEE ALSO
46 CreatePool(), AllocPooled(), FreePooled(), AllocVecPooled(),
47 FreeVecPooled()
49 INTERNALS
51 ******************************************************************************/
53 AROS_LIBFUNC_INIT
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 */
68 else
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);
78 else
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)
96 p2 = p->ln_Succ;
98 D(bug("[DeletePool] Puddle 0x%p...", p));
100 if (p != poolHeader)
102 D(bug(" freeing"));
103 FreeMemHeader(p, &tp, SysBase);
105 D(bug("\n"));
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);
115 AROS_LIBFUNC_EXIT
116 } /* DeletePool */