Index: chrome/browser/io_thread.cc |
=================================================================== |
--- chrome/browser/io_thread.cc (revision 111697) |
+++ chrome/browser/io_thread.cc (working copy) |
@@ -316,8 +316,7 @@ |
SystemURLRequestContextGetter::SystemURLRequestContextGetter( |
IOThread* io_thread) |
: io_thread_(io_thread), |
- io_message_loop_proxy_( |
- BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)) { |
+ io_message_loop_proxy_(io_thread->message_loop_proxy()) { |
} |
SystemURLRequestContextGetter::~SystemURLRequestContextGetter() {} |
@@ -348,7 +347,8 @@ |
PrefService* local_state, |
ChromeNetLog* net_log, |
ExtensionEventRouterForwarder* extension_event_router_forwarder) |
- : net_log_(net_log), |
+ : content::BrowserProcessSubThread(BrowserThread::IO), |
+ net_log_(net_log), |
extension_event_router_forwarder_(extension_event_router_forwarder), |
globals_(NULL), |
sdch_manager_(NULL), |
@@ -371,17 +371,17 @@ |
local_state); |
ssl_config_service_manager_.reset( |
SSLConfigServiceManager::CreateDefaultManager(local_state)); |
- |
- BrowserThread::SetDelegate(BrowserThread::IO, this); |
+ MessageLoop::current()->PostTask( |
+ FROM_HERE, base::Bind(&IOThread::InitSystemRequestContext, |
+ weak_factory_.GetWeakPtr())); |
} |
IOThread::~IOThread() { |
- // This isn't needed for production code, but in tests, IOThread may |
- // be multiply constructed. |
- BrowserThread::SetDelegate(BrowserThread::IO, NULL); |
- |
if (pref_proxy_config_tracker_.get()) |
pref_proxy_config_tracker_->DetachFromPrefService(); |
+ // We cannot rely on our base class to stop the thread since we want our |
+ // CleanUp function to run. |
+ Stop(); |
DCHECK(!globals_); |
} |
@@ -407,8 +407,10 @@ |
// messages around; it shouldn't be allowed to perform any blocking disk I/O. |
base::ThreadRestrictions::SetIOAllowed(false); |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ content::BrowserProcessSubThread::Init(); |
+ DCHECK_EQ(MessageLoop::TYPE_IO, message_loop()->type()); |
+ |
#if defined(USE_NSS) |
net::SetMessageLoopForOCSP(); |
#endif // defined(USE_NSS) |
@@ -478,26 +480,6 @@ |
sdch_manager_ = new net::SdchManager(); |
sdch_manager_->set_sdch_fetcher(new SdchDictionaryFetcher); |
- |
- // InitSystemRequestContext turns right around and posts a task back |
- // to the IO thread, so we can't let it run until we know the IO |
- // thread has started. |
- // |
- // Note that since we are at BrowserThread::Init time, the UI thread |
- // is blocked waiting for the thread to start. Therefore, posting |
- // this task to the main thread's message loop here is guaranteed to |
- // get it onto the message loop while the IOThread object still |
- // exists. However, the message might not be processed on the UI |
- // thread until after IOThread is gone, so use a weak pointer. |
- BrowserThread::PostTask(BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&IOThread::InitSystemRequestContext, |
- weak_factory_.GetWeakPtr())); |
- |
- // We constructed the weak pointer on the IO thread but it will be |
- // used on the UI thread. Call this to avoid a thread checker |
- // error. |
- weak_factory_.DetachFromThread(); |
} |
void IOThread::CleanUp() { |
@@ -538,6 +520,10 @@ |
base::debug::LeakTracker<net::URLRequest>::CheckForLeaks(); |
base::debug::LeakTracker<SystemURLRequestContextGetter>::CheckForLeaks(); |
+ |
+ // This will delete the |notification_service_|. Make sure it's done after |
+ // anything else can reference it. |
+ content::BrowserProcessSubThread::CleanUp(); |
} |
// static |
@@ -588,11 +574,6 @@ |
host_cache->clear(); |
} |
-MessageLoop* IOThread::message_loop() const { |
- return BrowserThread::UnsafeGetBrowserThread( |
- BrowserThread::IO)->message_loop(); |
-} |
- |
net::SSLConfigService* IOThread::GetSSLConfigService() { |
return ssl_config_service_manager_->Get(); |
} |
@@ -612,8 +593,6 @@ |
} |
system_url_request_context_getter_ = |
new SystemURLRequestContextGetter(this); |
- // Safe to post an unretained this pointer, since IOThread is |
- // guaranteed to outlive the IO BrowserThread. |
message_loop()->PostTask( |
FROM_HERE, base::Bind(&IOThread::InitSystemRequestContextOnIOThread, |
base::Unretained(this))); |