Fix cleanup code for directory watchers in the WinAPI driver.

- Fixes an assertion triggered by accessing a file field in releaseRef

- Fixed a potential leak of file system watcher handles when calling releaseRef from inside the supplied callback - this was the reason why the fixed assertion error wasn't triggered by the test code
This commit is contained in:
Sönke Ludwig 2018-03-14 16:39:57 +01:00
parent 574de0760d
commit 53bb8eeead

View file

@ -82,7 +82,7 @@ final class WinAPIEventDriverWatchers : EventDriverWatchers {
catch (Exception e) assert(false, "Freeing directory watcher buffer failed.");
} ();
slot.watcher.buffer = null;
core.discardEvents(&slot.watcher.overlapped, &slot.file.write.overlapped);
core.discardEvents(&slot.watcher.overlapped);
core.freeSlot(handle);
}))
{
@ -159,10 +159,13 @@ final class WinAPIEventDriverWatchers : EventDriverWatchers {
catch (Exception e) {} // FIXME: can happen if the base path is relative and the CWD has changed
if (ch.kind != FileChangeKind.modified || !ch.isDirectory)
slot.callback(id, ch);
if (fni.NextEntryOffset == 0) break;
if (fni.NextEntryOffset == 0 || !slot.callback) break;
}
triggerRead(handle, *slot);
if (slot.callback)
triggerRead(handle, *slot);
else if (gslot.refCount == 1)
doReleaseRef(handle);
}
private static bool triggerRead(HANDLE handle, ref WatcherSlot slot)