Merge pull request #108 from vibe-d/watcher_allocation

Use Mallocator for Win32 file system watcher buffer
This commit is contained in:
Leonid Kramer 2019-04-13 20:49:28 +02:00 committed by GitHub
commit a0cef63b5d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 15 deletions

View file

@ -466,8 +466,8 @@ interface EventDriverFiles {
@property final ref T userData(T)(FileFD descriptor) @property final ref T userData(T)(FileFD descriptor)
@trusted { @trusted {
import std.conv : emplace; import std.conv : emplace;
static void init(void* ptr) { emplace(cast(T*)ptr); } static void init(void* ptr) @nogc { emplace(cast(T*)ptr); }
static void destr(void* ptr) { destroy(*cast(T*)ptr); } static void destr(void* ptr) @nogc { destroy(*cast(T*)ptr); }
return *cast(T*)rawUserData(descriptor, T.sizeof, &init, &destr); return *cast(T*)rawUserData(descriptor, T.sizeof, &init, &destr);
} }
@ -524,8 +524,8 @@ interface EventDriverEvents {
@property final ref T userData(T)(EventID descriptor) @property final ref T userData(T)(EventID descriptor)
@trusted { @trusted {
import std.conv : emplace; import std.conv : emplace;
static void init(void* ptr) { emplace(cast(T*)ptr); } static void init(void* ptr) @nogc { emplace(cast(T*)ptr); }
static void destr(void* ptr) { destroy(*cast(T*)ptr); } static void destr(void* ptr) @nogc { destroy(*cast(T*)ptr); }
return *cast(T*)rawUserData(descriptor, T.sizeof, &init, &destr); return *cast(T*)rawUserData(descriptor, T.sizeof, &init, &destr);
} }
@ -610,8 +610,8 @@ interface EventDriverTimers {
@property final ref T userData(T)(TimerID descriptor) @property final ref T userData(T)(TimerID descriptor)
@trusted { @trusted {
import std.conv : emplace; import std.conv : emplace;
static void init(void* ptr) { emplace(cast(T*)ptr); } static void init(void* ptr) @nogc { emplace(cast(T*)ptr); }
static void destr(void* ptr) { destroy(*cast(T*)ptr); } static void destr(void* ptr) @nogc { destroy(*cast(T*)ptr); }
return *cast(T*)rawUserData(descriptor, T.sizeof, &init, &destr); return *cast(T*)rawUserData(descriptor, T.sizeof, &init, &destr);
} }
@ -643,8 +643,8 @@ interface EventDriverWatchers {
@property final ref T userData(T)(WatcherID descriptor) @property final ref T userData(T)(WatcherID descriptor)
@trusted { @trusted {
import std.conv : emplace; import std.conv : emplace;
static void init(void* ptr) { emplace(cast(T*)ptr); } static void init(void* ptr) @nogc { emplace(cast(T*)ptr); }
static void destr(void* ptr) { destroy(*cast(T*)ptr); } static void destr(void* ptr) @nogc { destroy(*cast(T*)ptr); }
return *cast(T*)rawUserData(descriptor, T.sizeof, &init, &destr); return *cast(T*)rawUserData(descriptor, T.sizeof, &init, &destr);
} }
@ -716,8 +716,8 @@ interface EventDriverProcesses {
@property final ref T userData(T)(ProcessID descriptor) @property final ref T userData(T)(ProcessID descriptor)
@trusted { @trusted {
import std.conv : emplace; import std.conv : emplace;
static void init(void* ptr) { emplace(cast(T*)ptr); } static void init(void* ptr) @nogc { emplace(cast(T*)ptr); }
static void destr(void* ptr) { destroy(*cast(T*)ptr); } static void destr(void* ptr) @nogc { destroy(*cast(T*)ptr); }
return *cast(T*)rawUserData(descriptor, T.sizeof, &init, &destr); return *cast(T*)rawUserData(descriptor, T.sizeof, &init, &destr);
} }
@ -791,8 +791,8 @@ interface EventDriverPipes {
@property final ref T userData(T)(PipeFD descriptor) @property final ref T userData(T)(PipeFD descriptor)
@trusted { @trusted {
import std.conv : emplace; import std.conv : emplace;
static void init(void* ptr) { emplace(cast(T*)ptr); } static void init(void* ptr) @nogc { emplace(cast(T*)ptr); }
static void destr(void* ptr) { destroy(*cast(T*)ptr); } static void destr(void* ptr) @nogc { destroy(*cast(T*)ptr); }
return *cast(T*)rawUserData(descriptor, T.sizeof, &init, &destr); return *cast(T*)rawUserData(descriptor, T.sizeof, &init, &destr);
} }

View file

@ -6,7 +6,8 @@ import eventcore.driver;
import eventcore.drivers.winapi.core; import eventcore.drivers.winapi.core;
import eventcore.drivers.winapi.driver : WinAPIEventDriver; // FIXME: this is an ugly dependency import eventcore.drivers.winapi.driver : WinAPIEventDriver; // FIXME: this is an ugly dependency
import eventcore.internal.win32; import eventcore.internal.win32;
import std.experimental.allocator : dispose, makeArray, theAllocator; import std.experimental.allocator.mallocator : Mallocator;
import std.experimental.allocator : dispose, makeArray;
final class WinAPIEventDriverWatchers : EventDriverWatchers { final class WinAPIEventDriverWatchers : EventDriverWatchers {
@ -23,6 +24,7 @@ final class WinAPIEventDriverWatchers : EventDriverWatchers {
override WatcherID watchDirectory(string path, bool recursive, FileChangesCallback callback) override WatcherID watchDirectory(string path, bool recursive, FileChangesCallback callback)
{ {
import std.utf : toUTF16z; import std.utf : toUTF16z;
auto handle = () @trusted { auto handle = () @trusted {
scope (failure) assert(false); scope (failure) assert(false);
return CreateFileW(path.toUTF16z, FILE_LIST_DIRECTORY, return CreateFileW(path.toUTF16z, FILE_LIST_DIRECTORY,
@ -43,7 +45,7 @@ final class WinAPIEventDriverWatchers : EventDriverWatchers {
slot.callback = callback; slot.callback = callback;
slot.overlapped.driver = m_core; slot.overlapped.driver = m_core;
slot.buffer = () @trusted { slot.buffer = () @trusted {
try return theAllocator.makeArray!ubyte(16384); try return Mallocator.instance.makeArray!ubyte(16384);
catch (Exception e) assert(false, "Failed to allocate directory watcher buffer."); catch (Exception e) assert(false, "Failed to allocate directory watcher buffer.");
} (); } ();
if (!triggerRead(handle, *slot)) { if (!triggerRead(handle, *slot)) {
@ -83,7 +85,7 @@ final class WinAPIEventDriverWatchers : EventDriverWatchers {
CloseHandle(handle); CloseHandle(handle);
() @trusted { () @trusted {
try theAllocator.dispose(slot.watcher.buffer); try Mallocator.instance.dispose(slot.watcher.buffer);
catch (Exception e) assert(false, "Freeing directory watcher buffer failed."); catch (Exception e) assert(false, "Freeing directory watcher buffer failed.");
} (); } ();
slot.watcher.buffer = null; slot.watcher.buffer = null;