FSEvents file system watcher: Do not watch whole parent hierarchies.
authorEike Ziller <eike.ziller@theqtcompany.com>
Mon, 1 Dec 2014 08:10:43 +0000 (09:10 +0100)
committerJani Heikkinen <jani.heikkinen@theqtcompany.com>
Mon, 1 Dec 2014 19:03:42 +0000 (20:03 +0100)
Unfortunately the FSEvents implementation for watching parent
hierarchies has the major flaw, that watching a path will then
create watches for the whole parent hierarchy even if that
hierarchy is already watched. Watching /A/B/C and /A/B/D will
create two watches each for /A and /A/B. This leads to an explosion
of open file handles.
Luckily we do not need to watch the parent hierarchy since this
is not a supported usecase of QFileSystemWatcher anyhow, so just don't
do it.

Task-number: QTCREATORBUG-13531
Change-Id: I9ecb5f08e4be35e4fbd58a7ca3155867fcb1589f
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
src/corelib/io/qfilesystemwatcher_fsevents.mm

index eebca1cfb004986f360abe0fee3a47e23cbac0b7..90ef7a63360b00e9ffa25eb1822d7ce12ead08d1 100644 (file)
@@ -518,7 +518,6 @@ bool QFseventsFileSystemWatcherEngine::startStream()
         NULL
     };
     const CFAbsoluteTime latency = .5; // in seconds
-    FSEventStreamCreateFlags flags = kFSEventStreamCreateFlagWatchRoot;
 
     // Never start with kFSEventStreamEventIdSinceNow, because this will generate an invalid
     // soft-assert in FSEventStreamFlushSync in CarbonCore when no event occurred.
@@ -530,7 +529,7 @@ bool QFseventsFileSystemWatcherEngine::startStream()
                                  reinterpret_cast<CFArrayRef>(pathsToWatch),
                                  lastReceivedEvent,
                                  latency,
-                                 flags);
+                                 FSEventStreamCreateFlags(0));
 
     if (!stream) {
         DEBUG() << "Failed to create stream!";