| OLD | NEW | 
|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #include "chrome/browser/io_thread.h" | 5 #include "chrome/browser/io_thread.h" | 
| 6 | 6 | 
| 7 #include <vector> | 7 #include <vector> | 
| 8 | 8 | 
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" | 
| 10 #include "base/debug/leak_tracker.h" | 10 #include "base/debug/leak_tracker.h" | 
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 206 // The IOThread object must outlive any tasks posted to the IO thread before the | 206 // The IOThread object must outlive any tasks posted to the IO thread before the | 
| 207 // Quit task. | 207 // Quit task. | 
| 208 DISABLE_RUNNABLE_METHOD_REFCOUNT(IOThread); | 208 DISABLE_RUNNABLE_METHOD_REFCOUNT(IOThread); | 
| 209 | 209 | 
| 210 IOThread::Globals::Globals() {} | 210 IOThread::Globals::Globals() {} | 
| 211 | 211 | 
| 212 IOThread::Globals::~Globals() {} | 212 IOThread::Globals::~Globals() {} | 
| 213 | 213 | 
| 214 // |local_state| is passed in explicitly in order to (1) reduce implicit | 214 // |local_state| is passed in explicitly in order to (1) reduce implicit | 
| 215 // dependencies and (2) make IOThread more flexible for testing. | 215 // dependencies and (2) make IOThread more flexible for testing. | 
| 216 IOThread::IOThread(PrefService* local_state) | 216 IOThread::IOThread(PrefService* local_state, ChromeNetLog* net_log) | 
| 217     : BrowserProcessSubThread(BrowserThread::IO), | 217     : BrowserProcessSubThread(BrowserThread::IO), | 
|  | 218       net_log_(net_log), | 
| 218       globals_(NULL), | 219       globals_(NULL), | 
| 219       speculative_interceptor_(NULL), | 220       speculative_interceptor_(NULL), | 
| 220       predictor_(NULL) { | 221       predictor_(NULL) { | 
| 221   // We call RegisterPrefs() here (instead of inside browser_prefs.cc) to make | 222   // We call RegisterPrefs() here (instead of inside browser_prefs.cc) to make | 
| 222   // sure that everything is initialized in the right order. | 223   // sure that everything is initialized in the right order. | 
| 223   RegisterPrefs(local_state); | 224   RegisterPrefs(local_state); | 
| 224   auth_schemes_ = local_state->GetString(prefs::kAuthSchemes); | 225   auth_schemes_ = local_state->GetString(prefs::kAuthSchemes); | 
| 225   negotiate_disable_cname_lookup_ = local_state->GetBoolean( | 226   negotiate_disable_cname_lookup_ = local_state->GetBoolean( | 
| 226       prefs::kDisableAuthNegotiateCnameLookup); | 227       prefs::kDisableAuthNegotiateCnameLookup); | 
| 227   negotiate_enable_port_ = local_state->GetBoolean( | 228   negotiate_enable_port_ = local_state->GetBoolean( | 
| 228       prefs::kEnableAuthNegotiatePort); | 229       prefs::kEnableAuthNegotiatePort); | 
| 229   auth_server_whitelist_ = local_state->GetString(prefs::kAuthServerWhitelist); | 230   auth_server_whitelist_ = local_state->GetString(prefs::kAuthServerWhitelist); | 
| 230   auth_delegate_whitelist_ = local_state->GetString( | 231   auth_delegate_whitelist_ = local_state->GetString( | 
| 231       prefs::kAuthNegotiateDelegateWhitelist); | 232       prefs::kAuthNegotiateDelegateWhitelist); | 
| 232   gssapi_library_name_ = local_state->GetString(prefs::kGSSAPILibraryName); | 233   gssapi_library_name_ = local_state->GetString(prefs::kGSSAPILibraryName); | 
| 233 } | 234 } | 
| 234 | 235 | 
| 235 IOThread::~IOThread() { | 236 IOThread::~IOThread() { | 
| 236   // We cannot rely on our base class to stop the thread since we want our | 237   // We cannot rely on our base class to stop the thread since we want our | 
| 237   // CleanUp function to run. | 238   // CleanUp function to run. | 
| 238   Stop(); | 239   Stop(); | 
| 239   DCHECK(!globals_); | 240   DCHECK(!globals_); | 
| 240 } | 241 } | 
| 241 | 242 | 
| 242 IOThread::Globals* IOThread::globals() { | 243 IOThread::Globals* IOThread::globals() { | 
| 243   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 244   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| 244   return globals_; | 245   return globals_; | 
| 245 } | 246 } | 
| 246 | 247 | 
|  | 248 ChromeNetLog* IOThread::net_log() { | 
|  | 249   return net_log_; | 
|  | 250 } | 
|  | 251 | 
| 247 void IOThread::InitNetworkPredictor( | 252 void IOThread::InitNetworkPredictor( | 
| 248     bool prefetching_enabled, | 253     bool prefetching_enabled, | 
| 249     base::TimeDelta max_dns_queue_delay, | 254     base::TimeDelta max_dns_queue_delay, | 
| 250     size_t max_speculative_parallel_resolves, | 255     size_t max_speculative_parallel_resolves, | 
| 251     const chrome_common_net::UrlList& startup_urls, | 256     const chrome_common_net::UrlList& startup_urls, | 
| 252     ListValue* referral_list, | 257     ListValue* referral_list, | 
| 253     bool preconnect_enabled) { | 258     bool preconnect_enabled) { | 
| 254   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 259   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| 255   message_loop()->PostTask( | 260   message_loop()->PostTask( | 
| 256       FROM_HERE, | 261       FROM_HERE, | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 312 | 317 | 
| 313   DCHECK_EQ(MessageLoop::TYPE_IO, message_loop()->type()); | 318   DCHECK_EQ(MessageLoop::TYPE_IO, message_loop()->type()); | 
| 314 | 319 | 
| 315 #if defined(USE_NSS) | 320 #if defined(USE_NSS) | 
| 316   net::SetMessageLoopForOCSP(); | 321   net::SetMessageLoopForOCSP(); | 
| 317 #endif  // defined(USE_NSS) | 322 #endif  // defined(USE_NSS) | 
| 318 | 323 | 
| 319   DCHECK(!globals_); | 324   DCHECK(!globals_); | 
| 320   globals_ = new Globals; | 325   globals_ = new Globals; | 
| 321 | 326 | 
| 322   globals_->net_log.reset(new ChromeNetLog()); |  | 
| 323 |  | 
| 324   // Add an observer that will emit network change events to the ChromeNetLog. | 327   // Add an observer that will emit network change events to the ChromeNetLog. | 
| 325   // Assuming NetworkChangeNotifier dispatches in FIFO order, we should be | 328   // Assuming NetworkChangeNotifier dispatches in FIFO order, we should be | 
| 326   // logging the network change before other IO thread consumers respond to it. | 329   // logging the network change before other IO thread consumers respond to it. | 
| 327   network_change_observer_.reset( | 330   network_change_observer_.reset( | 
| 328       new LoggingNetworkChangeObserver(globals_->net_log.get())); | 331       new LoggingNetworkChangeObserver(net_log_)); | 
| 329 | 332 | 
| 330   globals_->host_resolver.reset( | 333   globals_->host_resolver.reset( | 
| 331       CreateGlobalHostResolver(globals_->net_log.get())); | 334       CreateGlobalHostResolver(net_log_)); | 
| 332   globals_->dnsrr_resolver.reset(new net::DnsRRResolver); | 335   globals_->dnsrr_resolver.reset(new net::DnsRRResolver); | 
| 333   globals_->http_auth_handler_factory.reset(CreateDefaultAuthHandlerFactory( | 336   globals_->http_auth_handler_factory.reset(CreateDefaultAuthHandlerFactory( | 
| 334       globals_->host_resolver.get())); | 337       globals_->host_resolver.get())); | 
| 335 } | 338 } | 
| 336 | 339 | 
| 337 void IOThread::CleanUp() { | 340 void IOThread::CleanUp() { | 
| 338   // Step 1: Kill all things that might be holding onto | 341   // Step 1: Kill all things that might be holding onto | 
| 339   // URLRequest/URLRequestContexts. | 342   // URLRequest/URLRequestContexts. | 
| 340 | 343 | 
| 341 #if defined(USE_NSS) | 344 #if defined(USE_NSS) | 
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 384 | 387 | 
| 385   // Deletion will unregister this interceptor. | 388   // Deletion will unregister this interceptor. | 
| 386   delete speculative_interceptor_; | 389   delete speculative_interceptor_; | 
| 387   speculative_interceptor_ = NULL; | 390   speculative_interceptor_ = NULL; | 
| 388 | 391 | 
| 389   // TODO(eroman): hack for http://crbug.com/15513 | 392   // TODO(eroman): hack for http://crbug.com/15513 | 
| 390   if (globals_->host_resolver->GetAsHostResolverImpl()) { | 393   if (globals_->host_resolver->GetAsHostResolverImpl()) { | 
| 391     globals_->host_resolver.get()->GetAsHostResolverImpl()->Shutdown(); | 394     globals_->host_resolver.get()->GetAsHostResolverImpl()->Shutdown(); | 
| 392   } | 395   } | 
| 393 | 396 | 
| 394   // We will delete the NetLog as part of CleanUpAfterMessageLoopDestruction() |  | 
| 395   // in case any of the message loop destruction observers try to access it. |  | 
| 396   deferred_net_log_to_delete_.reset(globals_->net_log.release()); |  | 
| 397 |  | 
| 398   delete globals_; | 397   delete globals_; | 
| 399   globals_ = NULL; | 398   globals_ = NULL; | 
| 400 | 399 | 
| 401   BrowserProcessSubThread::CleanUp(); | 400   BrowserProcessSubThread::CleanUp(); | 
| 402 } | 401 } | 
| 403 | 402 | 
| 404 void IOThread::CleanUpAfterMessageLoopDestruction() { | 403 void IOThread::CleanUpAfterMessageLoopDestruction() { | 
| 405   // TODO(eroman): get rid of this special case for 39723. If we could instead |  | 
| 406   // have a method that runs after the message loop destruction observers have |  | 
| 407   // run, but before the message loop itself is destroyed, we could safely |  | 
| 408   // combine the two cleanups. |  | 
| 409   deferred_net_log_to_delete_.reset(); |  | 
| 410 |  | 
| 411   // This will delete the |notification_service_|.  Make sure it's done after | 404   // This will delete the |notification_service_|.  Make sure it's done after | 
| 412   // anything else can reference it. | 405   // anything else can reference it. | 
| 413   BrowserProcessSubThread::CleanUpAfterMessageLoopDestruction(); | 406   BrowserProcessSubThread::CleanUpAfterMessageLoopDestruction(); | 
| 414 | 407 | 
| 415   // URLRequest instances must NOT outlive the IO thread. | 408   // URLRequest instances must NOT outlive the IO thread. | 
| 416   // | 409   // | 
| 417   // To allow for URLRequests to be deleted from | 410   // To allow for URLRequests to be deleted from | 
| 418   // MessageLoop::DestructionObserver this check has to happen after CleanUp | 411   // MessageLoop::DestructionObserver this check has to happen after CleanUp | 
| 419   // (which runs before DestructionObservers). | 412   // (which runs before DestructionObservers). | 
| 420   base::debug::LeakTracker<URLRequest>::CheckForLeaks(); | 413   base::debug::LeakTracker<URLRequest>::CheckForLeaks(); | 
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 492   // in about:net-internals. | 485   // in about:net-internals. | 
| 493   if (globals_->host_resolver->GetAsHostResolverImpl()) { | 486   if (globals_->host_resolver->GetAsHostResolverImpl()) { | 
| 494     net::HostCache* host_cache = | 487     net::HostCache* host_cache = | 
| 495         globals_->host_resolver.get()->GetAsHostResolverImpl()->cache(); | 488         globals_->host_resolver.get()->GetAsHostResolverImpl()->cache(); | 
| 496     if (host_cache) | 489     if (host_cache) | 
| 497       host_cache->clear(); | 490       host_cache->clear(); | 
| 498   } | 491   } | 
| 499   // Clear all of the passively logged data. | 492   // Clear all of the passively logged data. | 
| 500   // TODO(eroman): this is a bit heavy handed, really all we need to do is | 493   // TODO(eroman): this is a bit heavy handed, really all we need to do is | 
| 501   //               clear the data pertaining to off the record context. | 494   //               clear the data pertaining to off the record context. | 
| 502   globals_->net_log->passive_collector()->Clear(); | 495   net_log_->ClearAllPassivelyCapturedEvents(); | 
| 503 } | 496 } | 
| OLD | NEW | 
|---|