]> git.llucax.com Git - software/dgc/cdgc.git/commitdiff
Abstract how we know if a collection is in progress
authorLeandro Lucarella <llucax@gmail.com>
Sun, 19 Sep 2010 23:53:19 +0000 (20:53 -0300)
committerLeandro Lucarella <llucax@gmail.com>
Mon, 20 Sep 2010 23:33:52 +0000 (20:33 -0300)
rt/gc/cdgc/gc.d

index 308db10f846244b6e15c384eeb9d11335dc0a9c3..52f798dddd35bc162270f5af5051a4cd41808ab2 100644 (file)
@@ -242,6 +242,13 @@ private T locked(T, alias Code)()
 
 private GC* gc;
 
+
+bool collect_in_progress()
+{
+    return gc.mark_proc_pid != 0;
+}
+
+
 bool Invariant()
 {
     assert (gc !is null);
@@ -428,9 +435,8 @@ size_t reserve(size_t size)
  */
 void minimize(bool full = true)
 {
-    // Disabled if a parallel collection is in progress because the shared mark
-    // bits of the freed pool might be used by the mark process
-    if (gc.mark_proc_pid != 0)
+    // The shared mark bits of the freed pool might be used by the mark process
+    if (collect_in_progress())
         return;
 
     if (gc.pools.length == 0)
@@ -799,7 +805,7 @@ size_t fullcollect(void *stackTop)
     // memory is freed (if that not the case, the caller will allocate more
     // memory and the next time it's exhausted it will run a new collection).
     if (opts.options.eager_alloc) {
-        if (gc.mark_proc_pid != 0) { // there is a mark process in progress
+        if (collect_in_progress()) {
             os.WRes r = os.wait_pid(gc.mark_proc_pid, false); // don't block
             assert (r != os.WRes.ERROR);
             switch (r) {
@@ -2057,7 +2063,7 @@ struct Pool
         freebits.set_all();
 
         // avoid accidental sweeping of new pools while using eager allocation
-        if (gc.mark_proc_pid)
+        if (collect_in_progress())
             mark.set_all();
 
         pagetable = cast(ubyte*) cstdlib.malloc(npages);