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

Side by Side Diff: chrome/browser/in_process_webkit/dom_storage_dispatcher_host.cc

Issue 149238: Change the lifetime of the WebKit thread to be a subset of the IO thread's li... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 5 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) 2009 The Chromium Authors. All rights reserved. Use of this 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this
2 // source code is governed by a BSD-style license that can be found in the 2 // source code is governed by a BSD-style license that can be found in the
3 // LICENSE file. 3 // LICENSE file.
4 4
5 #include "chrome/browser/in_process_webkit/dom_storage_dispatcher_host.h" 5 #include "chrome/browser/in_process_webkit/dom_storage_dispatcher_host.h"
6 6
7 #include "chrome/browser/chrome_thread.h" 7 #include "chrome/browser/chrome_thread.h"
8 #include "chrome/browser/in_process_webkit/webkit_context.h" 8 #include "chrome/browser/in_process_webkit/webkit_context.h"
9 #include "chrome/browser/in_process_webkit/webkit_thread.h" 9 #include "chrome/browser/in_process_webkit/webkit_thread.h"
10 10
11 DOMStorageDispatcherHost::DOMStorageDispatcherHost( 11 DOMStorageDispatcherHost::DOMStorageDispatcherHost(
12 IPC::Message::Sender* message_sender, 12 IPC::Message::Sender* message_sender,
13 WebKitContext* webkit_context, 13 WebKitContext* webkit_context,
14 WebKitThread* webkit_thread) 14 WebKitThread* webkit_thread)
15 : webkit_context_(webkit_context), 15 : webkit_context_(webkit_context),
16 webkit_thread_(webkit_thread), 16 webkit_thread_(webkit_thread),
17 message_sender_(message_sender) { 17 message_sender_(message_sender) {
18 DCHECK(webkit_context_.get()); 18 DCHECK(webkit_context_.get());
19 DCHECK(webkit_thread_.get()); 19 DCHECK(webkit_thread_);
20 DCHECK(message_sender_); 20 DCHECK(message_sender_);
21 } 21 }
22 22
23 DOMStorageDispatcherHost::~DOMStorageDispatcherHost() { 23 DOMStorageDispatcherHost::~DOMStorageDispatcherHost() {
24 DCHECK(!message_sender_); 24 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
25 }
26
27 void DOMStorageDispatcherHost::Shutdown() {
28 DCHECK(IsOnIOThread());
29 AutoLock lock(message_sender_lock_);
30 message_sender_ = NULL; 25 message_sender_ = NULL;
31 } 26 }
32 27
33 bool DOMStorageDispatcherHost::OnMessageReceived(const IPC::Message& msg) { 28 bool DOMStorageDispatcherHost::OnMessageReceived(const IPC::Message& msg) {
34 // TODO(jorlow): Implement DOM Storage's message handler...and the rest 29 // TODO(jorlow): Implement DOM Storage's message handler...and the rest
35 // of DOM Storage. :-) 30 // of DOM Storage. :-)
36 return false; 31 return false;
37 } 32 }
38 33
39 void DOMStorageDispatcherHost::Send(IPC::Message* message) { 34 void DOMStorageDispatcherHost::Send(IPC::Message* message) {
40 if (IsOnIOThread()) {
41 if (message_sender_)
42 message_sender_->Send(message);
43 else
44 delete message;
45 }
46
47 // If message_sender_ is NULL, the IO thread has either gone away
48 // or will do so soon. By holding this lock until we finish posting to the
49 // thread, we block the IO thread from completely shutting down benieth us.
50 AutoLock lock(message_sender_lock_);
51 if (!message_sender_) { 35 if (!message_sender_) {
52 delete message; 36 delete message;
53 return; 37 return;
54 } 38 }
55 39
40 if (ChromeThread::CurrentlyOn(ChromeThread::IO)) {
41 message_sender_->Send(message);
42 return;
43 }
44
45 // The IO thread can't dissapear while the WebKit thread is still running.
46 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT));
56 MessageLoop* io_loop = ChromeThread::GetMessageLoop(ChromeThread::IO); 47 MessageLoop* io_loop = ChromeThread::GetMessageLoop(ChromeThread::IO);
57 CancelableTask* task = NewRunnableMethod(this, 48 CancelableTask* task = NewRunnableMethod(this,
58 &DOMStorageDispatcherHost::Send, 49 &DOMStorageDispatcherHost::Send,
59 message); 50 message);
60 io_loop->PostTask(FROM_HERE, task); 51 io_loop->PostTask(FROM_HERE, task);
61 } 52 }
62
63 bool DOMStorageDispatcherHost::IsOnIOThread() const {
64 MessageLoop* io_loop = ChromeThread::GetMessageLoop(ChromeThread::IO);
65 return MessageLoop::current() == io_loop;
66 }
67
68 bool DOMStorageDispatcherHost::IsOnWebKitThread() const {
69 return MessageLoop::current() == webkit_thread_->GetMessageLoop();
70 }
OLDNEW
« no previous file with comments | « chrome/browser/in_process_webkit/dom_storage_dispatcher_host.h ('k') | chrome/browser/in_process_webkit/webkit_thread.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698