Index: chrome/browser/browser_process_impl.cc |
=================================================================== |
--- chrome/browser/browser_process_impl.cc (revision 23063) |
+++ chrome/browser/browser_process_impl.cc (working copy) |
@@ -58,7 +58,7 @@ |
: ChromeThread(identifier) { |
} |
- ~BrowserProcessSubThread() { |
+ virtual ~BrowserProcessSubThread() { |
// We cannot rely on our base class to stop the thread since we want our |
// CleanUp function to run. |
Stop(); |
@@ -92,6 +92,26 @@ |
NotificationService* notification_service_; |
}; |
+class IOThread : public BrowserProcessSubThread { |
+ public: |
+ IOThread() : BrowserProcessSubThread(ChromeThread::IO) {} |
+ |
+ virtual ~IOThread() { |
+ // We cannot rely on our base class to stop the thread since we want our |
+ // CleanUp function to run. |
+ Stop(); |
+ } |
+ |
+ protected: |
+ virtual void CleanUp() { |
+ // URLFetcher and URLRequest instances must NOT outlive the IO thread. |
+ base::LeakTracker<URLRequest>::CheckForLeaks(); |
+ base::LeakTracker<URLFetcher>::CheckForLeaks(); |
+ |
+ BrowserProcessSubThread::CleanUp(); |
+ } |
+}; |
+ |
} // namespace |
BrowserProcessImpl::BrowserProcessImpl(const CommandLine& command_line) |
@@ -172,13 +192,6 @@ |
resource_dispatcher_host()->Shutdown(); |
} |
- // Shutdown DNS prefetching now to ensure that network stack objects |
- // living on the IO thread get destroyed before the IO thread goes away. |
- if (io_thread_.get()) { |
- io_thread_->message_loop()->PostTask(FROM_HERE, |
- NewRunnableFunction(chrome_browser_net::EnsureDnsPrefetchShutdown)); |
- } |
- |
#if defined(OS_LINUX) |
// The IO thread must outlive the BACKGROUND_X11 thread. |
background_x11_thread_.reset(); |
@@ -187,7 +200,7 @@ |
// Need to stop io_thread_ before resource_dispatcher_host_, since |
// io_thread_ may still deref ResourceDispatcherHost and handle resource |
// request before going away. |
- io_thread_.reset(); |
+ ResetIOThread(); |
// Clean up state that lives on the file_thread_ before it goes away. |
if (resource_dispatcher_host_.get()) { |
@@ -307,8 +320,7 @@ |
background_x11_thread_.swap(background_x11_thread); |
#endif |
- scoped_ptr<base::Thread> thread( |
- new BrowserProcessSubThread(ChromeThread::IO)); |
+ scoped_ptr<base::Thread> thread(new IOThread); |
base::Thread::Options options; |
options.message_loop_type = MessageLoop::TYPE_IO; |
if (!thread->StartWithOptions(options)) |
@@ -316,6 +328,22 @@ |
io_thread_.swap(thread); |
} |
+void BrowserProcessImpl::ResetIOThread() { |
+ if (io_thread_.get()) { |
+ io_thread_->message_loop()->PostTask(FROM_HERE, |
+ NewRunnableFunction(CleanupOnIOThread)); |
+ } |
+ io_thread_.reset(); |
+} |
+ |
+// static |
+void BrowserProcessImpl::CleanupOnIOThread() { |
+ // Shutdown DNS prefetching now to ensure that network stack objects |
+ // living on the IO thread get destroyed before the IO thread goes away. |
+ chrome_browser_net::EnsureDnsPrefetchShutdown(); |
+ // TODO(eroman): can this be merged into IOThread::CleanUp() ? |
+} |
+ |
void BrowserProcessImpl::CreateFileThread() { |
DCHECK(!created_file_thread_ && file_thread_.get() == NULL); |
created_file_thread_ = true; |