]> git.llucax.com Git - software/dgc/cdgc.git/blobdiff - rt/gc/cdgc/bits.d
Make heap precise scanning optional
[software/dgc/cdgc.git] / rt / gc / cdgc / bits.d
index 67eb2df19c5df2227224fb86d2d563407e49e3d7..4d2536275f2bd133217d5a639ca6ced3b1ba7971 100644 (file)
@@ -26,7 +26,8 @@
 
 module rt.gc.cdgc.bits;
 
 
 module rt.gc.cdgc.bits;
 
-import rt.gc.cdgc.libc;
+import cstdlib = tango.stdc.stdlib;
+import cstring = tango.stdc.string;
 
 private extern (C) void onOutOfMemoryError();
 
 
 private extern (C) void onOutOfMemoryError();
 
@@ -34,6 +35,7 @@ private extern (C) void onOutOfMemoryError();
 version (DigitalMars)
 {
     version = bitops;
 version (DigitalMars)
 {
     version = bitops;
+    import std.intrinsic;
 }
 else version (GNU)
 {
 }
 else version (GNU)
 {
@@ -60,9 +62,13 @@ 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)
         {
         if (data)
         {
-            free(data);
+            cstdlib.free(data);
             data = null;
         }
     }
             data = null;
         }
     }
@@ -79,7 +85,7 @@ struct GCBits
     {
         this.nbits = nbits;
         nwords = (nbits + (BITS_PER_WORD - 1)) >> BITS_SHIFT;
     {
         this.nbits = nbits;
         nwords = (nbits + (BITS_PER_WORD - 1)) >> BITS_SHIFT;
-        data = cast(uint*)calloc(nwords + 2, uint.sizeof);
+        data = cast(uint*)cstdlib.calloc(nwords + 2, uint.sizeof);
         if (!data)
             onOutOfMemoryError();
     }
         if (!data)
             onOutOfMemoryError();
     }
@@ -136,14 +142,13 @@ struct GCBits
             }
         }
         else
             }
         }
         else
-        {   uint result;
-
+        {
             //result = (cast(bit *)(data + 1))[i];
             //(cast(bit *)(data + 1))[i] = 0;
 
             uint* p = &data[1 + (i >> BITS_SHIFT)];
             uint  mask = (1 << (i & BITS_MASK));
             //result = (cast(bit *)(data + 1))[i];
             //(cast(bit *)(data + 1))[i] = 0;
 
             uint* p = &data[1 + (i >> BITS_SHIFT)];
             uint  mask = (1 << (i & BITS_MASK));
-            result = *p & mask;
+            uint result = *p & mask;
             *p &= ~mask;
             return result;
         }
             *p &= ~mask;
             return result;
         }
@@ -156,7 +161,7 @@ struct GCBits
             for (;d1!=dEnd;++d1)
                 *d1=0u;
         } else {
             for (;d1!=dEnd;++d1)
                 *d1=0u;
         } else {
-            memset(data + 1, 0, nwords * uint.sizeof);
+            cstring.memset(data + 1, 0, nwords * uint.sizeof);
         }
     }
 
         }
     }
 
@@ -172,7 +177,7 @@ struct GCBits
             for (;d1!=dEnd;++d1,++d2)
                 *d1=*d2;
         } else {
             for (;d1!=dEnd;++d1,++d2)
                 *d1=*d2;
         } else {
-            memcpy(data + 1, f.data + 1, nwords * uint.sizeof);
+            cstring.memcpy(data + 1, f.data + 1, nwords * uint.sizeof);
         }
     }
 
         }
     }
 
@@ -216,3 +221,6 @@ unittest
 
     b.Dtor();
 }
 
     b.Dtor();
 }
+
+
+// vim: set et sw=4 sts=4 :