Skip to content

Commit

Permalink
Add internal allocator functionality to prepare for refactoring in vi…
Browse files Browse the repository at this point in the history
  • Loading branch information
s-ludwig committed Feb 9, 2024
1 parent b076ff0 commit 14be401
Showing 1 changed file with 48 additions and 2 deletions.
50 changes: 48 additions & 2 deletions source/vibe/container/internal/utilallocator.d
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,52 @@ public import stdx.allocator.building_blocks.affix_allocator;
return s_threadAllocator;
}

auto makeGCSafe(T, Allocator, A...)(Allocator allocator, A args)
{
import core.memory : GC;
import std.traits : hasIndirections;

auto ret = allocator.make!T(args);
static if (is (T == class)) enum tsize = __traits(classInstanceSize, T);
else enum tsize = T.sizeof;
static if (hasIndirections!T)
() @trusted { GC.addRange(cast(void*)ret, tsize, typeid(T)); } ();
return ret;
}

void disposeGCSafe(T, Allocator)(Allocator allocator, T obj)
{
import core.memory : GC;
import std.traits : hasIndirections;

static if (hasIndirections!T)
GC.removeRange(cast(void*)obj);
allocator.dispose(obj);
}

void ensureNotInGC(T)(string info = null) nothrow
{
import core.exception : InvalidMemoryOperationError;
try
{
import core.memory : GC;
cast(void) GC.malloc(1);
return;
}
catch(InvalidMemoryOperationError e)
{
import core.stdc.stdio : fprintf, stderr;
import core.stdc.stdlib : exit;
fprintf(stderr,
"Error: clean-up of %s incorrectly depends on destructors called by the GC.\n",
T.stringof.ptr);
if (info)
fprintf(stderr, "Info: %s\n", info.ptr);
assert(false);
}
}


final class RegionListAllocator(Allocator, bool leak = false) : IAllocator {
import vibe.internal.memory_legacy : AllocSize, alignedSize;
import std.algorithm.comparison : min, max;
Expand Down Expand Up @@ -113,9 +159,9 @@ final class RegionListAllocator(Allocator, bool leak = false) : IAllocator {
override Ternary resolveInternalPointer(void* p, ref void[] result) { return Ternary.unknown; }
}
static if (is(Parameters!(IAllocator.owns)[0] == const(void[]))) {
override Ternary owns(const void[] b) { return Ternary.unknown; }
override Ternary owns(const void[] b) { return Ternary.unknown; }
} else {
override Ternary owns(void[] b) { return Ternary.unknown; }
override Ternary owns(void[] b) { return Ternary.unknown; }
}


Expand Down

0 comments on commit 14be401

Please sign in to comment.