From 2fbc83085f4a73b228c4441294e66485c319639a Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 22 Oct 2014 20:48:45 -0700 Subject: Ensure that a hash reorganization doesn't take place during a traversal, which could cause items to be visited twice or skipped. * gc.c (full_gc): Changed from static to exter (full_gc): Changed to internal linkage. * gc.h (full_gc): Declared. * hash.c (struct hash): New member, usecount. (struct hash_iter): New member, next. (reachable_iters): New static variable. (hash_mark): Reset the usecount of every reachable hash table. (hash_iter_mark): Add every reachable iterator to reachable_iters list. (make_hash, make_similar_hash, copy_hash): Initialize usecount. (gethash_c): Do not call hash_grow if usecount is nonzero. (hash_begin): Initialize next field of hash_iter to null. Increment use count on hash table. (hash_next): When traversal ends, release use count, and null out the hash table reference. (do_weak_tables): New static function. (do_iters): New static function. (hash_process_weak): Weak hash processing logic moved to do_weak_tables. Also calls do_iters. * txr.1: Describe hash table traversal, and the assurances and caveats about inserting and deleting items. --- gc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gc.c') diff --git a/gc.c b/gc.c index d3dd1f3c..0f7fc785 100644 --- a/gc.c +++ b/gc.c @@ -90,7 +90,7 @@ static val mutobj[MUTOBJ_VEC_SIZE]; static int mutobj_idx; static val freshobj[FRESHOBJ_VEC_SIZE]; static int freshobj_idx; -static int full_gc; +int full_gc; #endif #if EXTRA_DEBUGGING -- cgit v1.2.3