OLD | NEW |
| (Empty) |
1 // Copyright 2011 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 #include "config.h" | |
6 #include "CCThreadImpl.h" | |
7 | |
8 #include "CCCompletionEvent.h" | |
9 #include <public/Platform.h> | |
10 #include <public/WebThread.h> | |
11 | |
12 using WebCore::CCThread; | |
13 using WebCore::CCCompletionEvent; | |
14 | |
15 namespace WebKit { | |
16 | |
17 // Task that, when runs, places the current thread ID into the provided | |
18 // pointer and signals a completion event. | |
19 // | |
20 // Does not provide a PassOwnPtr<GetThreadIDTask>::create method because | |
21 // the resulting object is always handed into a WebThread, which does not unders
tand | |
22 // PassOwnPtrs. | |
23 class GetThreadIDTask : public WebThread::Task { | |
24 public: | |
25 GetThreadIDTask(ThreadIdentifier* result, CCCompletionEvent* completion) | |
26 : m_completion(completion) | |
27 , m_result(result) { } | |
28 | |
29 virtual ~GetThreadIDTask() { } | |
30 | |
31 virtual void run() | |
32 { | |
33 *m_result = currentThread(); | |
34 m_completion->signal(); | |
35 } | |
36 | |
37 private: | |
38 CCCompletionEvent* m_completion; | |
39 ThreadIdentifier* m_result; | |
40 }; | |
41 | |
42 // General adapter from a CCThread::Task to a WebThread::Task. | |
43 class CCThreadTaskAdapter : public WebThread::Task { | |
44 public: | |
45 CCThreadTaskAdapter(PassOwnPtr<CCThread::Task> task) : m_task(task) { } | |
46 | |
47 virtual ~CCThreadTaskAdapter() { } | |
48 | |
49 virtual void run() | |
50 { | |
51 m_task->performTask(); | |
52 } | |
53 | |
54 private: | |
55 OwnPtr<CCThread::Task> m_task; | |
56 }; | |
57 | |
58 PassOwnPtr<CCThread> CCThreadImpl::create(WebThread* thread) | |
59 { | |
60 return adoptPtr(new CCThreadImpl(thread)); | |
61 } | |
62 | |
63 CCThreadImpl::~CCThreadImpl() | |
64 { | |
65 } | |
66 | |
67 void CCThreadImpl::postTask(PassOwnPtr<CCThread::Task> task) | |
68 { | |
69 m_thread->postTask(new CCThreadTaskAdapter(task)); | |
70 } | |
71 | |
72 void CCThreadImpl::postDelayedTask(PassOwnPtr<CCThread::Task> task, long long de
layMs) | |
73 { | |
74 m_thread->postDelayedTask(new CCThreadTaskAdapter(task), delayMs); | |
75 } | |
76 | |
77 ThreadIdentifier CCThreadImpl::threadID() const | |
78 { | |
79 return m_threadID; | |
80 } | |
81 | |
82 CCThreadImpl::CCThreadImpl(WebThread* thread) | |
83 : m_thread(thread) | |
84 { | |
85 if (thread == WebKit::Platform::current()->currentThread()) { | |
86 m_threadID = currentThread(); | |
87 return; | |
88 } | |
89 | |
90 // Get the threadId for the newly-created thread by running a task | |
91 // on that thread, blocking on the result. | |
92 m_threadID = currentThread(); | |
93 CCCompletionEvent completion; | |
94 m_thread->postTask(new GetThreadIDTask(&m_threadID, &completion)); | |
95 completion.wait(); | |
96 } | |
97 | |
98 } // namespace WebKit | |
OLD | NEW |