private const int NAME_MAX = 255; // from limits.h /// <summary>Initializes the instance with all state necessary to operate a watch.</summary> internal RunningInstance( FileSystemWatcher watcher, SafeFileHandle inotifyHandle, string directoryPath, bool includeSubdirectories, Interop.libc.NotifyEvents notifyFilters, CancellationToken cancellationToken) { Debug.Assert(watcher != null); Debug.Assert(inotifyHandle != null && !inotifyHandle.IsInvalid && !inotifyHandle.IsClosed); Debug.Assert(directoryPath != null); _weakWatcher = new WeakReference <FileSystemWatcher>(watcher); _inotifyHandle = inotifyHandle; _directoryPath = directoryPath; _buffer = watcher.AllocateBuffer(); Debug.Assert(_buffer != null && _buffer.Length > (c_INotifyEventSize + NAME_MAX + 1)); _includeSubdirectories = includeSubdirectories; _notifyFilters = notifyFilters; _cancellationToken = cancellationToken; FileSystemWatcher.CaseSensitive = true; // Add a watch for this starting directory. We keep track of the watch descriptor => directory information // mapping in a dictionary; this is needed in order to be able to determine the containing directory // for all notifications so that we can reconstruct the full path. AddDirectoryWatchUnlocked(null, directoryPath); // Schedule a task to read from the inotify queue and process the events. Task.Factory.StartNew(obj => ((RunningInstance)obj).ProcessEvents(), this, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default); // PERF: As needed, we can look into making this use async I/O rather than burning // a thread that blocks in the read syscall. }
private const int NAME_MAX = 255; // from limits.h /// <summary>Initializes the instance with all state necessary to operate a watch.</summary> internal RunningInstance( FileSystemWatcher watcher, SafeFileHandle inotifyHandle, string directoryPath, bool includeSubdirectories, Interop.libc.NotifyEvents notifyFilters, CancellationToken cancellationToken) { Debug.Assert(watcher != null); Debug.Assert(inotifyHandle != null && !inotifyHandle.IsInvalid && !inotifyHandle.IsClosed); Debug.Assert(directoryPath != null); _weakWatcher = new WeakReference<FileSystemWatcher>(watcher); _inotifyHandle = inotifyHandle; _directoryPath = directoryPath; _buffer = watcher.AllocateBuffer(); Debug.Assert(_buffer != null && _buffer.Length > (c_INotifyEventSize + NAME_MAX + 1)); _includeSubdirectories = includeSubdirectories; _notifyFilters = notifyFilters; _cancellationToken = cancellationToken; FileSystemWatcher.CaseSensitive = true; // Add a watch for this starting directory. We keep track of the watch descriptor => directory information // mapping in a dictionary; this is needed in order to be able to determine the containing directory // for all notifications so that we can reconstruct the full path. AddDirectoryWatchUnlocked(null, directoryPath); // Schedule a task to read from the inotify queue and process the events. Task.Factory.StartNew(obj => ((RunningInstance)obj).ProcessEvents(), this, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default); // PERF: As needed, we can look into making this use async I/O rather than burning // a thread that blocks in the read syscall. }
private const int NAME_MAX = 255; // from limits.h /// <summary>Initializes the instance with all state necessary to operate a watch.</summary> internal RunningInstance( FileSystemWatcher watcher, SafeFileHandle inotifyHandle, string directoryPath, bool includeSubdirectories, Interop.Sys.NotifyEvents notifyFilters, CancellationToken cancellationToken) { Debug.Assert(watcher != null); Debug.Assert(inotifyHandle != null && !inotifyHandle.IsInvalid && !inotifyHandle.IsClosed); Debug.Assert(directoryPath != null); _weakWatcher = new WeakReference<FileSystemWatcher>(watcher); _inotifyHandle = inotifyHandle; _directoryPath = directoryPath; _buffer = watcher.AllocateBuffer(); Debug.Assert(_buffer != null && _buffer.Length > (c_INotifyEventSize + NAME_MAX + 1)); _includeSubdirectories = includeSubdirectories; _notifyFilters = notifyFilters; _cancellationToken = cancellationToken; // Add a watch for this starting directory. We keep track of the watch descriptor => directory information // mapping in a dictionary; this is needed in order to be able to determine the containing directory // for all notifications so that we can reconstruct the full path. AddDirectoryWatchUnlocked(null, directoryPath); }