Fix always calling GC.addRange in ChoppedVector if necessary.
This commit is contained in:
parent
74352a9ac5
commit
eb595ef858
|
@ -38,9 +38,7 @@ struct ChoppedVector(T, size_t CHUNK_SIZE = 16*64*1024/nextPOT(T.sizeof)) {
|
||||||
|
|
||||||
@safe: nothrow:
|
@safe: nothrow:
|
||||||
import core.stdc.stdlib : calloc, free, malloc, realloc;
|
import core.stdc.stdlib : calloc, free, malloc, realloc;
|
||||||
import std.traits : hasElaborateDestructor;
|
import std.traits : hasIndirections;
|
||||||
|
|
||||||
static assert(!hasElaborateDestructor!T, "Cannot store element with elaborate destructor in ChoppedVector.");
|
|
||||||
|
|
||||||
alias chunkSize = CHUNK_SIZE;
|
alias chunkSize = CHUNK_SIZE;
|
||||||
|
|
||||||
|
@ -65,7 +63,9 @@ struct ChoppedVector(T, size_t CHUNK_SIZE = 16*64*1024/nextPOT(T.sizeof)) {
|
||||||
@nogc {
|
@nogc {
|
||||||
() @trusted {
|
() @trusted {
|
||||||
foreach (i; 0 .. m_chunkCount) {
|
foreach (i; 0 .. m_chunkCount) {
|
||||||
GC.removeRange(m_chunks[i]);
|
destroy(m_chunks[i]);
|
||||||
|
static if (hasIndirections!T)
|
||||||
|
GC.removeRange(m_chunks[i]);
|
||||||
free(m_chunks[i]);
|
free(m_chunks[i]);
|
||||||
}
|
}
|
||||||
free(m_chunks.ptr);
|
free(m_chunks.ptr);
|
||||||
|
@ -127,7 +127,9 @@ struct ChoppedVector(T, size_t CHUNK_SIZE = 16*64*1024/nextPOT(T.sizeof)) {
|
||||||
() @trusted {
|
() @trusted {
|
||||||
auto ptr = cast(ChunkPtr)calloc(chunkSize, T.sizeof);
|
auto ptr = cast(ChunkPtr)calloc(chunkSize, T.sizeof);
|
||||||
assert(ptr !is null, "Failed to allocate chunk!");
|
assert(ptr !is null, "Failed to allocate chunk!");
|
||||||
GC.addRange(ptr, chunkSize * T.sizeof);
|
// FIXME: initialize with T.init instead of 0
|
||||||
|
static if (hasIndirections!T)
|
||||||
|
GC.addRange(ptr, chunkSize * T.sizeof);
|
||||||
m_chunks[m_chunkCount++] = ptr;
|
m_chunks[m_chunkCount++] = ptr;
|
||||||
} ();
|
} ();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue