]> git.llucax.com Git - software/dgc/cdgc.git/commitdiff
Comment why we avoid calling free with null
authorLeandro Lucarella <llucax@gmail.com>
Tue, 22 Jun 2010 03:39:50 +0000 (00:39 -0300)
committerLeandro Lucarella <llucax@gmail.com>
Tue, 22 Jun 2010 03:39:50 +0000 (00:39 -0300)
Even when free() can be called with a null pointer, the extra call might
be significant. On hard GC benchmarks making the test for null in the GC
code (i.e. avoiding the free() call) can reduce the GC time by almost ~5%.

rt/gc/cdgc/bits.d
rt/gc/cdgc/gc.d

index 02300ce9b18effe48dbe33c37944bdd2a23a8626..4d2536275f2bd133217d5a639ca6ced3b1ba7971 100644 (file)
@@ -62,6 +62,10 @@ struct GCBits
 
     void Dtor()
     {
 
     void Dtor()
     {
+        // Even when free() can be called with a null pointer, the extra call
+        // might be significant. On hard GC benchmarks making the test for null
+        // here (i.e. not making the call) can reduce the GC time by almost
+        // ~5%.
         if (data)
         {
             cstdlib.free(data);
         if (data)
         {
             cstdlib.free(data);
index ee05d60d4043341bb0183ca34f0d838aeace0dcd..1e95f061b1895a035a83e25f9876f6ae28d5cc87 100644 (file)
@@ -1378,12 +1378,15 @@ struct Gcx
             pool.Dtor();
             cstdlib.free(pool);
         }
             pool.Dtor();
             cstdlib.free(pool);
         }
+
+        // Even when free() can be called with a null pointer, the extra call
+        // might be significant. On hard GC benchmarks making the test for null
+        // here (i.e. not making the call) can reduce the GC time by almost
+        // ~5%.
         if (pooltable)
             cstdlib.free(pooltable);
         if (pooltable)
             cstdlib.free(pooltable);
-
         if (roots)
             cstdlib.free(roots);
         if (roots)
             cstdlib.free(roots);
-
         if (ranges)
             cstdlib.free(ranges);
     }
         if (ranges)
             cstdlib.free(ranges);
     }
@@ -2579,6 +2582,7 @@ struct Pool
             baseAddr = null;
             topAddr = null;
         }
             baseAddr = null;
             topAddr = null;
         }
+        // See Gcx.Dtor() for the rationale of the null check.
         if (pagetable)
             cstdlib.free(pagetable);
 
         if (pagetable)
             cstdlib.free(pagetable);