aboutsummaryrefslogtreecommitdiffstats
path: root/sdk/other/memfree.c
diff options
context:
space:
mode:
authorWilliam Harrington <kb0iic@berzerkula.org>2025-01-14 16:06:02 -0600
committerWilliam Harrington <kb0iic@berzerkula.org>2025-01-14 16:06:02 -0600
commit0cc9b20c15460213e488bf5e70963b941482f628 (patch)
treebb0143245583ec846630f39bfa2258dba640ccd7 /sdk/other/memfree.c
parent0e084ade5069756d487b5c948c48b777e37c00c9 (diff)
Add source.
Diffstat (limited to 'sdk/other/memfree.c')
-rw-r--r--sdk/other/memfree.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/sdk/other/memfree.c b/sdk/other/memfree.c
new file mode 100644
index 0000000..1939f14
--- /dev/null
+++ b/sdk/other/memfree.c
@@ -0,0 +1,38 @@
+/*
+ * Advanced free space deallocation for memory pools.
+ * $Id$
+ * Copyright (c) 1997 by Tycho Softworks.
+ * For conditions of distribution and reuse see product license.
+ */
+
+#include <other/memory.h>
+#include <std/math.h>
+
+void memfree(MEMPOOL *mem, void *obj, int len)
+{
+ _MEMFREE *free = mem->mem_free;
+ _MEMCELL *cell = (_MEMCELL *)obj;
+ len = align(len, __OBJALIGN);
+
+ while(free)
+ {
+ if(free->size == len)
+ break;
+
+ free = free->next;
+ }
+
+ if(!free)
+ {
+ free = memreq(mem, sizeof(_MEMFREE));
+ free->list = NULL;
+ free->next = mem->mem_free;
+ mem->mem_free = free;
+ }
+
+ if(free)
+ {
+ cell->next = free->list;
+ free->list = cell;
+ }
+}