summaryrefslogtreecommitdiffstats
path: root/lib.h
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2020-12-31 06:53:02 -0800
committerKaz Kylheku <kaz@kylheku.com>2020-12-31 06:53:02 -0800
commit7b508930b78766c14932847512824282aae59ec0 (patch)
tree123a3b75e0e1c36457b6f8381a78916a589f785c /lib.h
parentee8addba7324e8bd66f107360051a6f200203dc5 (diff)
downloadtxr-7b508930b78766c14932847512824282aae59ec0.tar.gz
txr-7b508930b78766c14932847512824282aae59ec0.tar.bz2
txr-7b508930b78766c14932847512824282aae59ec0.zip
gc: add finalization count to objects.
With the finalization count, we don't have to scan the freshobj array for duplicates when calling finalizers. However, the limited range of the counter limits how many times we can register a finalizer against an object. * gc.c (make_obj): Reset the new fincount field to zero for a newly minted object. (call_finalizers_impl): Decrement the fincount for each object. Only run the freshobj-related logic when the count hits zero. (gc_finalize): Bump the fincount of a registered object. If the counter overflows, throw an exception. * lib.h (obj_common): Add new field fincount for the finalization count. * tree.c (tr_rebuild): Fix up dummy object initializer to accommodate the new member. * txr.1: Document that there is a limit on the number of times an object can be registered for finalization.
Diffstat (limited to 'lib.h')
-rw-r--r--lib.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/lib.h b/lib.h
index c1951a88..f6cc8975 100644
--- a/lib.h
+++ b/lib.h
@@ -94,7 +94,8 @@ typedef unsigned char mem_t;
#if CONFIG_GEN_GC
#define obj_common \
type_t type : PTR_BIT/2; \
- int gen : PTR_BIT/2
+ unsigned fincount : PTR_BIT/4; \
+ int gen : PTR_BIT/4;
#else
#define obj_common \
type_t type