Index: chrome/browser/in_process_webkit/webkit_thread.cc |
=================================================================== |
--- chrome/browser/in_process_webkit/webkit_thread.cc (revision 21342) |
+++ chrome/browser/in_process_webkit/webkit_thread.cc (working copy) |
@@ -10,15 +10,43 @@ |
#include "webkit/api/public/WebKit.h" |
// This happens on the UI thread before the IO thread has been shut down. |
-WebKitThread::WebKitThread() { |
+WebKitThread::WebKitThread() |
+ : io_message_loop_(ChromeThread::GetMessageLoop(ChromeThread::IO)) { |
// The thread is started lazily by InitializeThread() on the IO thread. |
} |
// This happens on the UI thread after the IO thread has been shut down. |
WebKitThread::~WebKitThread() { |
+ // There's no good way to see if we're on the UI thread. |
DCHECK(!ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); |
+ DCHECK(!ChromeThread::CurrentlyOn(ChromeThread::IO)); |
+ DCHECK(!io_message_loop_); |
} |
+void WebKitThread::Shutdown() { |
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
+ DCHECK(io_message_loop_); |
+ |
+ // TODO(jorlow): Start flushing LocalStorage? |
+ |
+ AutoLock lock(io_message_loop_lock_); |
+ io_message_loop_ = NULL; |
+} |
+ |
+bool WebKitThread::PostIOThreadTask( |
+ const tracked_objects::Location& from_here, Task* task) { |
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); |
+ { |
+ AutoLock lock(io_message_loop_lock_); |
+ if (io_message_loop_) { |
+ io_message_loop_->PostTask(from_here, task); |
+ return true; |
+ } |
+ } |
+ delete task; |
+ return false; |
+} |
+ |
WebKitThread::InternalWebKitThread::InternalWebKitThread() |
: ChromeThread(ChromeThread::WEBKIT), |
webkit_client_(NULL) { |
@@ -29,13 +57,12 @@ |
webkit_client_ = new BrowserWebKitClientImpl; |
DCHECK(webkit_client_); |
WebKit::initialize(webkit_client_); |
- // Don't do anything heavyweight here since this can block the IO thread from |
- // executing (since InitializeThread() is called on the IO thread). |
+ // If possible, post initialization tasks to this thread (rather than doing |
+ // them now) so we don't block the IO thread any longer than we have to. |
} |
void WebKitThread::InternalWebKitThread::CleanUp() { |
- // Don't do anything heavyweight here since this can block the IO thread from |
- // executing (since the thread is shutdown from the IO thread). |
+ // TODO(jorlow): Block on LocalStorage being 100% shut down. |
DCHECK(webkit_client_); |
WebKit::shutdown(); |
delete webkit_client_; |
@@ -45,6 +72,7 @@ |
if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess)) |
return NULL; |
+ DCHECK(io_message_loop_); |
DCHECK(!webkit_thread_.get()); |
webkit_thread_.reset(new InternalWebKitThread); |
bool started = webkit_thread_->Start(); |