commit fd6189b7e323c49c6af1948a600741eef01caa79
Author: Guillaume MM <[email protected]>
Date: Sat Jun 10 23:45:57 2017 +0200
Remove FileMonitorBlocker which does not work reliably on all platforms
---
src/Buffer.cpp | 7 +------
src/support/FileMonitor.cpp | 36 ------------------------------------
src/support/FileMonitor.h | 39 ---------------------------------------
3 files changed, 1 insertions(+), 81 deletions(-)
diff --git a/src/Buffer.cpp b/src/Buffer.cpp
index 2e22770..6a29a96 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 2a794f2..c703d2b 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<FileMonitorBlockerGuard>(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<FileMonitorGuard> 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 fdf2bca..14aa834 100644
--- a/src/support/FileMonitor.h
+++ b/src/support/FileMonitor.h
@@ -60,12 +60,6 @@ typedef std::unique_ptr<ActiveFileMonitor>
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<FileMonitor> monitor_;
- int delay_;
-
-public:
- FileMonitorBlockerGuard(FileMonitor * monitor);
- ~FileMonitorBlockerGuard();
- void setDelay(int delay);
-};
-
-
-typedef std::shared_ptr<FileMonitorBlockerGuard> FileMonitorBlocker;
-
-
/// Main class
class FileMonitor : public QObject
{
Q_OBJECT
- friend class FileMonitorBlockerGuard;
public:
FileMonitor(std::shared_ptr<FileMonitorGuard> 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
- ///
<https://www.mail-archive.com/[email protected]/msg200252.html>.
- FileMonitorBlocker block(int delay = 0);
/// Make sure the good file is being monitored, after e.g. a move or a
/// deletion. See <https://bugreports.qt.io/browse/QTBUG-46483>. This is
/// called automatically.
@@ -199,8 +162,6 @@ private:
sig fileChanged_;
/// the unique watch for our file
std::shared_ptr<FileMonitorGuard> const monitor_;
- ///
- std::weak_ptr<FileMonitorBlockerGuard> blocker_;
};