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

Side by Side Diff: chrome/browser/browser_process_impl.cc

Issue 160447: Add checks to DEBUG mode that no instance of URLRequest or URLFetcher survive... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Sync client Created 11 years, 4 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
« no previous file with comments | « chrome/browser/browser_process_impl.h ('k') | chrome/browser/net/url_fetcher.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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/browser_process_impl.h" 5 #include "chrome/browser/browser_process_impl.h"
6 6
7 #include "app/l10n_util.h" 7 #include "app/l10n_util.h"
8 #include "base/clipboard.h" 8 #include "base/clipboard.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/path_service.h" 10 #include "base/path_service.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 // 51 //
52 // Applications must initialize the COM library before they can call 52 // Applications must initialize the COM library before they can call
53 // COM library functions other than CoGetMalloc and memory allocation 53 // COM library functions other than CoGetMalloc and memory allocation
54 // functions, so this class initializes COM for those users. 54 // functions, so this class initializes COM for those users.
55 class BrowserProcessSubThread : public ChromeThread { 55 class BrowserProcessSubThread : public ChromeThread {
56 public: 56 public:
57 explicit BrowserProcessSubThread(ChromeThread::ID identifier) 57 explicit BrowserProcessSubThread(ChromeThread::ID identifier)
58 : ChromeThread(identifier) { 58 : ChromeThread(identifier) {
59 } 59 }
60 60
61 ~BrowserProcessSubThread() { 61 virtual ~BrowserProcessSubThread() {
62 // We cannot rely on our base class to stop the thread since we want our 62 // We cannot rely on our base class to stop the thread since we want our
63 // CleanUp function to run. 63 // CleanUp function to run.
64 Stop(); 64 Stop();
65 } 65 }
66 66
67 protected: 67 protected:
68 virtual void Init() { 68 virtual void Init() {
69 #if defined(OS_WIN) 69 #if defined(OS_WIN)
70 // Initializes the COM library on the current thread. 70 // Initializes the COM library on the current thread.
71 CoInitialize(NULL); 71 CoInitialize(NULL);
(...skipping 13 matching lines...) Expand all
85 #endif 85 #endif
86 } 86 }
87 87
88 private: 88 private:
89 // Each specialized thread has its own notification service. 89 // Each specialized thread has its own notification service.
90 // Note: We don't use scoped_ptr because the destructor runs on the wrong 90 // Note: We don't use scoped_ptr because the destructor runs on the wrong
91 // thread. 91 // thread.
92 NotificationService* notification_service_; 92 NotificationService* notification_service_;
93 }; 93 };
94 94
95 class IOThread : public BrowserProcessSubThread {
96 public:
97 IOThread() : BrowserProcessSubThread(ChromeThread::IO) {}
98
99 virtual ~IOThread() {
100 // We cannot rely on our base class to stop the thread since we want our
101 // CleanUp function to run.
102 Stop();
103 }
104
105 protected:
106 virtual void CleanUp() {
107 // URLFetcher and URLRequest instances must NOT outlive the IO thread.
108 base::LeakTracker<URLRequest>::CheckForLeaks();
109 base::LeakTracker<URLFetcher>::CheckForLeaks();
110
111 BrowserProcessSubThread::CleanUp();
112 }
113 };
114
95 } // namespace 115 } // namespace
96 116
97 BrowserProcessImpl::BrowserProcessImpl(const CommandLine& command_line) 117 BrowserProcessImpl::BrowserProcessImpl(const CommandLine& command_line)
98 : created_resource_dispatcher_host_(false), 118 : created_resource_dispatcher_host_(false),
99 created_metrics_service_(false), 119 created_metrics_service_(false),
100 created_io_thread_(false), 120 created_io_thread_(false),
101 created_file_thread_(false), 121 created_file_thread_(false),
102 created_db_thread_(false), 122 created_db_thread_(false),
103 created_profile_manager_(false), 123 created_profile_manager_(false),
104 created_local_state_(false), 124 created_local_state_(false),
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 if (resource_dispatcher_host_.get()) { 185 if (resource_dispatcher_host_.get()) {
166 // Need to tell Safe Browsing Service that the IO thread is going away 186 // Need to tell Safe Browsing Service that the IO thread is going away
167 // since it cached a pointer to it. 187 // since it cached a pointer to it.
168 if (resource_dispatcher_host()->safe_browsing_service()) 188 if (resource_dispatcher_host()->safe_browsing_service())
169 resource_dispatcher_host()->safe_browsing_service()->ShutDown(); 189 resource_dispatcher_host()->safe_browsing_service()->ShutDown();
170 190
171 // Cancel pending requests and prevent new requests. 191 // Cancel pending requests and prevent new requests.
172 resource_dispatcher_host()->Shutdown(); 192 resource_dispatcher_host()->Shutdown();
173 } 193 }
174 194
175 // Shutdown DNS prefetching now to ensure that network stack objects
176 // living on the IO thread get destroyed before the IO thread goes away.
177 if (io_thread_.get()) {
178 io_thread_->message_loop()->PostTask(FROM_HERE,
179 NewRunnableFunction(chrome_browser_net::EnsureDnsPrefetchShutdown));
180 }
181
182 #if defined(OS_LINUX) 195 #if defined(OS_LINUX)
183 // The IO thread must outlive the BACKGROUND_X11 thread. 196 // The IO thread must outlive the BACKGROUND_X11 thread.
184 background_x11_thread_.reset(); 197 background_x11_thread_.reset();
185 #endif 198 #endif
186 199
187 // Need to stop io_thread_ before resource_dispatcher_host_, since 200 // Need to stop io_thread_ before resource_dispatcher_host_, since
188 // io_thread_ may still deref ResourceDispatcherHost and handle resource 201 // io_thread_ may still deref ResourceDispatcherHost and handle resource
189 // request before going away. 202 // request before going away.
190 io_thread_.reset(); 203 ResetIOThread();
191 204
192 // Clean up state that lives on the file_thread_ before it goes away. 205 // Clean up state that lives on the file_thread_ before it goes away.
193 if (resource_dispatcher_host_.get()) { 206 if (resource_dispatcher_host_.get()) {
194 resource_dispatcher_host()->download_file_manager()->Shutdown(); 207 resource_dispatcher_host()->download_file_manager()->Shutdown();
195 resource_dispatcher_host()->save_file_manager()->Shutdown(); 208 resource_dispatcher_host()->save_file_manager()->Shutdown();
196 } 209 }
197 210
198 // Need to stop the file_thread_ here to force it to process messages in its 211 // Need to stop the file_thread_ here to force it to process messages in its
199 // message loop from the previous call to shutdown the DownloadFileManager, 212 // message loop from the previous call to shutdown the DownloadFileManager,
200 // SaveFileManager and SessionService. 213 // SaveFileManager and SessionService.
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 #if defined(OS_LINUX) 313 #if defined(OS_LINUX)
301 // The lifetime of the BACKGROUND_X11 thread is a subset of the IO thread so 314 // The lifetime of the BACKGROUND_X11 thread is a subset of the IO thread so
302 // we start it now. 315 // we start it now.
303 scoped_ptr<base::Thread> background_x11_thread( 316 scoped_ptr<base::Thread> background_x11_thread(
304 new BrowserProcessSubThread(ChromeThread::BACKGROUND_X11)); 317 new BrowserProcessSubThread(ChromeThread::BACKGROUND_X11));
305 if (!background_x11_thread->Start()) 318 if (!background_x11_thread->Start())
306 return; 319 return;
307 background_x11_thread_.swap(background_x11_thread); 320 background_x11_thread_.swap(background_x11_thread);
308 #endif 321 #endif
309 322
310 scoped_ptr<base::Thread> thread( 323 scoped_ptr<base::Thread> thread(new IOThread);
311 new BrowserProcessSubThread(ChromeThread::IO));
312 base::Thread::Options options; 324 base::Thread::Options options;
313 options.message_loop_type = MessageLoop::TYPE_IO; 325 options.message_loop_type = MessageLoop::TYPE_IO;
314 if (!thread->StartWithOptions(options)) 326 if (!thread->StartWithOptions(options))
315 return; 327 return;
316 io_thread_.swap(thread); 328 io_thread_.swap(thread);
317 } 329 }
318 330
331 void BrowserProcessImpl::ResetIOThread() {
332 if (io_thread_.get()) {
333 io_thread_->message_loop()->PostTask(FROM_HERE,
334 NewRunnableFunction(CleanupOnIOThread));
335 }
336 io_thread_.reset();
337 }
338
339 // static
340 void BrowserProcessImpl::CleanupOnIOThread() {
341 // Shutdown DNS prefetching now to ensure that network stack objects
342 // living on the IO thread get destroyed before the IO thread goes away.
343 chrome_browser_net::EnsureDnsPrefetchShutdown();
344 // TODO(eroman): can this be merged into IOThread::CleanUp() ?
345 }
346
319 void BrowserProcessImpl::CreateFileThread() { 347 void BrowserProcessImpl::CreateFileThread() {
320 DCHECK(!created_file_thread_ && file_thread_.get() == NULL); 348 DCHECK(!created_file_thread_ && file_thread_.get() == NULL);
321 created_file_thread_ = true; 349 created_file_thread_ = true;
322 350
323 scoped_ptr<base::Thread> thread( 351 scoped_ptr<base::Thread> thread(
324 new BrowserProcessSubThread(ChromeThread::FILE)); 352 new BrowserProcessSubThread(ChromeThread::FILE));
325 base::Thread::Options options; 353 base::Thread::Options options;
326 #if defined(OS_WIN) 354 #if defined(OS_WIN)
327 // On Windows, the FILE thread needs to be have a UI message loop which pumps 355 // On Windows, the FILE thread needs to be have a UI message loop which pumps
328 // messages in such a way that Google Update can communicate back to us. 356 // messages in such a way that Google Update can communicate back to us.
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 DCHECK(devtools_manager_.get() == NULL); 415 DCHECK(devtools_manager_.get() == NULL);
388 created_devtools_manager_ = true; 416 created_devtools_manager_ = true;
389 devtools_manager_ = new DevToolsManager(); 417 devtools_manager_ = new DevToolsManager();
390 } 418 }
391 419
392 void BrowserProcessImpl::CreateGoogleURLTracker() { 420 void BrowserProcessImpl::CreateGoogleURLTracker() {
393 DCHECK(google_url_tracker_.get() == NULL); 421 DCHECK(google_url_tracker_.get() == NULL);
394 scoped_ptr<GoogleURLTracker> google_url_tracker(new GoogleURLTracker); 422 scoped_ptr<GoogleURLTracker> google_url_tracker(new GoogleURLTracker);
395 google_url_tracker_.swap(google_url_tracker); 423 google_url_tracker_.swap(google_url_tracker);
396 } 424 }
OLDNEW
« no previous file with comments | « chrome/browser/browser_process_impl.h ('k') | chrome/browser/net/url_fetcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698