diff options
author | Teddy <ted.sybil@gmail.com> | 2013-08-13 22:07:31 +0800 |
---|---|---|
committer | Teddy <ted.sybil@gmail.com> | 2013-08-13 22:07:31 +0800 |
commit | fcb069b98bb6a2f59e5ebfd2ad0ab5ee82a1bdb8 (patch) | |
tree | 72ee9cea7cc35bef2971eb5de85806eb07f20fb8 /gc.h | |
parent | 9982fba5f471944a2e5ab1edac97c971eb557416 (diff) |
add cycle detect for `Pair`, `ProcObj`, `Envt` and `Cont`
Diffstat (limited to 'gc.h')
-rw-r--r-- | gc.h | 17 |
1 files changed, 16 insertions, 1 deletions
@@ -5,8 +5,23 @@ #include <map> const int GC_QUEUE_SIZE = 262144; +const size_t GC_CYC_THRESHOLD = 1000; typedef std::map<EvalObj*, size_t> EvalObj2Int; +typedef std::set<EvalObj*> 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<Container*>(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); |