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