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