mirror of
https://github.com/apple/container.git
synced 2026-09-21 23:25:43 +00:00
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:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user