Index: Source/platform/WebThreadSupportingGC.h |
diff --git a/Source/platform/WebThreadSupportingGC.h b/Source/platform/WebThreadSupportingGC.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..80848eb36a2663c0bc4745fc96c51b1e9996b720 |
--- /dev/null |
+++ b/Source/platform/WebThreadSupportingGC.h |
@@ -0,0 +1,89 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef WebThreadSupportingGC_h |
+#define WebThreadSupportingGC_h |
+ |
+#include "platform/heap/glue/MessageLoopInterruptor.h" |
+#include "platform/heap/glue/PendingGCRunner.h" |
+#include "public/platform/Platform.h" |
+#include "public/platform/WebThread.h" |
+#include "wtf/Noncopyable.h" |
+#include "wtf/OwnPtr.h" |
+#include "wtf/PassOwnPtr.h" |
+ |
+namespace blink { |
+ |
+// WebThreadSupportingGC wraps a WebThread and adds support for attaching |
+// to and detaching from the Blink GC infrastructure. The attachGC method |
+// must be called during initialization on the WebThread and before the |
+// thread allocates any objects managed by the Blink GC. The detach GC |
+// method must be called on the WebThread during shutdown when the thread |
+// no longer needs to access objects managed by the Blink GC. |
+class PLATFORM_EXPORT WebThreadSupportingGC { |
+ WTF_MAKE_NONCOPYABLE(WebThreadSupportingGC); |
+public: |
+ static PassOwnPtr<WebThreadSupportingGC> create(const char*); |
+ |
+ void postTask(WebThread::Task* task) |
+ { |
+ m_thread->postTask(task); |
+ } |
+ |
+ void postDelayedTask(WebThread::Task* task, long long delayMs) |
+ { |
+ m_thread->postDelayedTask(task, delayMs); |
+ } |
+ |
+ bool isCurrentThread() const |
+ { |
+ return m_thread->isCurrentThread(); |
+ } |
+ |
+ void addTaskObserver(WebThread::TaskObserver* observer) |
+ { |
+ m_thread->addTaskObserver(observer); |
+ } |
+ |
+ void removeTaskObserver(WebThread::TaskObserver* observer) |
+ { |
+ m_thread->removeTaskObserver(observer); |
+ } |
+ |
+ void enterRunLoop() |
+ { |
+ m_thread->enterRunLoop(); |
+ } |
+ |
+ void exitRunLoop() |
+ { |
+ m_thread->exitRunLoop(); |
+ } |
+ |
+ void attachGC(); |
+ void detachGC(); |
+ |
+ WebThread& platformThread() const |
+ { |
+ ASSERT(m_thread); |
+ return *m_thread; |
+ } |
+ |
+private: |
+ explicit WebThreadSupportingGC(const char*); |
+ |
+ OwnPtr<PendingGCRunner> m_pendingGCRunner; |
+ OwnPtr<MessageLoopInterruptor> m_messageLoopInterruptor; |
+ |
+ // FIXME: This has to be last because of crbug.com/401397. |
+ // A WorkerThread might get deleted before it had a chance to properly |
+ // shut down. By deleting the WebThread first, we can guarantee that |
+ // no pending tasks on the thread might want to access any of the other |
+ // members during the WorkerThread's destruction. |
+ OwnPtr<WebThread> m_thread; |
+}; |
+ |
+} |
+ |
+#endif |