Index: chrome/browser/in_process_webkit/webkit_thread.h |
=================================================================== |
--- chrome/browser/in_process_webkit/webkit_thread.h (revision 20100) |
+++ chrome/browser/in_process_webkit/webkit_thread.h (working copy) |
@@ -10,36 +10,34 @@ |
#include "base/logging.h" |
#include "base/ref_counted.h" |
#include "base/thread.h" |
+#include "chrome/browser/chrome_thread.h" |
class BrowserWebKitClientImpl; |
// This is an object that represents WebKit's "main" thread within the browser |
-// process. You can create as many instances of this class as you'd like; |
-// they'll all point to the same thread and you're guaranteed they'll |
-// initialize in a thread-safe way, though WebKitThread instances should |
-// probably be shared when it's easy to do so. The first time you call |
-// GetMessageLoop() or EnsureWebKitInitialized() the thread will be created |
-// and WebKit initialized. When the last instance of WebKitThread is |
-// destroyed, WebKit is shut down and the thread is stopped. |
-// THIS CLASS MUST NOT BE DEREFED TO 0 ON THE WEBKIT THREAD (for now). |
-class WebKitThread : public base::RefCountedThreadSafe<WebKitThread> { |
+// process. It should be instantiated and destroyed on the UI thread |
+// before/after the IO thread is created/destroyed. All other usage should be |
+// on the IO thread. If the browser is being run in --single-process mode, a |
+// thread will never be spun up, and GetMessageLoop() will always return NULL. |
+class WebKitThread { |
public: |
+ // Called from the UI thread. |
WebKitThread(); |
+ ~WebKitThread(); |
+ // Returns the message loop for the WebKit thread unless we're in |
+ // --single-processuntil mode, in which case it'll return NULL. Only call |
+ // from the IO thread. Only do fast-path work here. |
MessageLoop* GetMessageLoop() { |
- if (!cached_webkit_thread_) |
- InitializeThread(); |
- return cached_webkit_thread_->message_loop(); |
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
+ if (!webkit_thread_.get()) |
+ return InitializeThread(); |
+ return webkit_thread_->message_loop(); |
} |
- void EnsureWebKitInitialized() { |
- if (!cached_webkit_thread_) |
- InitializeThread(); |
- } |
- |
private: |
// Must be private so that we can carefully control its lifetime. |
- class InternalWebKitThread : public base::Thread { |
+ class InternalWebKitThread : public ChromeThread { |
public: |
InternalWebKitThread(); |
virtual ~InternalWebKitThread() { } |
@@ -52,23 +50,14 @@ |
BrowserWebKitClientImpl* webkit_client_; |
}; |
- friend class base::RefCountedThreadSafe<WebKitThread>; |
- ~WebKitThread(); |
+ // Returns the WebKit thread's message loop or NULL if we're in |
+ // --single-process mode. Do slow-path initialization work here. |
+ MessageLoop* InitializeThread(); |
- void InitializeThread(); |
+ // Pointer to the actual WebKitThread. NULL if not yet started. Only modify |
+ // from the IO thread while the WebKit thread is not running. |
+ scoped_ptr<InternalWebKitThread> webkit_thread_; |
- // If this is set, then this object has incremented the global WebKit ref |
- // count and will shutdown the thread if it sees the ref count go to 0. |
- // It's assumed that once this is non-NULL, the pointer will be valid until |
- // destruction. |
- InternalWebKitThread* cached_webkit_thread_; |
- |
- // If there are multiple WebKitThread object (should only be possible in |
- // unittests at the moment), make sure they all share one real thread. |
- static base::LazyInstance<Lock> global_webkit_lock_; |
- static int global_webkit_ref_count_; |
- static InternalWebKitThread* global_webkit_thread_; |
- |
DISALLOW_COPY_AND_ASSIGN(WebKitThread); |
}; |