public void EvalWatchd(RCRunner runner, RCClosure closure, RCString left, RCString right) { long handle = Interlocked.Increment(ref _handle); RCLFileSystemWatcher watcher = new RCLFileSystemWatcher(runner, handle, right[0], left[0]); watcher.InternalBufferSize = 16 * 1024; watcher.IncludeSubdirectories = true; watcher.NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.CreationTime | NotifyFilters.Attributes | NotifyFilters.LastWrite | NotifyFilters.Size; watcher.Created += watcher_Created; watcher.Changed += watcher_Changed; watcher.Deleted += watcher_Deleted; watcher.Renamed += watcher_Renamed; watcher.EnableRaisingEvents = true; lock (_lock) { _output.Add(handle, new Queue <RCBlock> ()); _watchers.Add(handle, watcher); } runner.Yield(closure, new RCLong(handle)); }
void watcher_Changed(object sender, FileSystemEventArgs e) { RCLFileSystemWatcher watcher = (RCLFileSystemWatcher)sender; RCBlock result = GetFileEventInfo(e); EnqueueAndDrain(watcher, result); }
void watcher_Renamed(object sender, RenamedEventArgs e) { RCLFileSystemWatcher watcher = (RCLFileSystemWatcher)sender; RCBlock result = GetFileEventInfo(e); result = new RCBlock(result, "oldname", ":", new RCString(e.OldName)); result = new RCBlock(result, "oldfullpath", ":", new RCString(e.OldFullPath)); // RCSystem.Log.Record (watcher.Runner, closure, "fs", watcher.Handle, "rename", // result); EnqueueAndDrain(watcher, result); }
void Drain(RCLFileSystemWatcher watcher, RCClosure closure, Queue <RCBlock> queue) { RCBlock result = RCBlock.Empty; while (queue.Count > 0) { result = new RCBlock(result, "", ":", queue.Dequeue()); } if (result.Count > 0) { _waiters.Remove(watcher.Handle); watcher.Runner.Yield(closure, result); } }
void EnqueueAndDrain(RCLFileSystemWatcher watcher, RCBlock result) { lock (_lock) { _output[watcher.Handle].Enqueue(result); RCClosure closure; if (_waiters.TryGetValue(watcher.Handle, out closure)) { Queue <RCBlock> queue; if (_output.TryGetValue(watcher.Handle, out queue)) { Drain(watcher, closure, queue); } } } }