Change all invalid handle values to ~0 and improve FileChange.
FileChange now has the full path of a file split into the base path (as specified when creating the watcher), the sub directory, and the file name. This allows to work with less dynamic memory allocations internally.
This commit is contained in:
parent
5bba45485c
commit
815db0727c
|
@ -652,14 +652,21 @@ struct FileChange {
|
|||
/// The type of change
|
||||
FileChangeKind kind;
|
||||
|
||||
/// Directory containing the changed file
|
||||
string directory;
|
||||
/// The root directory of the watcher
|
||||
string baseDirectory;
|
||||
|
||||
/// Determines if the changed entity is a file or a directory.
|
||||
bool isDirectory;
|
||||
/// Subdirectory containing the changed file
|
||||
string directory;
|
||||
|
||||
/// Name of the changed file
|
||||
const(char)[] name;
|
||||
|
||||
/** Determines if the changed entity is a file or a directory.
|
||||
|
||||
Note that depending on the platform this may not be accurate for
|
||||
`FileChangeKind.removed`.
|
||||
*/
|
||||
bool isDirectory;
|
||||
}
|
||||
|
||||
struct Handle(string NAME, T, T invalid_value = T.init) {
|
||||
|
@ -695,8 +702,8 @@ alias StreamListenSocketFD = Handle!("streamListen", SocketFD);
|
|||
alias DatagramSocketFD = Handle!("datagramSocket", SocketFD);
|
||||
alias FileFD = Handle!("file", FD);
|
||||
alias EventID = Handle!("event", FD);
|
||||
alias TimerID = Handle!("timer", size_t);
|
||||
alias WatcherID = Handle!("watcher", size_t);
|
||||
alias EventWaitID = Handle!("eventWait", size_t);
|
||||
alias SignalListenID = Handle!("signal", size_t);
|
||||
alias DNSLookupID = Handle!("dns", size_t);
|
||||
alias TimerID = Handle!("timer", size_t, size_t.max);
|
||||
alias WatcherID = Handle!("watcher", size_t, size_t.max);
|
||||
alias EventWaitID = Handle!("eventWait", size_t, size_t.max);
|
||||
alias SignalListenID = Handle!("signal", size_t, size_t.max);
|
||||
alias DNSLookupID = Handle!("dns", size_t, size_t.max);
|
||||
|
|
|
@ -78,6 +78,7 @@ final class WinAPIEventDriverWatchers : EventDriverWatchers {
|
|||
void onIOCompleted(DWORD dwError, DWORD cbTransferred, OVERLAPPED* overlapped)
|
||||
{
|
||||
import std.conv : to;
|
||||
import std.path : dirName, baseName;
|
||||
|
||||
if (dwError != 0) {
|
||||
// FIXME: this must be propagated to the caller
|
||||
|
@ -114,9 +115,10 @@ final class WinAPIEventDriverWatchers : EventDriverWatchers {
|
|||
case 0x4: ch.kind = FileChangeKind.removed; break;
|
||||
case 0x5: ch.kind = FileChangeKind.added; break;
|
||||
}
|
||||
ch.directory = slot.directory;
|
||||
ch.isDirectory = false; // FIXME: is this right?
|
||||
ch.name = () @trusted { scope (failure) assert(false); return to!string(fni.FileName[0 .. fni.FileNameLength/2]); } ();
|
||||
ch.baseDirectory = slot.directory;
|
||||
auto path = () @trusted { scope (failure) assert(false); return to!string(fni.FileName[0 .. fni.FileNameLength/2]); } ();
|
||||
ch.directory = dirName(path);
|
||||
ch.name = baseName(path);
|
||||
slot.callback(id, ch);
|
||||
if (fni.NextEntryOffset == 0) break;
|
||||
result = result[fni.NextEntryOffset .. $];
|
||||
|
|
Loading…
Reference in a new issue