Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Unified Diff: net/proxy/proxy_config_service_linux.cc

Issue 540593002: Use scoped_refptr<SingleThreadTaskRunner> when initializing ProxyConfigService (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/proxy/proxy_config_service_linux.h ('k') | net/proxy/proxy_config_service_linux_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/proxy/proxy_config_service_linux.cc
diff --git a/net/proxy/proxy_config_service_linux.cc b/net/proxy/proxy_config_service_linux.cc
index 489f14c98ac26be17dd16f5cd4e9ba4ca695b373..fae22b7b51ebcc6664608517277f283cbc3473f0 100644
--- a/net/proxy/proxy_config_service_linux.cc
+++ b/net/proxy/proxy_config_service_linux.cc
@@ -232,12 +232,14 @@ class SettingGetterImplGConf : public ProxyConfigServiceLinux::SettingGetter {
DCHECK(!client_);
}
- virtual bool Init(base::SingleThreadTaskRunner* glib_thread_task_runner,
- base::MessageLoopForIO* file_loop) OVERRIDE {
- DCHECK(glib_thread_task_runner->BelongsToCurrentThread());
+ virtual bool Init(
+ const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
+ const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
+ OVERRIDE {
+ DCHECK(glib_task_runner->BelongsToCurrentThread());
DCHECK(!client_);
DCHECK(!task_runner_.get());
- task_runner_ = glib_thread_task_runner;
+ task_runner_ = glib_task_runner;
client_ = gconf_client_get_default();
if (!client_) {
// It's not clear whether/when this can return NULL.
@@ -318,8 +320,9 @@ class SettingGetterImplGConf : public ProxyConfigServiceLinux::SettingGetter {
return true;
}
- virtual base::SingleThreadTaskRunner* GetNotificationTaskRunner() OVERRIDE {
- return task_runner_.get();
+ virtual const scoped_refptr<base::SingleThreadTaskRunner>&
+ GetNotificationTaskRunner() OVERRIDE {
+ return task_runner_;
}
virtual ProxyConfigSource GetConfigSource() OVERRIDE {
@@ -562,9 +565,11 @@ class SettingGetterImplGSettings
// LoadAndCheckVersion() must be called *before* Init()!
bool LoadAndCheckVersion(base::Environment* env);
- virtual bool Init(base::SingleThreadTaskRunner* glib_thread_task_runner,
- base::MessageLoopForIO* file_loop) OVERRIDE {
- DCHECK(glib_thread_task_runner->BelongsToCurrentThread());
+ virtual bool Init(
+ const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
+ const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
+ OVERRIDE {
+ DCHECK(glib_task_runner->BelongsToCurrentThread());
DCHECK(!client_);
DCHECK(!task_runner_.get());
@@ -574,7 +579,7 @@ class SettingGetterImplGSettings
LOG(ERROR) << "Unable to create a gsettings client";
return false;
}
- task_runner_ = glib_thread_task_runner;
+ task_runner_ = glib_task_runner;
// We assume these all work if the above call worked.
http_client_ = libgio_loader_.g_settings_get_child(client_, "http");
https_client_ = libgio_loader_.g_settings_get_child(client_, "https");
@@ -622,8 +627,9 @@ class SettingGetterImplGSettings
return true;
}
- virtual base::SingleThreadTaskRunner* GetNotificationTaskRunner() OVERRIDE {
- return task_runner_.get();
+ virtual const scoped_refptr<base::SingleThreadTaskRunner>&
+ GetNotificationTaskRunner() OVERRIDE {
+ return task_runner_;
}
virtual ProxyConfigSource GetConfigSource() OVERRIDE {
@@ -854,7 +860,7 @@ class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter,
explicit SettingGetterImplKDE(base::Environment* env_var_getter)
: inotify_fd_(-1), notify_delegate_(NULL), indirect_manual_(false),
auto_no_pac_(false), reversed_bypass_list_(false),
- env_var_getter_(env_var_getter), file_loop_(NULL) {
+ env_var_getter_(env_var_getter), file_task_runner_(NULL) {
// This has to be called on the UI thread (http://crbug.com/69057).
base::ThreadRestrictions::ScopedAllowIO allow_io;
@@ -923,8 +929,10 @@ class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter,
DCHECK(inotify_fd_ < 0);
}
- virtual bool Init(base::SingleThreadTaskRunner* glib_thread_task_runner,
- base::MessageLoopForIO* file_loop) OVERRIDE {
+ virtual bool Init(
+ const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
+ const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
+ OVERRIDE {
// This has to be called on the UI thread (http://crbug.com/69057).
base::ThreadRestrictions::ScopedAllowIO allow_io;
DCHECK(inotify_fd_ < 0);
@@ -940,9 +948,10 @@ class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter,
inotify_fd_ = -1;
return false;
}
- file_loop_ = file_loop;
- // The initial read is done on the current thread, not |file_loop_|,
- // since we will need to have it for SetUpAndFetchInitialConfig().
+ file_task_runner_ = file_task_runner;
+ // The initial read is done on the current thread, not
+ // |file_task_runner_|, since we will need to have it for
+ // SetUpAndFetchInitialConfig().
UpdateCachedSettings();
return true;
}
@@ -959,35 +968,36 @@ class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter,
virtual bool SetUpNotifications(
ProxyConfigServiceLinux::Delegate* delegate) OVERRIDE {
DCHECK(inotify_fd_ >= 0);
- DCHECK(base::MessageLoop::current() == file_loop_);
+ DCHECK(file_task_runner_->BelongsToCurrentThread());
// We can't just watch the kioslaverc file directly, since KDE will write
// a new copy of it and then rename it whenever settings are changed and
// inotify watches inodes (so we'll be watching the old deleted file after
// the first change, and it will never change again). So, we watch the
// directory instead. We then act only on changes to the kioslaverc entry.
if (inotify_add_watch(inotify_fd_, kde_config_dir_.value().c_str(),
- IN_MODIFY | IN_MOVED_TO) < 0)
+ IN_MODIFY | IN_MOVED_TO) < 0) {
return false;
+ }
notify_delegate_ = delegate;
- if (!file_loop_->WatchFileDescriptor(inotify_fd_,
- true,
- base::MessageLoopForIO::WATCH_READ,
- &inotify_watcher_,
- this))
+ if (!base::MessageLoopForIO::current()->WatchFileDescriptor(
+ inotify_fd_, true, base::MessageLoopForIO::WATCH_READ,
+ &inotify_watcher_, this)) {
return false;
+ }
// Simulate a change to avoid possibly losing updates before this point.
OnChangeNotification();
return true;
}
- virtual base::SingleThreadTaskRunner* GetNotificationTaskRunner() OVERRIDE {
- return file_loop_ ? file_loop_->message_loop_proxy().get() : NULL;
+ virtual const scoped_refptr<base::SingleThreadTaskRunner>&
+ GetNotificationTaskRunner() OVERRIDE {
+ return file_task_runner_;
}
// Implement base::MessagePumpLibevent::Watcher.
virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE {
DCHECK_EQ(fd, inotify_fd_);
- DCHECK(base::MessageLoop::current() == file_loop_);
+ DCHECK(file_task_runner_->BelongsToCurrentThread());
OnChangeNotification();
}
virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE {
@@ -1253,7 +1263,7 @@ class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter,
// This is the callback from the debounce timer.
void OnDebouncedNotification() {
- DCHECK(base::MessageLoop::current() == file_loop_);
+ DCHECK(file_task_runner_->BelongsToCurrentThread());
VLOG(1) << "inotify change notification for kioslaverc";
UpdateCachedSettings();
CHECK(notify_delegate_);
@@ -1266,7 +1276,7 @@ class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter,
// an event for kioslaverc is seen.
void OnChangeNotification() {
DCHECK_GE(inotify_fd_, 0);
- DCHECK(base::MessageLoop::current() == file_loop_);
+ DCHECK(file_task_runner_->BelongsToCurrentThread());
char event_buf[(sizeof(inotify_event) + NAME_MAX + 1) * 4];
bool kioslaverc_touched = false;
ssize_t r;
@@ -1336,10 +1346,10 @@ class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter,
string_map_type string_table_;
strings_map_type strings_table_;
- // Message loop of the file thread, for reading kioslaverc. If NULL,
+ // Task runner of the file thread, for reading kioslaverc. If NULL,
// just read it directly (for testing). We also handle inotify events
// on this thread.
- base::MessageLoopForIO* file_loop_;
+ scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
DISALLOW_COPY_AND_ASSIGN(SettingGetterImplKDE);
};
@@ -1556,20 +1566,19 @@ ProxyConfigServiceLinux::Delegate::Delegate(
}
void ProxyConfigServiceLinux::Delegate::SetUpAndFetchInitialConfig(
- base::SingleThreadTaskRunner* glib_thread_task_runner,
- base::SingleThreadTaskRunner* io_thread_task_runner,
- base::MessageLoopForIO* file_loop) {
+ const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner,
+ const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner) {
// We should be running on the default glib main loop thread right
// now. gconf can only be accessed from this thread.
- DCHECK(glib_thread_task_runner->BelongsToCurrentThread());
- glib_thread_task_runner_ = glib_thread_task_runner;
- io_thread_task_runner_ = io_thread_task_runner;
-
- // If we are passed a NULL |io_thread_task_runner| or |file_loop|,
- // then we don't set up proxy setting change notifications. This
- // should not be the usual case but is intended to simplify test
- // setups.
- if (!io_thread_task_runner_.get() || !file_loop)
+ DCHECK(glib_task_runner->BelongsToCurrentThread());
+ glib_task_runner_ = glib_task_runner;
+ io_task_runner_ = io_task_runner;
+
+ // If we are passed a NULL |io_task_runner| or |file_task_runner|, then we
+ // don't set up proxy setting change notifications. This should not be the
+ // usual case but is intended to/ simplify test setups.
+ if (!io_task_runner_.get() || !file_task_runner)
VLOG(1) << "Monitoring of proxy setting changes is disabled";
// Fetch and cache the current proxy config. The config is left in
@@ -1586,7 +1595,7 @@ void ProxyConfigServiceLinux::Delegate::SetUpAndFetchInitialConfig(
bool got_config = false;
if (setting_getter_.get() &&
- setting_getter_->Init(glib_thread_task_runner, file_loop) &&
+ setting_getter_->Init(glib_task_runner, file_task_runner) &&
GetConfigFromSettings(&cached_config_)) {
cached_config_.set_id(1); // Mark it as valid.
cached_config_.set_source(setting_getter_->GetConfigSource());
@@ -1611,7 +1620,7 @@ void ProxyConfigServiceLinux::Delegate::SetUpAndFetchInitialConfig(
// that we won't lose any updates that may have happened after the initial
// fetch and before setting up notifications. We'll detect the common case
// of no changes in OnCheckProxyConfigSettings() (or sooner) and ignore it.
- if (io_thread_task_runner && file_loop) {
+ if (io_task_runner && file_task_runner) {
scoped_refptr<base::SingleThreadTaskRunner> required_loop =
setting_getter_->GetNotificationTaskRunner();
if (!required_loop.get() || required_loop->BelongsToCurrentThread()) {
@@ -1660,8 +1669,8 @@ ProxyConfigService::ConfigAvailability
ProxyConfigServiceLinux::Delegate::GetLatestProxyConfig(
ProxyConfig* config) {
// This is called from the IO thread.
- DCHECK(!io_thread_task_runner_.get() ||
- io_thread_task_runner_->BelongsToCurrentThread());
+ DCHECK(!io_task_runner_.get() ||
+ io_task_runner_->BelongsToCurrentThread());
// Simply return the last proxy configuration that glib_default_loop
// notified us of.
@@ -1696,7 +1705,7 @@ void ProxyConfigServiceLinux::Delegate::OnCheckProxyConfigSettings() {
!new_config.Equals(reference_config_)) {
// Post a task to the IO thread with the new configuration, so it can
// update |cached_config_|.
- io_thread_task_runner_->PostTask(FROM_HERE, base::Bind(
+ io_task_runner_->PostTask(FROM_HERE, base::Bind(
&ProxyConfigServiceLinux::Delegate::SetNewProxyConfig,
this, new_config));
// Update the thread-private copy in |reference_config_| as well.
@@ -1708,7 +1717,7 @@ void ProxyConfigServiceLinux::Delegate::OnCheckProxyConfigSettings() {
void ProxyConfigServiceLinux::Delegate::SetNewProxyConfig(
const ProxyConfig& new_config) {
- DCHECK(io_thread_task_runner_->BelongsToCurrentThread());
+ DCHECK(io_task_runner_->BelongsToCurrentThread());
VLOG(1) << "Proxy configuration changed";
cached_config_ = new_config;
FOR_EACH_OBSERVER(
« no previous file with comments | « net/proxy/proxy_config_service_linux.h ('k') | net/proxy/proxy_config_service_linux_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698