Use a thread local allocator instead of processAllocator in HashMap.

This is required since processAllocator returns an ISharedAlloactor since 2.075.0. Because HashMap is operating only thread-local, this should generally be safe.
This commit is contained in:
Sönke Ludwig 2017-06-28 14:05:50 +02:00
parent 01ed0a43de
commit 58ee4a8839
No known key found for this signature in database
GPG key ID: D95E8DB493EE314C
2 changed files with 10 additions and 1 deletions

View file

@ -7,3 +7,12 @@ public import std.experimental.allocator.building_blocks.region;
public import std.experimental.allocator.building_blocks.stats_collector; public import std.experimental.allocator.building_blocks.stats_collector;
public import std.experimental.allocator.gc_allocator; public import std.experimental.allocator.gc_allocator;
public import std.experimental.allocator.mallocator; public import std.experimental.allocator.mallocator;
// NOTE: this needs to be used instead of theAllocator due to Phobos issue 17564
@property IAllocator vibeThreadAllocator()
@safe nothrow @nogc {
static IAllocator s_threadAllocator;
if (!s_threadAllocator)
s_threadAllocator = () @trusted { return allocatorObject(GCAllocator.instance); } ();
return s_threadAllocator;
}

View file

@ -219,7 +219,7 @@ struct HashMap(TKey, TValue, Traits = DefaultHashMapTraits!TKey)
scope(exit) m_resizing = false; scope(exit) m_resizing = false;
if (!m_allocator) { if (!m_allocator) {
try m_allocator = processAllocator(); try m_allocator = vibeThreadAllocator();
catch (Exception e) assert(false, e.msg); catch (Exception e) assert(false, e.msg);
} }