| Index: base/files/file_path_watcher_linux.cc
|
| diff --git a/base/files/file_path_watcher_linux.cc b/base/files/file_path_watcher_linux.cc
|
| index 9589e9b788dce7807ac0b97a011e6012e6b47860..df4189cd2c9adc71af4fcc9e18a709ae0d80d431 100644
|
| --- a/base/files/file_path_watcher_linux.cc
|
| +++ b/base/files/file_path_watcher_linux.cc
|
| @@ -24,7 +24,6 @@
|
| #include "base/files/file_enumerator.h"
|
| #include "base/files/file_path.h"
|
| #include "base/files/file_util.h"
|
| -#include "base/lazy_instance.h"
|
| #include "base/location.h"
|
| #include "base/logging.h"
|
| #include "base/macros.h"
|
| @@ -63,14 +62,12 @@ class InotifyReader {
|
| void OnInotifyEvent(const inotify_event* event);
|
|
|
| private:
|
| - friend struct DefaultLazyInstanceTraits<InotifyReader>;
|
| -
|
| + friend InotifyReader* GetInotifyReader();
|
| typedef std::set<FilePathWatcherImpl*> WatcherSet;
|
|
|
| InotifyReader();
|
| - // There is no destructor because |g_inotify_reader| is a
|
| - // base::LazyInstace::Leaky object. Having a destructor causes build
|
| - // issues with GCC 6 (http://crbug.com/636346).
|
| + // There is no destructor because GetInotifyReader() is leaky. Having a
|
| + // destructor causes build issues with GCC 6 (http://crbug.com/636346).
|
|
|
| // We keep track of which delegates want to be notified on which watches.
|
| hash_map<Watch, WatcherSet> watchers_;
|
| @@ -243,8 +240,10 @@ void InotifyReaderCallback(InotifyReader* reader, int inotify_fd) {
|
| }
|
| }
|
|
|
| -static LazyInstance<InotifyReader>::Leaky g_inotify_reader =
|
| - LAZY_INSTANCE_INITIALIZER;
|
| +InotifyReader* GetInotifyReader() {
|
| + static auto inotify_reader = new InotifyReader();
|
| + return inotify_reader;
|
| +}
|
|
|
| InotifyReader::InotifyReader()
|
| : thread_("inotify_reader"),
|
| @@ -458,7 +457,7 @@ void FilePathWatcherImpl::Cancel() {
|
| callback_.Reset();
|
|
|
| for (size_t i = 0; i < watches_.size(); ++i)
|
| - g_inotify_reader.Get().RemoveWatch(watches_[i].watch, this);
|
| + GetInotifyReader()->RemoveWatch(watches_[i].watch, this);
|
| watches_.clear();
|
| target_.clear();
|
| RemoveRecursiveWatches();
|
| @@ -477,7 +476,7 @@ void FilePathWatcherImpl::UpdateWatches() {
|
| InotifyReader::Watch old_watch = watch_entry.watch;
|
| watch_entry.watch = InotifyReader::kInvalidWatch;
|
| watch_entry.linkname.clear();
|
| - watch_entry.watch = g_inotify_reader.Get().AddWatch(path, this);
|
| + watch_entry.watch = GetInotifyReader()->AddWatch(path, this);
|
| if (watch_entry.watch == InotifyReader::kInvalidWatch) {
|
| // Ignore the error code (beyond symlink handling) to attempt to add
|
| // watches on accessible children of unreadable directories. Note that
|
| @@ -487,7 +486,7 @@ void FilePathWatcherImpl::UpdateWatches() {
|
| AddWatchForBrokenSymlink(path, &watch_entry);
|
| }
|
| if (old_watch != watch_entry.watch)
|
| - g_inotify_reader.Get().RemoveWatch(old_watch, this);
|
| + GetInotifyReader()->RemoveWatch(old_watch, this);
|
| path = path.Append(watch_entry.subdir);
|
| }
|
|
|
| @@ -533,7 +532,7 @@ void FilePathWatcherImpl::UpdateRecursiveWatches(
|
| if (!changed_dir.IsParent(cur_path))
|
| break;
|
| if (!DirectoryExists(cur_path))
|
| - g_inotify_reader.Get().RemoveWatch(end_it->second, this);
|
| + GetInotifyReader()->RemoveWatch(end_it->second, this);
|
| }
|
| recursive_watches_by_path_.erase(start_it, end_it);
|
| UpdateRecursiveWatchesForPath(changed_dir);
|
| @@ -558,17 +557,15 @@ void FilePathWatcherImpl::UpdateRecursiveWatchesForPath(const FilePath& path) {
|
|
|
| if (!ContainsKey(recursive_watches_by_path_, current)) {
|
| // Add new watches.
|
| - InotifyReader::Watch watch =
|
| - g_inotify_reader.Get().AddWatch(current, this);
|
| + InotifyReader::Watch watch = GetInotifyReader()->AddWatch(current, this);
|
| TrackWatchForRecursion(watch, current);
|
| } else {
|
| // Update existing watches.
|
| InotifyReader::Watch old_watch = recursive_watches_by_path_[current];
|
| DCHECK_NE(InotifyReader::kInvalidWatch, old_watch);
|
| - InotifyReader::Watch watch =
|
| - g_inotify_reader.Get().AddWatch(current, this);
|
| + InotifyReader::Watch watch = GetInotifyReader()->AddWatch(current, this);
|
| if (watch != old_watch) {
|
| - g_inotify_reader.Get().RemoveWatch(old_watch, this);
|
| + GetInotifyReader()->RemoveWatch(old_watch, this);
|
| recursive_paths_by_watch_.erase(old_watch);
|
| recursive_watches_by_path_.erase(current);
|
| TrackWatchForRecursion(watch, current);
|
| @@ -600,7 +597,7 @@ void FilePathWatcherImpl::RemoveRecursiveWatches() {
|
| recursive_paths_by_watch_.begin();
|
| it != recursive_paths_by_watch_.end();
|
| ++it) {
|
| - g_inotify_reader.Get().RemoveWatch(it->first, this);
|
| + GetInotifyReader()->RemoveWatch(it->first, this);
|
| }
|
| recursive_paths_by_watch_.clear();
|
| recursive_watches_by_path_.clear();
|
| @@ -621,7 +618,7 @@ void FilePathWatcherImpl::AddWatchForBrokenSymlink(const FilePath& path,
|
| // changes to a component "/" which is harmless so no special treatment of
|
| // this case is required.
|
| InotifyReader::Watch watch =
|
| - g_inotify_reader.Get().AddWatch(link.DirName(), this);
|
| + GetInotifyReader()->AddWatch(link.DirName(), this);
|
| if (watch == InotifyReader::kInvalidWatch) {
|
| // TODO(craig) Symlinks only work if the parent directory for the target
|
| // exist. Ideally we should make sure we've watched all the components of
|
|
|