Fix file descriptor leak in DirectoryWatcher (#1104)

- `DirectoryWatcher` opens file descriptors for monitoring
  directories but never closes them, causing a file descriptor
  leak.
- Adds `setCancelHandler` to properly close file descriptors
  when the `DispatchSource` is cancelled.

Signed-off-by: Ronit Sabhaya <ronitsabhaya75@gmail.com>
This commit is contained in:
Ronit Sabhaya
2026-01-30 19:54:57 -08:00
committed by GitHub
parent 72f04b6f14
commit 113a6ec5ba
@@ -48,13 +48,18 @@ public class DirectoryWatcher {
let descriptor = open(directoryURL.path, O_EVTONLY)
source = DispatchSource.makeFileSystemObjectSource(
let dispatchSource = DispatchSource.makeFileSystemObjectSource(
fileDescriptor: descriptor,
eventMask: .write,
queue: monitorQueue
)
source?.setEventHandler { [weak self] in
// Close the file descriptor when the source is cancelled
dispatchSource.setCancelHandler {
close(descriptor)
}
dispatchSource.setEventHandler { [weak self] in
guard let self else { return }
do {
@@ -65,7 +70,8 @@ public class DirectoryWatcher {
}
}
source?.resume()
source = dispatchSource
dispatchSource.resume()
}
deinit {