Use Mallocator for Win32 file system watcher buffer.
Avoids allocating using the GC, which `theAllocator` points to by default.
This commit is contained in:
parent
1bbe244196
commit
304de7a39a
|
@ -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