Commit c36c650c authored by Andrey Kosyakov's avatar Andrey Kosyakov Committed by Commit Bot

Switch DevToolsFileWatcher and DevToolsFileHelper to SequencedTaskRunner

... instead of posting tasks to FILE thread.

Bug: 689520
Change-Id: Ib2f602ac69076bf1701e7670f348260b407542c7
Reviewed-on: https://chromium-review.googlesource.com/535154Reviewed-by: default avatarDmitry Gozman <dgozman@chromium.org>
Commit-Queue: Andrey Kosyakov <caseq@chromium.org>
Cr-Commit-Position: refs/heads/master@{#480261}
parent d37f9c55
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#include "base/md5.h" #include "base/md5.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/task_scheduler/post_task.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "base/value_conversions.h" #include "base/value_conversions.h"
#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process.h"
#include "chrome/browser/devtools/devtools_file_watcher.h" #include "chrome/browser/devtools/devtools_file_watcher.h"
...@@ -120,14 +122,14 @@ class SelectFileDialog : public ui::SelectFileDialog::Listener, ...@@ -120,14 +122,14 @@ class SelectFileDialog : public ui::SelectFileDialog::Listener,
}; };
void WriteToFile(const base::FilePath& path, const std::string& content) { void WriteToFile(const base::FilePath& path, const std::string& content) {
DCHECK_CURRENTLY_ON(BrowserThread::FILE); base::ThreadRestrictions::AssertIOAllowed();
DCHECK(!path.empty()); DCHECK(!path.empty());
base::WriteFile(path, content.c_str(), content.length()); base::WriteFile(path, content.c_str(), content.length());
} }
void AppendToFile(const base::FilePath& path, const std::string& content) { void AppendToFile(const base::FilePath& path, const std::string& content) {
DCHECK_CURRENTLY_ON(BrowserThread::FILE); base::ThreadRestrictions::AssertIOAllowed();
DCHECK(!path.empty()); DCHECK(!path.empty());
base::AppendToFile(path, content.c_str(), content.size()); base::AppendToFile(path, content.c_str(), content.size());
...@@ -210,14 +212,13 @@ DevToolsFileHelper::DevToolsFileHelper(WebContents* web_contents, ...@@ -210,14 +212,13 @@ DevToolsFileHelper::DevToolsFileHelper(WebContents* web_contents,
: web_contents_(web_contents), : web_contents_(web_contents),
profile_(profile), profile_(profile),
delegate_(delegate), delegate_(delegate),
file_task_runner_(
base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()})),
weak_factory_(this) { weak_factory_(this) {
pref_change_registrar_.Init(profile_->GetPrefs()); pref_change_registrar_.Init(profile_->GetPrefs());
} }
DevToolsFileHelper::~DevToolsFileHelper() { DevToolsFileHelper::~DevToolsFileHelper() = default;
BrowserThread::DeleteSoon(BrowserThread::FILE, FROM_HERE,
file_watcher_.release());
}
void DevToolsFileHelper::Save(const std::string& url, void DevToolsFileHelper::Save(const std::string& url,
const std::string& content, const std::string& content,
...@@ -275,8 +276,8 @@ void DevToolsFileHelper::Append(const std::string& url, ...@@ -275,8 +276,8 @@ void DevToolsFileHelper::Append(const std::string& url,
if (it == saved_files_.end()) if (it == saved_files_.end())
return; return;
callback.Run(); callback.Run();
BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, file_task_runner_->PostTask(FROM_HERE,
BindOnce(&AppendToFile, it->second, content)); BindOnce(&AppendToFile, it->second, content));
} }
void DevToolsFileHelper::SaveAsFileSelected(const std::string& url, void DevToolsFileHelper::SaveAsFileSelected(const std::string& url,
...@@ -292,8 +293,7 @@ void DevToolsFileHelper::SaveAsFileSelected(const std::string& url, ...@@ -292,8 +293,7 @@ void DevToolsFileHelper::SaveAsFileSelected(const std::string& url,
files_map->SetWithoutPathExpansion(base::MD5String(url), files_map->SetWithoutPathExpansion(base::MD5String(url),
base::CreateFilePathValue(path)); base::CreateFilePathValue(path));
callback.Run(); callback.Run();
BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, file_task_runner_->PostTask(FROM_HERE, BindOnce(&WriteToFile, path, content));
BindOnce(&WriteToFile, path, content));
} }
void DevToolsFileHelper::AddFileSystem( void DevToolsFileHelper::AddFileSystem(
...@@ -308,23 +308,25 @@ void DevToolsFileHelper::AddFileSystem( ...@@ -308,23 +308,25 @@ void DevToolsFileHelper::AddFileSystem(
select_file_dialog->Show(ui::SelectFileDialog::SELECT_FOLDER, select_file_dialog->Show(ui::SelectFileDialog::SELECT_FOLDER,
base::FilePath()); base::FilePath());
} else { } else {
BrowserThread::PostTask( file_task_runner_->PostTask(
BrowserThread::FILE, FROM_HERE, FROM_HERE,
BindOnce(&DevToolsFileHelper::CheckProjectFileExistsAndAddFileSystem, BindOnce(&DevToolsFileHelper::CheckProjectFileExistsAndAddFileSystem,
weak_factory_.GetWeakPtr(), show_info_bar_callback, weak_factory_.GetWeakPtr(), show_info_bar_callback,
base::FilePath::FromUTF8Unsafe(file_system_path))); base::FilePath::FromUTF8Unsafe(file_system_path)));
} }
} }
// static
void DevToolsFileHelper::CheckProjectFileExistsAndAddFileSystem( void DevToolsFileHelper::CheckProjectFileExistsAndAddFileSystem(
const ShowInfoBarCallback& show_info_bar_callback, base::WeakPtr<DevToolsFileHelper> self,
const base::FilePath& path) { ShowInfoBarCallback show_info_bar_callback,
DCHECK_CURRENTLY_ON(BrowserThread::FILE); base::FilePath path) {
base::ThreadRestrictions::AssertIOAllowed();
if (base::PathExists(path.Append(FILE_PATH_LITERAL(".devtools")))) { if (base::PathExists(path.Append(FILE_PATH_LITERAL(".devtools")))) {
BrowserThread::PostTask( BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE, BrowserThread::UI, FROM_HERE,
BindOnce(&DevToolsFileHelper::InnerAddFileSystem, BindOnce(&DevToolsFileHelper::InnerAddFileSystem, std::move(self),
weak_factory_.GetWeakPtr(), show_info_bar_callback, path)); std::move(show_info_bar_callback), path));
} }
} }
...@@ -387,8 +389,10 @@ DevToolsFileHelper::GetFileSystems() { ...@@ -387,8 +389,10 @@ DevToolsFileHelper::GetFileSystems() {
file_system_paths_ = GetAddedFileSystemPaths(profile_); file_system_paths_ = GetAddedFileSystemPaths(profile_);
std::vector<FileSystem> file_systems; std::vector<FileSystem> file_systems;
if (!file_watcher_) { if (!file_watcher_) {
file_watcher_.reset(new DevToolsFileWatcher(base::Bind( file_watcher_.reset(new DevToolsFileWatcher(
&DevToolsFileHelper::FilePathsChanged, weak_factory_.GetWeakPtr()))); base::Bind(&DevToolsFileHelper::FilePathsChanged,
weak_factory_.GetWeakPtr()),
base::SequencedTaskRunnerHandle::Get()));
pref_change_registrar_.Add( pref_change_registrar_.Add(
prefs::kDevToolsFileSystemPaths, prefs::kDevToolsFileSystemPaths,
base::Bind(&DevToolsFileHelper::FileSystemPathsSettingChanged, base::Bind(&DevToolsFileHelper::FileSystemPathsSettingChanged,
...@@ -401,10 +405,7 @@ DevToolsFileHelper::GetFileSystems() { ...@@ -401,10 +405,7 @@ DevToolsFileHelper::GetFileSystems() {
file_system_id, file_system_id,
file_system_path); file_system_path);
file_systems.push_back(filesystem); file_systems.push_back(filesystem);
BrowserThread::PostTask( file_watcher_->AddWatch(std::move(path));
BrowserThread::FILE, FROM_HERE,
BindOnce(&DevToolsFileWatcher::AddWatch,
base::Unretained(file_watcher_.get()), path));
} }
return file_systems; return file_systems;
} }
...@@ -440,10 +441,7 @@ void DevToolsFileHelper::FileSystemPathsSettingChanged() { ...@@ -440,10 +441,7 @@ void DevToolsFileHelper::FileSystemPathsSettingChanged() {
file_system_id, file_system_id,
file_system_path); file_system_path);
delegate_->FileSystemAdded(filesystem); delegate_->FileSystemAdded(filesystem);
BrowserThread::PostTask( file_watcher_->AddWatch(std::move(path));
BrowserThread::FILE, FROM_HERE,
BindOnce(&DevToolsFileWatcher::AddWatch,
base::Unretained(file_watcher_.get()), path));
} else { } else {
remaining.erase(file_system_path); remaining.erase(file_system_path);
} }
...@@ -453,10 +451,7 @@ void DevToolsFileHelper::FileSystemPathsSettingChanged() { ...@@ -453,10 +451,7 @@ void DevToolsFileHelper::FileSystemPathsSettingChanged() {
for (auto file_system_path : remaining) { for (auto file_system_path : remaining) {
delegate_->FileSystemRemoved(file_system_path); delegate_->FileSystemRemoved(file_system_path);
base::FilePath path = base::FilePath::FromUTF8Unsafe(file_system_path); base::FilePath path = base::FilePath::FromUTF8Unsafe(file_system_path);
BrowserThread::PostTask( file_watcher_->RemoveWatch(std::move(path));
BrowserThread::FILE, FROM_HERE,
BindOnce(&DevToolsFileWatcher::RemoveWatch,
base::Unretained(file_watcher_.get()), path));
} }
} }
......
...@@ -16,13 +16,14 @@ ...@@ -16,13 +16,14 @@
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "chrome/browser/devtools/devtools_file_watcher.h"
#include "components/prefs/pref_change_registrar.h" #include "components/prefs/pref_change_registrar.h"
class DevToolsFileWatcher;
class Profile; class Profile;
namespace base { namespace base {
class FilePath; class FilePath;
class SequencedTaskRunner;
} }
namespace content { namespace content {
...@@ -128,9 +129,6 @@ class DevToolsFileHelper { ...@@ -128,9 +129,6 @@ class DevToolsFileHelper {
void InnerAddFileSystem( void InnerAddFileSystem(
const ShowInfoBarCallback& show_info_bar_callback, const ShowInfoBarCallback& show_info_bar_callback,
const base::FilePath& path); const base::FilePath& path);
void CheckProjectFileExistsAndAddFileSystem(
const ShowInfoBarCallback& show_info_bar_callback,
const base::FilePath& path);
void AddUserConfirmedFileSystem( void AddUserConfirmedFileSystem(
const base::FilePath& path, const base::FilePath& path,
bool allowed); bool allowed);
...@@ -139,6 +137,12 @@ class DevToolsFileHelper { ...@@ -139,6 +137,12 @@ class DevToolsFileHelper {
const std::vector<std::string>& added_paths, const std::vector<std::string>& added_paths,
const std::vector<std::string>& removed_paths); const std::vector<std::string>& removed_paths);
// This should only be called on the file sequence.
static void CheckProjectFileExistsAndAddFileSystem(
base::WeakPtr<DevToolsFileHelper> self,
ShowInfoBarCallback show_info_bar_callback,
base::FilePath path);
content::WebContents* web_contents_; content::WebContents* web_contents_;
Profile* profile_; Profile* profile_;
DevToolsFileHelper::Delegate* delegate_; DevToolsFileHelper::Delegate* delegate_;
...@@ -146,7 +150,9 @@ class DevToolsFileHelper { ...@@ -146,7 +150,9 @@ class DevToolsFileHelper {
PathsMap saved_files_; PathsMap saved_files_;
PrefChangeRegistrar pref_change_registrar_; PrefChangeRegistrar pref_change_registrar_;
std::set<std::string> file_system_paths_; std::set<std::string> file_system_paths_;
std::unique_ptr<DevToolsFileWatcher> file_watcher_; std::unique_ptr<DevToolsFileWatcher, DevToolsFileWatcher::Deleter>
file_watcher_;
scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
base::WeakPtrFactory<DevToolsFileHelper> weak_factory_; base::WeakPtrFactory<DevToolsFileHelper> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(DevToolsFileHelper); DISALLOW_COPY_AND_ASSIGN(DevToolsFileHelper);
}; };
......
...@@ -15,6 +15,9 @@ ...@@ -15,6 +15,9 @@
#include "base/files/file_path_watcher.h" #include "base/files/file_path_watcher.h"
#include "base/files/file_util.h" #include "base/files/file_util.h"
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/sequenced_task_runner.h"
#include "base/task_scheduler/lazy_task_runner.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
using content::BrowserThread; using content::BrowserThread;
...@@ -51,6 +54,7 @@ class DevToolsFileWatcher::SharedFileWatcher : ...@@ -51,6 +54,7 @@ class DevToolsFileWatcher::SharedFileWatcher :
std::set<base::FilePath> pending_paths_; std::set<base::FilePath> pending_paths_;
base::Time last_event_time_; base::Time last_event_time_;
base::TimeDelta last_dispatch_cost_; base::TimeDelta last_dispatch_cost_;
SEQUENCE_CHECKER(sequence_checker_);
}; };
DevToolsFileWatcher::SharedFileWatcher::SharedFileWatcher() DevToolsFileWatcher::SharedFileWatcher::SharedFileWatcher()
...@@ -60,22 +64,26 @@ DevToolsFileWatcher::SharedFileWatcher::SharedFileWatcher() ...@@ -60,22 +64,26 @@ DevToolsFileWatcher::SharedFileWatcher::SharedFileWatcher()
} }
DevToolsFileWatcher::SharedFileWatcher::~SharedFileWatcher() { DevToolsFileWatcher::SharedFileWatcher::~SharedFileWatcher() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DevToolsFileWatcher::s_shared_watcher_ = nullptr; DevToolsFileWatcher::s_shared_watcher_ = nullptr;
} }
void DevToolsFileWatcher::SharedFileWatcher::AddListener( void DevToolsFileWatcher::SharedFileWatcher::AddListener(
DevToolsFileWatcher* watcher) { DevToolsFileWatcher* watcher) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
listeners_.push_back(watcher); listeners_.push_back(watcher);
} }
void DevToolsFileWatcher::SharedFileWatcher::RemoveListener( void DevToolsFileWatcher::SharedFileWatcher::RemoveListener(
DevToolsFileWatcher* watcher) { DevToolsFileWatcher* watcher) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
auto it = std::find(listeners_.begin(), listeners_.end(), watcher); auto it = std::find(listeners_.begin(), listeners_.end(), watcher);
listeners_.erase(it); listeners_.erase(it);
} }
void DevToolsFileWatcher::SharedFileWatcher::AddWatch( void DevToolsFileWatcher::SharedFileWatcher::AddWatch(
const base::FilePath& path) { const base::FilePath& path) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (watchers_.find(path) != watchers_.end()) if (watchers_.find(path) != watchers_.end())
return; return;
if (!base::FilePathWatcher::RecursiveWatchAvailable()) if (!base::FilePathWatcher::RecursiveWatchAvailable())
...@@ -104,13 +112,14 @@ void DevToolsFileWatcher::SharedFileWatcher::GetModificationTimes( ...@@ -104,13 +112,14 @@ void DevToolsFileWatcher::SharedFileWatcher::GetModificationTimes(
void DevToolsFileWatcher::SharedFileWatcher::RemoveWatch( void DevToolsFileWatcher::SharedFileWatcher::RemoveWatch(
const base::FilePath& path) { const base::FilePath& path) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
watchers_.erase(path); watchers_.erase(path);
} }
void DevToolsFileWatcher::SharedFileWatcher::DirectoryChanged( void DevToolsFileWatcher::SharedFileWatcher::DirectoryChanged(
const base::FilePath& path, const base::FilePath& path,
bool error) { bool error) {
DCHECK_CURRENTLY_ON(BrowserThread::FILE); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
pending_paths_.insert(path); pending_paths_.insert(path);
if (pending_paths_.size() > 1) if (pending_paths_.size() > 1)
return; // PostDelayedTask is already pending. return; // PostDelayedTask is already pending.
...@@ -122,8 +131,8 @@ void DevToolsFileWatcher::SharedFileWatcher::DirectoryChanged( ...@@ -122,8 +131,8 @@ void DevToolsFileWatcher::SharedFileWatcher::DirectoryChanged(
base::TimeDelta::FromMilliseconds(kFirstThrottleTimeout) : base::TimeDelta::FromMilliseconds(kFirstThrottleTimeout) :
last_dispatch_cost_ * 2; last_dispatch_cost_ * 2;
BrowserThread::PostDelayedTask( base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
BrowserThread::FILE, FROM_HERE, FROM_HERE,
base::BindOnce( base::BindOnce(
&DevToolsFileWatcher::SharedFileWatcher::DispatchNotifications, this), &DevToolsFileWatcher::SharedFileWatcher::DispatchNotifications, this),
shedule_for); shedule_for);
...@@ -131,6 +140,7 @@ void DevToolsFileWatcher::SharedFileWatcher::DirectoryChanged( ...@@ -131,6 +140,7 @@ void DevToolsFileWatcher::SharedFileWatcher::DirectoryChanged(
} }
void DevToolsFileWatcher::SharedFileWatcher::DispatchNotifications() { void DevToolsFileWatcher::SharedFileWatcher::DispatchNotifications() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (!pending_paths_.size()) if (!pending_paths_.size())
return; return;
base::Time start = base::Time::Now(); base::Time start = base::Time::Now();
...@@ -160,30 +170,49 @@ void DevToolsFileWatcher::SharedFileWatcher::DispatchNotifications() { ...@@ -160,30 +170,49 @@ void DevToolsFileWatcher::SharedFileWatcher::DispatchNotifications() {
pending_paths_.clear(); pending_paths_.clear();
for (auto* watcher : listeners_) { for (auto* watcher : listeners_) {
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, watcher->client_task_runner_->PostTask(
base::BindOnce(watcher->callback_, changed_paths, FROM_HERE, base::BindOnce(watcher->callback_, changed_paths,
added_paths, removed_paths)); added_paths, removed_paths));
} }
last_dispatch_cost_ = base::Time::Now() - start; last_dispatch_cost_ = base::Time::Now() - start;
} }
// DevToolsFileWatcher ---------------------------------------------------------
namespace {
base::SequencedTaskRunner* impl_task_runner() {
constexpr base::TaskTraits kImplTaskTraits = {base::MayBlock(),
base::TaskPriority::BACKGROUND};
static base::LazySequencedTaskRunner s_file_task_runner =
LAZY_SEQUENCED_TASK_RUNNER_INITIALIZER(kImplTaskTraits);
return s_file_task_runner.Get().get();
}
} // namespace
// static // static
DevToolsFileWatcher::SharedFileWatcher* DevToolsFileWatcher::SharedFileWatcher*
DevToolsFileWatcher::s_shared_watcher_ = nullptr; DevToolsFileWatcher::s_shared_watcher_ = nullptr;
// DevToolsFileWatcher --------------------------------------------------------- // static
void DevToolsFileWatcher::Deleter::operator()(const DevToolsFileWatcher* ptr) {
impl_task_runner()->PostTask(
FROM_HERE,
base::BindOnce(&DevToolsFileWatcher::Destroy, base::Unretained(ptr)));
}
DevToolsFileWatcher::DevToolsFileWatcher(const WatchCallback& callback) DevToolsFileWatcher::DevToolsFileWatcher(
: callback_(callback) { WatchCallback callback,
DCHECK_CURRENTLY_ON(BrowserThread::UI); scoped_refptr<base::SequencedTaskRunner> callback_task_runner)
BrowserThread::PostTask( : callback_(std::move(callback)),
BrowserThread::FILE, FROM_HERE, client_task_runner_(std::move(callback_task_runner)) {
base::BindOnce(&DevToolsFileWatcher::InitSharedWatcher, impl_task_runner()->PostTask(
base::Unretained(this))); FROM_HERE, base::BindOnce(&DevToolsFileWatcher::InitSharedWatcher,
base::Unretained(this)));
} }
DevToolsFileWatcher::~DevToolsFileWatcher() { DevToolsFileWatcher::~DevToolsFileWatcher() {
DCHECK_CURRENTLY_ON(BrowserThread::FILE); DCHECK(impl_task_runner()->RunsTasksInCurrentSequence());
shared_watcher_->RemoveListener(this); shared_watcher_->RemoveListener(this);
} }
...@@ -194,12 +223,16 @@ void DevToolsFileWatcher::InitSharedWatcher() { ...@@ -194,12 +223,16 @@ void DevToolsFileWatcher::InitSharedWatcher() {
shared_watcher_->AddListener(this); shared_watcher_->AddListener(this);
} }
void DevToolsFileWatcher::AddWatch(const base::FilePath& path) { void DevToolsFileWatcher::AddWatch(base::FilePath path) {
DCHECK_CURRENTLY_ON(BrowserThread::FILE); impl_task_runner()->PostTask(
shared_watcher_->AddWatch(path); FROM_HERE,
base::BindOnce(&SharedFileWatcher::AddWatch,
base::Unretained(shared_watcher_.get()), std::move(path)));
} }
void DevToolsFileWatcher::RemoveWatch(const base::FilePath& path) { void DevToolsFileWatcher::RemoveWatch(base::FilePath path) {
DCHECK_CURRENTLY_ON(BrowserThread::FILE); impl_task_runner()->PostTask(
shared_watcher_->RemoveWatch(path); FROM_HERE,
base::BindOnce(&SharedFileWatcher::RemoveWatch,
base::Unretained(shared_watcher_.get()), std::move(path)));
} }
...@@ -12,28 +12,38 @@ ...@@ -12,28 +12,38 @@
namespace base { namespace base {
class FilePath; class FilePath;
class SequencedTaskRunner;
} }
class DevToolsFileWatcher { class DevToolsFileWatcher {
public: public:
struct Deleter {
void operator()(const DevToolsFileWatcher* ptr);
};
using WatchCallback = base::Callback<void(const std::vector<std::string>&, using WatchCallback = base::Callback<void(const std::vector<std::string>&,
const std::vector<std::string>&, const std::vector<std::string>&,
const std::vector<std::string>&)>; const std::vector<std::string>&)>;
explicit DevToolsFileWatcher(const WatchCallback& callback); DevToolsFileWatcher(
~DevToolsFileWatcher(); WatchCallback callback,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner);
void AddWatch(const base::FilePath& path); void AddWatch(base::FilePath path);
void RemoveWatch(const base::FilePath& path); void RemoveWatch(base::FilePath path);
private: private:
~DevToolsFileWatcher(); // Use Deleter to destroy objects of this type.
class SharedFileWatcher; class SharedFileWatcher;
static SharedFileWatcher* s_shared_watcher_; static SharedFileWatcher* s_shared_watcher_;
void Destroy() const { delete this; }
void InitSharedWatcher(); void InitSharedWatcher();
void FileChanged(const base::FilePath&, int); void FileChanged(const base::FilePath&, int);
scoped_refptr<SharedFileWatcher> shared_watcher_; scoped_refptr<SharedFileWatcher> shared_watcher_;
WatchCallback callback_; WatchCallback callback_;
scoped_refptr<base::SequencedTaskRunner> client_task_runner_;
DISALLOW_COPY_AND_ASSIGN(DevToolsFileWatcher); DISALLOW_COPY_AND_ASSIGN(DevToolsFileWatcher);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment