X-Git-Url: https://git.llucax.com/software/dgc/cdgc.git/blobdiff_plain/d512e824a57ab7912ce0c57798a8560479637c10..62b4073393f1d66e88322376627c8bef7b27f81d:/rt/gc/cdgc/bits.d?ds=sidebyside diff --git a/rt/gc/cdgc/bits.d b/rt/gc/cdgc/bits.d index 4d25362..3dd8f34 100644 --- a/rt/gc/cdgc/bits.d +++ b/rt/gc/cdgc/bits.d @@ -26,7 +26,8 @@ module rt.gc.cdgc.bits; -import cstdlib = tango.stdc.stdlib; +import os = rt.gc.cdgc.os; + import cstring = tango.stdc.string; private extern (C) void onOutOfMemoryError(); @@ -60,15 +61,21 @@ struct GCBits size_t nwords = 0; // allocated words in data[] excluding sentinals size_t nbits = 0; // number of bits in data[] excluding sentinals - void Dtor() + /// Get the number of bytes needed to store nbits bits + size_t data_size() + { + return (nwords + 2) * uint.sizeof; // +2 for sentinels + } + + void Dtor(os.Vis vis = os.Vis.PRIV) { - // 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%. + // Even when os.dealloc() 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); + os.dealloc(data, data_size, vis); data = null; } } @@ -81,11 +88,11 @@ struct GCBits } } - void alloc(size_t nbits) + void alloc(size_t nbits, os.Vis vis = os.Vis.PRIV) { this.nbits = nbits; - nwords = (nbits + (BITS_PER_WORD - 1)) >> BITS_SHIFT; - data = cast(uint*)cstdlib.calloc(nwords + 2, uint.sizeof); + this.nwords = (nbits + (BITS_PER_WORD - 1)) >> BITS_SHIFT; + this.data = cast(uint*) os.alloc(data_size, vis); if (!data) onOutOfMemoryError(); }