• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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