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

Side by Side Diff: net/proxy/proxy_config_service_linux.h

Issue 10912132: Move ProxyConfigService construction onto the IO thread. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Adjust comments Created 8 years, 2 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef NET_PROXY_PROXY_CONFIG_SERVICE_LINUX_H_ 5 #ifndef NET_PROXY_PROXY_CONFIG_SERVICE_LINUX_H_
6 #define NET_PROXY_PROXY_CONFIG_SERVICE_LINUX_H_ 6 #define NET_PROXY_PROXY_CONFIG_SERVICE_LINUX_H_
7 7
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 virtual bool BypassListIsReversed() = 0; 132 virtual bool BypassListIsReversed() = 0;
133 133
134 // Returns true if the bypass rules should be interpreted as 134 // Returns true if the bypass rules should be interpreted as
135 // suffix-matching rules. 135 // suffix-matching rules.
136 virtual bool MatchHostsUsingSuffixMatching() = 0; 136 virtual bool MatchHostsUsingSuffixMatching() = 0;
137 137
138 private: 138 private:
139 DISALLOW_COPY_AND_ASSIGN(SettingGetter); 139 DISALLOW_COPY_AND_ASSIGN(SettingGetter);
140 }; 140 };
141 141
142 // ProxyConfigServiceLinux is created on the UI thread, and 142 // ProxyConfigServiceLinux is created on the IO thread, and begins
143 // SetUpAndFetchInitialConfig() is immediately called to synchronously 143 // asynchronously on the UI thread fetching the original configuration
144 // fetch the original configuration and set up change notifications on 144 // and setting up change notifications.
145 // the UI thread.
146 // 145 //
147 // Past that point, it is accessed periodically through the 146 // Past that point, it is accessed periodically through the
148 // ProxyConfigService interface (GetLatestProxyConfig, AddObserver, 147 // ProxyConfigService interface (GetLatestProxyConfig, AddObserver,
149 // RemoveObserver) from the IO thread. 148 // RemoveObserver) from the IO thread.
150 // 149 //
151 // Setting change notification callbacks can occur at any time and are 150 // Setting change notification callbacks can occur at any time and are
152 // run on either the UI thread (gconf/gsettings) or the file thread 151 // run on either the UI thread (gconf/gsettings) or the file thread
153 // (KDE). The new settings are fetched on that thread, and the resulting 152 // (KDE). The new settings are fetched on that thread, and the resulting
154 // proxy config is posted to the IO thread through 153 // proxy config is posted to the IO thread through
155 // Delegate::SetNewProxyConfig(). We then notify observers on the IO 154 // Delegate::SetNewProxyConfig(). We then notify observers on the IO
156 // thread of the configuration change. 155 // thread of the configuration change.
157 // 156 //
158 // ProxyConfigServiceLinux is deleted from the IO thread. 157 // ProxyConfigServiceLinux is deleted from the IO thread but may require
158 // prior shutdown performed on other threads via StartTearDown().
159 // This prior shutdown safely stops change notifications.
159 // 160 //
160 // The substance of the ProxyConfigServiceLinux implementation is 161 // The substance of the ProxyConfigServiceLinux implementation is
161 // wrapped in the Delegate ref counted class. On deleting the 162 // wrapped in the Delegate ref counted class. Destruction of the Delegate
162 // ProxyConfigServiceLinux, Delegate::OnDestroy() is posted to either 163 // is commenced by StartTearDown() which calls Delegate::OnDestroy() on
163 // the UI thread (gconf/gsettings) or the file thread (KDE) where change 164 // the UI thread (gconf/gsettings) or posts it to the file thread (KDE) where
164 // notifications will be safely stopped before releasing Delegate. 165 // change notifications will be safely stopped before releasing Delegate.
165 166
166 class Delegate : public base::RefCountedThreadSafe<Delegate> { 167 class Delegate : public base::RefCountedThreadSafe<Delegate> {
167 public: 168 public:
168 // Constructor receives env var getter implementation to use, and 169 // Constructor receives env var getter implementation to use, and
169 // takes ownership of it. This is the normal constructor. 170 // takes ownership of it. This is the normal constructor.
170 explicit Delegate(base::Environment* env_var_getter); 171 explicit Delegate(base::Environment* env_var_getter);
171 // Constructor receives setting and env var getter implementations 172 // Constructor receives setting and env var getter implementations
172 // to use, and takes ownership of them. Used for testing. 173 // to use, and takes ownership of them. Used for testing.
173 Delegate(base::Environment* env_var_getter, SettingGetter* setting_getter); 174 Delegate(base::Environment* env_var_getter, SettingGetter* setting_getter);
174 175
175 // Synchronously obtains the proxy configuration. If gconf, 176 // Posts SetUpAndFetchInitialConfigOnUIThread() to UI thread. Called
176 // gsettings, or kioslaverc are used, also enables notifications for 177 // from the IO thread.
177 // setting changes. gconf/gsettings must only be accessed from the
178 // thread running the default glib main loop, and so this method
179 // must be called from the UI thread. The message loop for the IO
180 // thread is specified so that notifications can post tasks to it
181 // (and for assertions). The message loop for the file thread is
182 // used to read any files needed to determine proxy settings.
183 void SetUpAndFetchInitialConfig( 178 void SetUpAndFetchInitialConfig(
184 base::SingleThreadTaskRunner* glib_thread_task_runner, 179 base::SingleThreadTaskRunner* glib_thread_task_runner,
185 base::SingleThreadTaskRunner* io_thread_task_runner, 180 base::SingleThreadTaskRunner* io_thread_task_runner,
186 MessageLoopForIO* file_loop); 181 MessageLoopForIO* file_loop);
187 182
188 // Handler for setting change notifications: fetches a new proxy 183 // Handler for setting change notifications: fetches a new proxy
189 // configuration from settings, and if this config is different 184 // configuration from settings, and if this config is different
190 // than what we had before, posts a task to have it stored in 185 // than what we had before, posts a task to have it stored in
191 // cached_config_. 186 // cached_config_.
192 // Left public for simplicity. 187 // Left public for simplicity.
193 void OnCheckProxyConfigSettings(); 188 void OnCheckProxyConfigSettings();
194 189
195 // Called from IO thread. 190 // Called from IO thread.
196 void AddObserver(Observer* observer); 191 void AddObserver(Observer* observer);
197 void RemoveObserver(Observer* observer); 192 void RemoveObserver(Observer* observer);
198 ProxyConfigService::ConfigAvailability GetLatestProxyConfig( 193 ProxyConfigService::ConfigAvailability GetLatestProxyConfig(
199 ProxyConfig* config); 194 ProxyConfig* config);
200 195
201 // Posts a call to OnDestroy() to the UI or FILE thread, depending on the 196 // Posts a call to OnDestroy() to the UI or FILE thread, depending on the
202 // setting getter in use. Called from ProxyConfigServiceLinux's destructor. 197 // setting getter in use. Called from
198 // ProxyConfigServiceLinux::StartTearDown().
203 void PostDestroyTask(); 199 void PostDestroyTask();
204 // Safely stops change notifications. Posted to either the UI or FILE 200 // Safely stops change notifications. Posted to either the UI or FILE
205 // thread, depending on the setting getter in use. 201 // thread, depending on the setting getter in use.
206 void OnDestroy(); 202 void OnDestroy();
207 203
208 private: 204 private:
209 friend class base::RefCountedThreadSafe<Delegate>; 205 friend class base::RefCountedThreadSafe<Delegate>;
210 206
211 ~Delegate(); 207 ~Delegate();
212 208
209 // Synchronously obtains the proxy configuration. If gconf,
210 // gsettings, or kioslaverc are used, also enables notifications for
211 // setting changes. gconf/gsettings must only be accessed from the
212 // thread running the default glib main loop, and so this method
213 // must be called from the UI thread.
digit1 2012/10/19 10:32:46 On the other hand, this comment is probably perfec
214 void SetUpAndFetchInitialConfigOnUIThread(
215 MessageLoopForIO* file_loop);
216
213 // Obtains an environment variable's value. Parses a proxy server 217 // Obtains an environment variable's value. Parses a proxy server
214 // specification from it and puts it in result. Returns true if the 218 // specification from it and puts it in result. Returns true if the
215 // requested variable is defined and the value valid. 219 // requested variable is defined and the value valid.
216 bool GetProxyFromEnvVarForScheme(const char* variable, 220 bool GetProxyFromEnvVarForScheme(const char* variable,
217 ProxyServer::Scheme scheme, 221 ProxyServer::Scheme scheme,
218 ProxyServer* result_server); 222 ProxyServer* result_server);
219 // As above but with scheme set to HTTP, for convenience. 223 // As above but with scheme set to HTTP, for convenience.
220 bool GetProxyFromEnvVar(const char* variable, ProxyServer* result_server); 224 bool GetProxyFromEnvVar(const char* variable, ProxyServer* result_server);
221 // Fills proxy config from environment variables. Returns true if 225 // Fills proxy config from environment variables. Returns true if
222 // variables were found and the configuration is valid. 226 // variables were found and the configuration is valid.
(...skipping 11 matching lines...) Expand all
234 // This method is posted from the UI thread to the IO thread to 238 // This method is posted from the UI thread to the IO thread to
235 // carry the new config information. 239 // carry the new config information.
236 void SetNewProxyConfig(const ProxyConfig& new_config); 240 void SetNewProxyConfig(const ProxyConfig& new_config);
237 241
238 // This method is run on the getter's notification thread. 242 // This method is run on the getter's notification thread.
239 void SetUpNotifications(); 243 void SetUpNotifications();
240 244
241 scoped_ptr<base::Environment> env_var_getter_; 245 scoped_ptr<base::Environment> env_var_getter_;
242 scoped_ptr<SettingGetter> setting_getter_; 246 scoped_ptr<SettingGetter> setting_getter_;
243 247
248 // Has initialization completed and it's safe to read cached_config_.
249 bool finished_initialization_;
250
244 // Cached proxy configuration, to be returned by 251 // Cached proxy configuration, to be returned by
245 // GetLatestProxyConfig. Initially populated from the UI thread, but 252 // GetLatestProxyConfig. Only accessed from the IO thread.
246 // afterwards only accessed from the IO thread.
247 ProxyConfig cached_config_; 253 ProxyConfig cached_config_;
248 254
249 // A copy kept on the UI thread of the last seen proxy config, so as 255 // A copy kept on the UI thread of the last seen proxy config, so as
250 // to avoid posting a call to SetNewProxyConfig when we get a 256 // to avoid posting a call to SetNewProxyConfig when we get a
251 // notification but the config has not actually changed. 257 // notification but the config has not actually changed.
252 ProxyConfig reference_config_; 258 ProxyConfig reference_config_;
253 259
254 // The task runner for the glib thread, aka main browser thread. This thread 260 // The task runner for the glib thread, aka main browser thread. This thread
255 // is where we run the glib main loop (see base/message_pump_glib.h). It is 261 // is where we run the glib main loop (see base/message_pump_glib.h). It is
256 // the glib default loop in the sense that it runs the glib default context: 262 // the glib default loop in the sense that it runs the glib default context:
257 // as in the context where sources are added by g_timeout_add and 263 // as in the context where sources are added by g_timeout_add and
258 // g_idle_add, and returned by g_main_context_default. gconf uses glib 264 // g_idle_add, and returned by g_main_context_default. gconf uses glib
259 // timeouts and idles and possibly other callbacks that will all be 265 // timeouts and idles and possibly other callbacks that will all be
260 // dispatched on this thread. Since gconf is not thread safe, any use of 266 // dispatched on this thread. Since gconf is not thread safe, any use of
261 // gconf must be done on the thread running this loop. 267 // gconf must be done on the thread running this loop.
262 scoped_refptr<base::SingleThreadTaskRunner> glib_thread_task_runner_; 268 scoped_refptr<base::SingleThreadTaskRunner> glib_thread_task_runner_;
263 // Task runner for the IO thread. GetLatestProxyConfig() is called from 269 // Task runner for the IO thread. GetLatestProxyConfig() is called from
264 // the thread running this loop. 270 // the thread running this loop.
265 scoped_refptr<base::SingleThreadTaskRunner> io_thread_task_runner_; 271 scoped_refptr<base::SingleThreadTaskRunner> io_thread_task_runner_;
266 272
267 ObserverList<Observer> observers_; 273 ObserverList<Observer> observers_;
268 274
269 DISALLOW_COPY_AND_ASSIGN(Delegate); 275 DISALLOW_COPY_AND_ASSIGN(Delegate);
270 }; 276 };
271 277
272 // Thin wrapper shell around Delegate. 278 // Thin wrapper shell around Delegate.
273 279
274 // Usual constructor 280 // Usual constructor
275 ProxyConfigServiceLinux(); 281 ProxyConfigServiceLinux(
282 base::SingleThreadTaskRunner* glib_thread_task_runner,
283 base::SingleThreadTaskRunner* io_thread_task_runner,
284 MessageLoopForIO* file_loop);
276 // For testing: take alternate setting and env var getter implementations. 285 // For testing: take alternate setting and env var getter implementations.
277 explicit ProxyConfigServiceLinux(base::Environment* env_var_getter); 286 explicit ProxyConfigServiceLinux(base::Environment* env_var_getter);
278 ProxyConfigServiceLinux(base::Environment* env_var_getter, 287 ProxyConfigServiceLinux(base::Environment* env_var_getter,
279 SettingGetter* setting_getter); 288 SettingGetter* setting_getter);
280 289
281 virtual ~ProxyConfigServiceLinux(); 290 virtual ~ProxyConfigServiceLinux();
282 291
292 // This is only public for testing.
283 void SetupAndFetchInitialConfig( 293 void SetupAndFetchInitialConfig(
284 base::SingleThreadTaskRunner* glib_thread_task_runner, 294 base::SingleThreadTaskRunner* glib_thread_task_runner,
285 base::SingleThreadTaskRunner* io_thread_task_runner, 295 base::SingleThreadTaskRunner* io_thread_task_runner,
286 MessageLoopForIO* file_loop) { 296 MessageLoopForIO* file_loop) {
287 delegate_->SetUpAndFetchInitialConfig(glib_thread_task_runner, 297 delegate_->SetUpAndFetchInitialConfig(glib_thread_task_runner,
288 io_thread_task_runner, file_loop); 298 io_thread_task_runner, file_loop);
289 } 299 }
290 void OnCheckProxyConfigSettings() { 300 void OnCheckProxyConfigSettings() {
291 delegate_->OnCheckProxyConfigSettings(); 301 delegate_->OnCheckProxyConfigSettings();
292 } 302 }
293 303
294 // ProxyConfigService methods: 304 // ProxyConfigService methods:
295 // Called from IO thread. 305 // Called from IO thread.
296 virtual void AddObserver(Observer* observer) OVERRIDE; 306 virtual void AddObserver(Observer* observer) OVERRIDE;
297 virtual void RemoveObserver(Observer* observer) OVERRIDE; 307 virtual void RemoveObserver(Observer* observer) OVERRIDE;
298 virtual ProxyConfigService::ConfigAvailability GetLatestProxyConfig( 308 virtual ProxyConfigService::ConfigAvailability GetLatestProxyConfig(
299 ProxyConfig* config) OVERRIDE; 309 ProxyConfig* config) OVERRIDE;
300 310 // Called from Glib thread.
311 virtual void StartTearDown() OVERRIDE;
301 private: 312 private:
302 scoped_refptr<Delegate> delegate_; 313 scoped_refptr<Delegate> delegate_;
303 314
304 DISALLOW_COPY_AND_ASSIGN(ProxyConfigServiceLinux); 315 DISALLOW_COPY_AND_ASSIGN(ProxyConfigServiceLinux);
305 }; 316 };
306 317
307 } // namespace net 318 } // namespace net
308 319
309 #endif // NET_PROXY_PROXY_CONFIG_SERVICE_LINUX_H_ 320 #endif // NET_PROXY_PROXY_CONFIG_SERVICE_LINUX_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698