commit fa9ab74ffa85a94eb215b5c5e689fac324919d30
Author: Guillaume Munch <g...@lyx.org>
Date:   Sat Mar 18 20:37:55 2017 +0100

    Correct ownership
    
    One can now delete a file monitor if a blocker is active.
---
 src/support/FileMonitor.cpp |   17 ++++++++---------
 src/support/FileMonitor.h   |    5 +++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/support/FileMonitor.cpp b/src/support/FileMonitor.cpp
index bf53f37..c14d3d6 100644
--- a/src/support/FileMonitor.cpp
+++ b/src/support/FileMonitor.cpp
@@ -31,7 +31,7 @@ namespace support {
 
 FileSystemWatcher & FileSystemWatcher::instance()
 {
-       // This thread-safe because QFileSystemWatcher is thread-safe.
+       // This is thread-safe because QFileSystemWatcher is thread-safe.
        static FileSystemWatcher f;
        return f;
 }
@@ -190,11 +190,11 @@ FileMonitorBlocker FileMonitor::block(int delay)
 }
 
 
-FileMonitorBlockerGuard::FileMonitorBlockerGuard(FileMonitor * parent)
-       : QObject(parent), parent_(parent), delay_(0)
+FileMonitorBlockerGuard::FileMonitorBlockerGuard(FileMonitor * monitor)
+       : monitor_(monitor), delay_(0)
 {
-       QObject::disconnect(parent_->monitor_.get(), SIGNAL(fileChanged()),
-                           parent_, SLOT(changed()));
+       QObject::disconnect(monitor->monitor_.get(), SIGNAL(fileChanged()),
+                           monitor, SLOT(changed()));
 }
 
 
@@ -206,14 +206,13 @@ void FileMonitorBlockerGuard::setDelay(int delay)
 
 FileMonitorBlockerGuard::~FileMonitorBlockerGuard()
 {
-       // closures can only copy local copies
-       FileMonitor * parent = parent_;
-       // parent is also our QObject::parent() so we are deleted before parent.
+       if (!monitor_)
+               return;
        // Even if delay_ is 0, the QTimer is necessary. Indeed, the 
notifications
        // from QFileSystemWatcher that we meant to ignore are not going to be
        // treated immediately, so we must yield to give us the opportunity to
        // ignore them.
-       QTimer::singleShot(delay_, parent, SLOT(connectToFileMonitorGuard()));
+       QTimer::singleShot(delay_, monitor_, 
SLOT(reconnectToFileMonitorGuard()));
 }
 
 } // namespace support
diff --git a/src/support/FileMonitor.h b/src/support/FileMonitor.h
index deca740..768e61f 100644
--- a/src/support/FileMonitor.h
+++ b/src/support/FileMonitor.h
@@ -19,6 +19,7 @@
 
 #include <QFileSystemWatcher>
 #include <QObject>
+#include <QPointer>
 
 #include <boost/signals2.hpp>
 
@@ -132,11 +133,11 @@ private:
 class FileMonitorBlockerGuard : public QObject
 {
        Q_OBJECT
-       FileMonitor * parent_;
+       QPointer<FileMonitor> monitor_;
        int delay_;
 
 public:
-       FileMonitorBlockerGuard(FileMonitor * parent);
+       FileMonitorBlockerGuard(FileMonitor * monitor);
        ~FileMonitorBlockerGuard();
        void setDelay(int delay);
 };

Reply via email to