From fcb069b98bb6a2f59e5ebfd2ad0ab5ee82a1bdb8 Mon Sep 17 00:00:00 2001 From: Teddy Date: Tue, 13 Aug 2013 22:07:31 +0800 Subject: add cycle detect for `Pair`, `ProcObj`, `Envt` and `Cont` --- gc.h | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'gc.h') diff --git a/gc.h b/gc.h index e807048..d116a18 100644 --- a/gc.h +++ b/gc.h @@ -5,8 +5,23 @@ #include const int GC_QUEUE_SIZE = 262144; +const size_t GC_CYC_THRESHOLD = 1000; typedef std::map EvalObj2Int; +typedef std::set EvalObjSet; + +#define GC_CYC_TRIGGER(ptr) \ +do { \ + if ((ptr) && (ptr)->is_container() && !visited.count(ptr)) \ + visited.insert(*tail++ = (ptr)); \ +} while (0) + +#define GC_CYC_DEC(ptr) \ +do { \ + if ((ptr) && (ptr)->is_container()) \ + static_cast(ptr)->gc_refs--; \ +} while (0) + class GarbageCollector { @@ -17,11 +32,11 @@ class GarbageCollector { }; EvalObj2Int mapping; - size_t pend_cnt; PendingEntry *pending_list; public: GarbageCollector(); + void cycle_resolve(); void force(); void expose(EvalObj *ptr); EvalObj *attach(EvalObj *ptr); -- cgit v1.2.3