diff options
author | Norwegian Rock Cat <qt-info@nokia.com> | 2009-08-03 13:40:55 (GMT) |
---|---|---|
committer | Norwegian Rock Cat <qt-info@nokia.com> | 2009-08-03 13:46:18 (GMT) |
commit | 6130b2137da4c4aa6f12c2fb4e99ef19ac008781 (patch) | |
tree | b5935e8b8fed3ade63498f2cdaff406e48407732 | |
parent | 87432a42fba53ad910e8e21feb94e638f4ae17eb (diff) | |
download | Qt-6130b2137da4c4aa6f12c2fb4e99ef19ac008781.zip Qt-6130b2137da4c4aa6f12c2fb4e99ef19ac008781.tar.gz Qt-6130b2137da4c4aa6f12c2fb4e99ef19ac008781.tar.bz2 |
Fix deadlock in the fsevents file watcher.
I was making an assumption that one could call CFRunLoopStop and expect
that the runloop would stop very soon afterwards. This is a bit naive
and can result in situations where we end up running past and entering
run again before everything is finished. We now make sure that we don't
leave stop() until the we really have stopped the other thread.
Reviewed-by: mbm
-rw-r--r-- | src/corelib/io/qfilesystemwatcher_fsevents.cpp | 7 | ||||
-rw-r--r-- | src/corelib/io/qfilesystemwatcher_fsevents_p.h | 1 |
2 files changed, 7 insertions, 1 deletions
diff --git a/src/corelib/io/qfilesystemwatcher_fsevents.cpp b/src/corelib/io/qfilesystemwatcher_fsevents.cpp index 3e0aee8..cb276b7 100644 --- a/src/corelib/io/qfilesystemwatcher_fsevents.cpp +++ b/src/corelib/io/qfilesystemwatcher_fsevents.cpp @@ -422,9 +422,12 @@ void QFSEventsFileSystemWatcherEngine::fseventsCallback(ConstFSEventStreamRef , void QFSEventsFileSystemWatcherEngine::stop() { #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 + QMutexLocker locker(&mutex); stopFSStream(fsStream); - if (threadsRunLoop) + if (threadsRunLoop) { CFRunLoopStop(threadsRunLoop); + waitForStop.wait(&mutex); + } #endif } @@ -461,6 +464,8 @@ void QFSEventsFileSystemWatcherEngine::run() // immediately. CFRunLoopRun(); threadsRunLoop = 0; + QMutexLocker locker(&mutex); + waitForStop.wakeAll(); #endif } diff --git a/src/corelib/io/qfilesystemwatcher_fsevents_p.h b/src/corelib/io/qfilesystemwatcher_fsevents_p.h index 4770867..ffc0c68 100644 --- a/src/corelib/io/qfilesystemwatcher_fsevents_p.h +++ b/src/corelib/io/qfilesystemwatcher_fsevents_p.h @@ -114,6 +114,7 @@ private: CFRunLoopRef threadsRunLoop; QMutex mutex; QWaitCondition waitCondition; + QWaitCondition waitForStop; #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 PathHash filePathInfoHash; PathHash dirPathInfoHash; |