Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(506)

Side by Side Diff: third_party/WebKit/Source/modules/webaudio/AudioWorkletThread.cpp

Issue 2372303002: [worklets] Add AudioWorkletGlobalScope and AudioWorkletThread (Closed)
Patch Set: Using WorkletBackingThreadHolder Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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 "modules/webaudio/AudioWorkletThread.h"
6
7 #include "core/workers/WorkerBackingThread.h"
8 #include "core/workers/WorkerThreadStartupData.h"
9 #include "core/workers/WorkletBackingThreadHolder.h"
10 #include "modules/webaudio/AudioWorkletGlobalScope.h"
11 #include "platform/CrossThreadFunctional.h"
12 #include "platform/WaitableEvent.h"
13 #include "platform/WebThreadSupportingGC.h"
14 #include "platform/tracing/TraceEvent.h"
15 #include "platform/weborigin/SecurityOrigin.h"
16 #include "public/platform/Platform.h"
17 #include "wtf/Assertions.h"
18 #include "wtf/PtrUtil.h"
19 #include <memory>
20
21 namespace blink {
22
23 namespace {
24
25 // TODO(hongchan): consider refactoring static methods in this class into
26 // a template class.
haraken 2016/10/12 01:56:43 OK :)
hongchan 2016/10/12 17:24:05 Hopefully I can make this refactoring soon enough.
27 class AudioWorkletThreadHolder final : public WorkletBackingThreadHolder {
28 public:
29 static AudioWorkletThreadHolder* instance() {
30 MutexLocker locker(holderInstanceMutex());
31 return s_instance;
32 }
33
34 static void ensureInstance() {
35 if (!s_instance)
36 s_instance = new AudioWorkletThreadHolder;
37 }
38
39 static void clear() {
40 MutexLocker locker(holderInstanceMutex());
41 if (s_instance) {
42 s_instance->shutdownAndWait();
43 delete s_instance;
44 s_instance = nullptr;
45 }
46 }
47
48 static void createForTest() {
49 MutexLocker locker(holderInstanceMutex());
50 DCHECK_EQ(nullptr, s_instance);
51 s_instance =
52 new AudioWorkletThreadHolder(WorkerBackingThread::createForTest(
53 "AudioWorkletThread", BlinkGC::PerThreadHeapMode));
54 }
55
56 private:
57 AudioWorkletThreadHolder(
58 std::unique_ptr<WorkerBackingThread> backingThread = nullptr)
59 : WorkletBackingThreadHolder(
60 backingThread
61 ? std::move(backingThread)
62 : WorkerBackingThread::create("AudioWorkletThread",
63 BlinkGC::PerThreadHeapMode)) {}
64
65 static Mutex& holderInstanceMutex() {
66 DEFINE_THREAD_SAFE_STATIC_LOCAL(Mutex, holderMutex, new Mutex);
67 return holderMutex;
68 }
69
70 void initializeOnThread() {
71 MutexLocker locker(holderInstanceMutex());
72 DCHECK(!m_initialized);
73 m_thread->initialize();
74 m_initialized = true;
75 }
76
77 static AudioWorkletThreadHolder* s_instance;
78 };
79
80 AudioWorkletThreadHolder* AudioWorkletThreadHolder::s_instance = nullptr;
81
82 } // namespace
83
84 std::unique_ptr<AudioWorkletThread> AudioWorkletThread::create(
85 PassRefPtr<WorkerLoaderProxy> workerLoaderProxy,
86 WorkerReportingProxy& workerReportingProxy) {
87 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("audio-worklet"),
88 "AudioWorkletThread::create");
89 DCHECK(isMainThread());
90 return wrapUnique(new AudioWorkletThread(std::move(workerLoaderProxy),
91 workerReportingProxy));
92 }
93
94 AudioWorkletThread::AudioWorkletThread(
95 PassRefPtr<WorkerLoaderProxy> workerLoaderProxy,
96 WorkerReportingProxy& workerReportingProxy)
97 : WorkerThread(std::move(workerLoaderProxy), workerReportingProxy) {}
98
99 AudioWorkletThread::~AudioWorkletThread() {}
100
101 WorkerBackingThread& AudioWorkletThread::workerBackingThread() {
102 return *AudioWorkletThreadHolder::instance()->thread();
103 }
104
105 void collectAllGarbageOnAudioWorkletThread(WaitableEvent* doneEvent) {
106 blink::ThreadState::current()->collectAllGarbage();
107 doneEvent->signal();
108 }
109
110 void AudioWorkletThread::collectAllGarbage() {
111 DCHECK(isMainThread());
112 WaitableEvent doneEvent;
113 AudioWorkletThreadHolder* instance = AudioWorkletThreadHolder::instance();
114 if (!instance)
115 return;
116 instance->thread()->backingThread().postTask(
117 BLINK_FROM_HERE, crossThreadBind(&collectAllGarbageOnAudioWorkletThread,
118 crossThreadUnretained(&doneEvent)));
119 doneEvent.wait();
120 }
121
122 void AudioWorkletThread::ensureSharedBackingThread() {
123 DCHECK(isMainThread());
124 AudioWorkletThreadHolder::ensureInstance();
125 }
126
127 void AudioWorkletThread::clearSharedBackingThread() {
128 DCHECK(isMainThread());
129 AudioWorkletThreadHolder::clear();
130 }
131
132 void AudioWorkletThread::createSharedBackingThreadForTest() {
133 AudioWorkletThreadHolder::createForTest();
134 }
135
136 WorkerOrWorkletGlobalScope* AudioWorkletThread::createWorkerGlobalScope(
137 std::unique_ptr<WorkerThreadStartupData> startupData) {
138 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("audio-worklet"),
139 "AudioWorkletThread::createWorkerGlobalScope");
140
141 RefPtr<SecurityOrigin> securityOrigin =
142 SecurityOrigin::create(startupData->m_scriptURL);
143 if (startupData->m_starterOriginPrivilegeData) {
144 securityOrigin->transferPrivilegesFrom(
145 std::move(startupData->m_starterOriginPrivilegeData));
146 }
147
148 return AudioWorkletGlobalScope::create(
149 startupData->m_scriptURL, startupData->m_userAgent,
150 securityOrigin.release(), this->isolate(), this);
151 }
152
153 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698