Merge pull request #108 from vibe-d/watcher_allocation
Use Mallocator for Win32 file system watcher buffer
This commit is contained in:
commit
a0cef63b5d
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue