1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef WebThreadSupportingGC_h 6 #define WebThreadSupportingGC_h 7 8 #include "platform/heap/glue/MessageLoopInterruptor.h" 9 #include "platform/heap/glue/PendingGCRunner.h" 10 #include "public/platform/Platform.h" 11 #include "public/platform/WebThread.h" 12 #include "wtf/Noncopyable.h" 13 #include "wtf/OwnPtr.h" 14 #include "wtf/PassOwnPtr.h" 15 16 namespace blink { 17 18 // WebThreadSupportingGC wraps a WebThread and adds support for attaching 19 // to and detaching from the Blink GC infrastructure. The attachGC method 20 // must be called during initialization on the WebThread and before the 21 // thread allocates any objects managed by the Blink GC. The detach GC 22 // method must be called on the WebThread during shutdown when the thread 23 // no longer needs to access objects managed by the Blink GC. 24 class PLATFORM_EXPORT WebThreadSupportingGC FINAL { 25 WTF_MAKE_NONCOPYABLE(WebThreadSupportingGC); 26 public: 27 static PassOwnPtr<WebThreadSupportingGC> create(const char*); 28 ~WebThreadSupportingGC(); 29 postTask(WebThread::Task * task)30 void postTask(WebThread::Task* task) 31 { 32 m_thread->postTask(task); 33 } 34 postDelayedTask(WebThread::Task * task,long long delayMs)35 void postDelayedTask(WebThread::Task* task, long long delayMs) 36 { 37 m_thread->postDelayedTask(task, delayMs); 38 } 39 isCurrentThread()40 bool isCurrentThread() const 41 { 42 return m_thread->isCurrentThread(); 43 } 44 addTaskObserver(WebThread::TaskObserver * observer)45 void addTaskObserver(WebThread::TaskObserver* observer) 46 { 47 m_thread->addTaskObserver(observer); 48 } 49 removeTaskObserver(WebThread::TaskObserver * observer)50 void removeTaskObserver(WebThread::TaskObserver* observer) 51 { 52 m_thread->removeTaskObserver(observer); 53 } 54 enterRunLoop()55 void enterRunLoop() 56 { 57 m_thread->enterRunLoop(); 58 } 59 exitRunLoop()60 void exitRunLoop() 61 { 62 m_thread->exitRunLoop(); 63 } 64 65 void attachGC(); 66 void detachGC(); 67 platformThread()68 WebThread& platformThread() const 69 { 70 ASSERT(m_thread); 71 return *m_thread; 72 } 73 74 private: 75 explicit WebThreadSupportingGC(const char*); 76 77 OwnPtr<PendingGCRunner> m_pendingGCRunner; 78 OwnPtr<MessageLoopInterruptor> m_messageLoopInterruptor; 79 80 // FIXME: This has to be last because of crbug.com/401397. 81 // A WorkerThread might get deleted before it had a chance to properly 82 // shut down. By deleting the WebThread first, we can guarantee that 83 // no pending tasks on the thread might want to access any of the other 84 // members during the WorkerThread's destruction. 85 OwnPtr<WebThread> m_thread; 86 }; 87 88 } 89 90 #endif 91