From: Guillaume MM Date: Sat, 10 Jun 2017 21:45:57 +0000 (+0200) Subject: Remove FileMonitorBlocker which does not work reliably on all platforms X-Git-Tag: 2.3.0beta1~261 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=fd6189b7e323c49c6af1948a600741eef01caa79;p=features.git Remove FileMonitorBlocker which does not work reliably on all platforms --- diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 2e22770f5c..6a29a9613b 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -382,9 +382,6 @@ public: /// Notify or clear of external modification void fileExternallyModified(bool exists) const; - /// Block notifications of external modifications - FileMonitorBlocker blockFileMonitor() { return file_monitor_->block(); } - /// has been externally modified? Can be reset by the user. mutable bool externally_modified_; @@ -1379,7 +1376,6 @@ FileName Buffer::getBackupName() const { // Should probably be moved to somewhere else: BufferView? GuiView? bool Buffer::save() const { - FileMonitorBlocker block = d->blockFileMonitor(); docstring const file = makeDisplayPath(absFileName(), 20); d->filename.refresh(); @@ -5338,8 +5334,7 @@ void Buffer::Impl::refreshFileMonitor() void Buffer::Impl::fileExternallyModified(bool const exists) const { - // prevent false positives, because FileMonitorBlocker is not enough on - // OSX. + // ignore notifications after our own saving operations if (checksum_ == filename.checksum()) { LYXERR(Debug::FILES, "External modification but " "checksum unchanged: " << filename); diff --git a/src/support/FileMonitor.cpp b/src/support/FileMonitor.cpp index 2a794f2931..c703d2bba7 100644 --- a/src/support/FileMonitor.cpp +++ b/src/support/FileMonitor.cpp @@ -202,42 +202,6 @@ void FileMonitor::changed(bool const exists) } -FileMonitorBlocker FileMonitor::block(int delay) -{ - FileMonitorBlocker blocker = blocker_.lock(); - if (!blocker) - blocker_ = blocker = make_shared(this); - blocker->setDelay(delay); - return blocker; -} - - -FileMonitorBlockerGuard::FileMonitorBlockerGuard(FileMonitor * monitor) - : monitor_(monitor), delay_(0) -{ - QObject::disconnect(monitor->monitor_.get(), SIGNAL(fileChanged(bool)), - monitor, SLOT(changed(bool))); -} - - -void FileMonitorBlockerGuard::setDelay(int delay) -{ - delay_ = max(delay_, delay); -} - - -FileMonitorBlockerGuard::~FileMonitorBlockerGuard() -{ - 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_, monitor_, SLOT(connectToFileMonitorGuard())); -} - - ActiveFileMonitor::ActiveFileMonitor(std::shared_ptr monitor, FileName const & filename, int interval) : FileMonitor(monitor), filename_(filename), interval_(interval), diff --git a/src/support/FileMonitor.h b/src/support/FileMonitor.h index fdf2bca69d..14aa834c80 100644 --- a/src/support/FileMonitor.h +++ b/src/support/FileMonitor.h @@ -60,12 +60,6 @@ typedef std::unique_ptr ActiveFileMonitorPtr; /// monitor.connect(...); /// (stops watching the first) /// -/// Block notifications for the duration of a scope: -/// { -/// FileMonitorBlocker block = monitor.block(); -/// ... -/// } -/// /// Reset connections: /// monitor.disconnect(); /// or the disconnect method of the connection object for the boost signal. @@ -131,27 +125,10 @@ private: }; -class FileMonitorBlockerGuard : public QObject -{ - Q_OBJECT - QPointer monitor_; - int delay_; - -public: - FileMonitorBlockerGuard(FileMonitor * monitor); - ~FileMonitorBlockerGuard(); - void setDelay(int delay); -}; - - -typedef std::shared_ptr FileMonitorBlocker; - - /// Main class class FileMonitor : public QObject { Q_OBJECT - friend class FileMonitorBlockerGuard; public: FileMonitor(std::shared_ptr monitor); @@ -165,20 +142,6 @@ public: void disconnect(); /// absolute path being tracked std::string const & filename() { return monitor_->filename(); } - /// Creates a guard that blocks notifications. Copyable. Notifications from - /// this monitor are blocked as long as there are copies of the - /// FileMonitorBlocker around. - /// \param delay is the amount waited in ms after expiration of the guard - /// before reconnecting. It can be used to slow down incoming events - /// accordingly. A value of 0 is still made asynchronous, because of the - /// fundamentally asynchronous nature of QFileSystemWatcher. To catch one's - /// own file operations, a value of 0 for delay is sufficient with the - /// inotify backend (e.g. Linux); for OSX (kqueue), a value of 100ms is - /// unsufficient and more tests need to be done in combination with - /// flushing/syncing to disk in order to understand how to catch one's own - /// operations reliably. No feedback about Windows. See - /// . - FileMonitorBlocker block(int delay = 0); /// Make sure the good file is being monitored, after e.g. a move or a /// deletion. See . This is /// called automatically. @@ -199,8 +162,6 @@ private: sig fileChanged_; /// the unique watch for our file std::shared_ptr const monitor_; - /// - std::weak_ptr blocker_; };