]> git.llucax.com Git - software/dgc/cdgc.git/commitdiff
Return the real size that can be used in getInfo()
authorLeandro Lucarella <llucax@gmail.com>
Mon, 2 Aug 2010 00:59:26 +0000 (21:59 -0300)
committerLeandro Lucarella <llucax@gmail.com>
Mon, 2 Aug 2010 00:59:26 +0000 (21:59 -0300)
getInfo() was not aware of the sentinel, returning a size larger than the
size usable by the user. There are probably more places where this
happens.

rt/gc/cdgc/gc.d

index 267b42f04ebe1adc066af955a1f43a1e670a29b1..f2d2f6ef3469f2bc75703fdd788bc7f3370064f4 100644 (file)
@@ -302,8 +302,20 @@ BlkInfo getInfo(void* p)
     info.base = pool.findBase(p);
     info.size = pool.findSize(info.base);
     info.attr = getAttr(pool, cast(size_t)(info.base - pool.baseAddr) / 16u);
-    if (!opts.options.conservative && !(info.attr & BlkAttr.NO_SCAN))
+    if (has_pointermap(info.attr)) {
         info.size -= size_t.sizeof; // PointerMap bitmask
+        // Points to the PointerMap bitmask pointer, not user data
+        if (p >= (info.base + info.size)) {
+            return BlkInfo.init;
+        }
+    }
+    if (opts.options.sentinel) {
+        info.base = sentinel_add(info.base);
+        // points to sentinel data, not user data
+        if (p < info.base || p >= sentinel_post(info.base))
+            return BlkInfo.init;
+        info.size -= SENTINEL_EXTRA;
+    }
     return info;
 }