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 16namespace 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. 24class PLATFORM_EXPORT WebThreadSupportingGC FINAL { 25 WTF_MAKE_NONCOPYABLE(WebThreadSupportingGC); 26public: 27 static PassOwnPtr<WebThreadSupportingGC> create(const char*); 28 ~WebThreadSupportingGC(); 29 30 void postTask(WebThread::Task* task) 31 { 32 m_thread->postTask(task); 33 } 34 35 void postDelayedTask(WebThread::Task* task, long long delayMs) 36 { 37 m_thread->postDelayedTask(task, delayMs); 38 } 39 40 bool isCurrentThread() const 41 { 42 return m_thread->isCurrentThread(); 43 } 44 45 void addTaskObserver(WebThread::TaskObserver* observer) 46 { 47 m_thread->addTaskObserver(observer); 48 } 49 50 void removeTaskObserver(WebThread::TaskObserver* observer) 51 { 52 m_thread->removeTaskObserver(observer); 53 } 54 55 void enterRunLoop() 56 { 57 m_thread->enterRunLoop(); 58 } 59 60 void exitRunLoop() 61 { 62 m_thread->exitRunLoop(); 63 } 64 65 void attachGC(); 66 void detachGC(); 67 68 WebThread& platformThread() const 69 { 70 ASSERT(m_thread); 71 return *m_thread; 72 } 73 74private: 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