Fix ChoppedVector to properly use GC.addRange for allocated memory.

This commit is contained in:
Sönke Ludwig 2016-10-24 07:55:00 +02:00
parent 9bf0875778
commit 92c6783ef3

View file

@ -31,6 +31,8 @@ struct StdoutRange {
}
struct ChoppedVector(T, size_t CHUNK_SIZE = 16*64*1024/nextPOT(T.sizeof)) {
import core.memory : GC;
static assert(nextPOT(CHUNK_SIZE) == CHUNK_SIZE,
"CHUNK_SIZE must be a power of two for performance reasons.");
@ -62,8 +64,10 @@ struct ChoppedVector(T, size_t CHUNK_SIZE = 16*64*1024/nextPOT(T.sizeof)) {
void clear()
@nogc {
() @trusted {
foreach (i; 0 .. m_chunkCount)
foreach (i; 0 .. m_chunkCount) {
GC.removeRange(m_chunks[i]);
free(m_chunks[i]);
}
free(m_chunks.ptr);
} ();
m_chunkCount = 0;
@ -119,7 +123,11 @@ struct ChoppedVector(T, size_t CHUNK_SIZE = 16*64*1024/nextPOT(T.sizeof)) {
}
while (m_chunkCount <= chunkidx) {
() @trusted { m_chunks[m_chunkCount++] = cast(ChunkPtr)calloc(chunkSize, T.sizeof); } ();
() @trusted {
auto ptr = cast(ChunkPtr)calloc(chunkSize, T.sizeof);
GC.addRange(ptr, chunkSize * T.sizeof);
m_chunks[m_chunkCount++] = ptr;
} ();
}
}
}
@ -129,7 +137,10 @@ struct AlgebraicChoppedVector(TCommon, TSpecific...)
import std.conv : to;
import std.meta : AliasSeq;
union U { mixin fields!0; }
union U {
typeof(null) none;
mixin fields!0;
}
alias FieldType = TaggedAlgebraic!U;
static struct FullField {
TCommon common;