diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2009-11-09 13:44:39 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2009-11-09 13:44:39 -0800 |
commit | 357121301094005f6c56471fb18f9ff1b6bc8d13 (patch) | |
tree | e9b4d47ace9622de678f5c863e473bfa00fd721f /gc.c | |
parent | 10e4d4687df9a41a017fc438bc16407265dfe281 (diff) | |
download | txr-357121301094005f6c56471fb18f9ff1b6bc8d13.tar.gz txr-357121301094005f6c56471fb18f9ff1b6bc8d13.tar.bz2 txr-357121301094005f6c56471fb18f9ff1b6bc8d13.zip |
First cut at hash tables. One known problem is allocation during gc,
due to use of boxed numbers for vector access.
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 16 |
1 files changed, 16 insertions, 0 deletions
@@ -32,6 +32,7 @@ #include <dirent.h> #include "lib.h" #include "stream.h" +#include "hash.h" #include "txr.h" #include "gc.h" @@ -350,8 +351,11 @@ void gc(void) if (gc_enabled) { jmp_buf jmp; setjmp(jmp); + gc_enabled = 0; mark(); + hash_process_weak(); sweep(); + gc_enabled = 1; } } @@ -372,6 +376,18 @@ void gc_mark(obj_t *obj) mark_obj(obj); } +int gc_is_reachable(obj_t *obj) +{ + type_t t; + + if (obj == nil) + return 1; + + t = obj->t.type; + + return (t & REACHABLE) != 0; +} + /* * Useful functions for gdb'ing. */ |