summaryrefslogtreecommitdiffstats
path: root/lib.h
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2023-05-02 20:59:49 -0700
committerKaz Kylheku <kaz@kylheku.com>2023-05-02 20:59:49 -0700
commitfe3a2b33165ee0d7765ba4e838e9c4875d8fb195 (patch)
tree096c6400abe87d25793c4c8a1063fe78ce80f1f8 /lib.h
parent005b8909d995b699130ab97269cabab2bcf33a75 (diff)
downloadtxr-fe3a2b33165ee0d7765ba4e838e9c4875d8fb195.tar.gz
txr-fe3a2b33165ee0d7765ba4e838e9c4875d8fb195.tar.bz2
txr-fe3a2b33165ee0d7765ba4e838e9c4875d8fb195.zip
gc: use single allocation for prot_array.
* gc.c (prot_array): Add self pointer; arr member becomes flexible array. (prot_array_mark): We now check the handle itself for null, because the whole thing is freed. (prot_array_free): Function removed. (prot_array_ops): Wire cobj_destroy_free_op in place of prot_array_free. This fixes a memory leak because prot_array_free was not freeing the handle, only the array. (gc_prot_array_alloc): Fix to allocate everything in one swoop and store the self-pointer in the named member rather than arr[-1]. The self argument is not required; we drop it. The size argument cannot be anywhere near INT_PTR_MAX, because such an array wouldn't fit into virtual memory, so it is always safe to add a small value to the size. (prot_array_free): Obtain the self-pointer, and free the handle, replacing it with a null pointer. * gc.h (gc_prot_array_alloc): Declaration updated. * lib.c (ssort_vec): Don't pass self to gc_prot_array_alloc. * lib.h (container): New macro.
Diffstat (limited to 'lib.h')
-rw-r--r--lib.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/lib.h b/lib.h
index 9e71b5f9..dc90aa23 100644
--- a/lib.h
+++ b/lib.h
@@ -46,6 +46,10 @@ typedef double_uintptr_t dbl_ucnum;
#define coerce(TYPE, EXPR) ((TYPE) (EXPR))
#endif
+#define container(PTR, TYPE, MEMB) \
+ convert(TYPE *, \
+ convert(mem_t *, (PTR)) - offsetof(TYPE, MEMB))
+
#if __STDC_VERSION__ >= 199901L
#define FLEX_ARRAY
#else