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

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

Issue 2448863002: [DO NOT COMMIT] WorkletThreadHolader (Closed)
Patch Set: remove CORE_EXPORT Created 4 years, 1 month 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
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/webaudio/AudioWorkletThread.h" 5 #include "modules/webaudio/AudioWorkletThread.h"
6 6
7 #include "core/workers/WorkerBackingThread.h" 7 #include "core/workers/WorkerBackingThread.h"
8 #include "core/workers/WorkerThreadStartupData.h" 8 #include "core/workers/WorkerThreadStartupData.h"
9 #include "core/workers/WorkletBackingThreadHolder.h" 9 #include "core/workers/WorkletBackingThreadHolder.h"
10 #include "modules/webaudio/AudioWorkletGlobalScope.h" 10 #include "modules/webaudio/AudioWorkletGlobalScope.h"
11 #include "platform/CrossThreadFunctional.h" 11 #include "platform/CrossThreadFunctional.h"
12 #include "platform/WaitableEvent.h" 12 #include "platform/WaitableEvent.h"
13 #include "platform/WebThreadSupportingGC.h" 13 #include "platform/WebThreadSupportingGC.h"
14 #include "platform/tracing/TraceEvent.h" 14 #include "platform/tracing/TraceEvent.h"
15 #include "platform/weborigin/SecurityOrigin.h" 15 #include "platform/weborigin/SecurityOrigin.h"
16 #include "public/platform/Platform.h" 16 #include "public/platform/Platform.h"
17 #include "wtf/Assertions.h" 17 #include "wtf/Assertions.h"
18 #include "wtf/PtrUtil.h" 18 #include "wtf/PtrUtil.h"
19 #include <memory> 19 #include <memory>
20 20
21 namespace blink { 21 namespace blink {
22 22
23 namespace { 23 template class WorkletThreadHolder<AudioWorkletThread>;
24
25 // TODO(hongchan): consider refactoring static methods in this class into
26 // a template class.
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 24
84 std::unique_ptr<AudioWorkletThread> AudioWorkletThread::create( 25 std::unique_ptr<AudioWorkletThread> AudioWorkletThread::create(
85 PassRefPtr<WorkerLoaderProxy> workerLoaderProxy, 26 PassRefPtr<WorkerLoaderProxy> workerLoaderProxy,
86 WorkerReportingProxy& workerReportingProxy) { 27 WorkerReportingProxy& workerReportingProxy) {
87 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("audio-worklet"), 28 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("audio-worklet"),
88 "AudioWorkletThread::create"); 29 "AudioWorkletThread::create");
89 DCHECK(isMainThread()); 30 DCHECK(isMainThread());
90 return wrapUnique(new AudioWorkletThread(std::move(workerLoaderProxy), 31 return wrapUnique(new AudioWorkletThread(std::move(workerLoaderProxy),
91 workerReportingProxy)); 32 workerReportingProxy));
92 } 33 }
93 34
94 AudioWorkletThread::AudioWorkletThread( 35 AudioWorkletThread::AudioWorkletThread(
95 PassRefPtr<WorkerLoaderProxy> workerLoaderProxy, 36 PassRefPtr<WorkerLoaderProxy> workerLoaderProxy,
96 WorkerReportingProxy& workerReportingProxy) 37 WorkerReportingProxy& workerReportingProxy)
97 : WorkerThread(std::move(workerLoaderProxy), workerReportingProxy) {} 38 : WorkerThread(std::move(workerLoaderProxy), workerReportingProxy) {}
98 39
99 AudioWorkletThread::~AudioWorkletThread() {} 40 AudioWorkletThread::~AudioWorkletThread() {}
100 41
101 WorkerBackingThread& AudioWorkletThread::workerBackingThread() { 42 WorkerBackingThread& AudioWorkletThread::workerBackingThread() {
102 return *AudioWorkletThreadHolder::instance()->thread(); 43 return *WorkletThreadHolder<AudioWorkletThread>::threadHolderInstance()
44 ->thread();
103 } 45 }
104 46
105 void collectAllGarbageOnAudioWorkletThread(WaitableEvent* doneEvent) { 47 void collectAllGarbageOnAudioWorkletThread(WaitableEvent* doneEvent) {
106 blink::ThreadState::current()->collectAllGarbage(); 48 blink::ThreadState::current()->collectAllGarbage();
107 doneEvent->signal(); 49 doneEvent->signal();
108 } 50 }
109 51
110 void AudioWorkletThread::collectAllGarbage() { 52 void AudioWorkletThread::collectAllGarbage() {
111 DCHECK(isMainThread()); 53 DCHECK(isMainThread());
112 WaitableEvent doneEvent; 54 WaitableEvent doneEvent;
113 AudioWorkletThreadHolder* instance = AudioWorkletThreadHolder::instance(); 55 WorkletThreadHolder<AudioWorkletThread>* threadHolderInstance =
114 if (!instance) 56 WorkletThreadHolder<AudioWorkletThread>::threadHolderInstance();
57 if (!threadHolderInstance)
115 return; 58 return;
116 instance->thread()->backingThread().postTask( 59 threadHolderInstance->thread()->backingThread().postTask(
117 BLINK_FROM_HERE, crossThreadBind(&collectAllGarbageOnAudioWorkletThread, 60 BLINK_FROM_HERE, crossThreadBind(&collectAllGarbageOnAudioWorkletThread,
118 crossThreadUnretained(&doneEvent))); 61 crossThreadUnretained(&doneEvent)));
119 doneEvent.wait(); 62 doneEvent.wait();
120 } 63 }
121 64
122 void AudioWorkletThread::ensureSharedBackingThread() { 65 void AudioWorkletThread::ensureSharedBackingThread() {
123 DCHECK(isMainThread()); 66 DCHECK(isMainThread());
124 AudioWorkletThreadHolder::ensureInstance(); 67 WorkletThreadHolder<AudioWorkletThread>::ensureInstance(
68 "AudioWorkletThread", BlinkGC::PerThreadHeapMode);
125 } 69 }
126 70
127 void AudioWorkletThread::clearSharedBackingThread() { 71 void AudioWorkletThread::clearSharedBackingThread() {
128 DCHECK(isMainThread()); 72 DCHECK(isMainThread());
129 AudioWorkletThreadHolder::clear(); 73 WorkletThreadHolder<AudioWorkletThread>::clearInstance();
haraken 2016/10/26 07:41:49 Are you sure that this method is called? As far a
nhiroki 2016/10/26 08:10:02 Good catch! I replied in the original CL: https://
130 }
131
132 void AudioWorkletThread::createSharedBackingThreadForTest() {
133 AudioWorkletThreadHolder::createForTest();
134 } 74 }
135 75
136 WorkerOrWorkletGlobalScope* AudioWorkletThread::createWorkerGlobalScope( 76 WorkerOrWorkletGlobalScope* AudioWorkletThread::createWorkerGlobalScope(
137 std::unique_ptr<WorkerThreadStartupData> startupData) { 77 std::unique_ptr<WorkerThreadStartupData> startupData) {
138 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("audio-worklet"), 78 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("audio-worklet"),
139 "AudioWorkletThread::createWorkerGlobalScope"); 79 "AudioWorkletThread::createWorkerGlobalScope");
140 80
141 RefPtr<SecurityOrigin> securityOrigin = 81 RefPtr<SecurityOrigin> securityOrigin =
142 SecurityOrigin::create(startupData->m_scriptURL); 82 SecurityOrigin::create(startupData->m_scriptURL);
143 if (startupData->m_starterOriginPrivilegeData) { 83 if (startupData->m_starterOriginPrivilegeData) {
144 securityOrigin->transferPrivilegesFrom( 84 securityOrigin->transferPrivilegesFrom(
145 std::move(startupData->m_starterOriginPrivilegeData)); 85 std::move(startupData->m_starterOriginPrivilegeData));
146 } 86 }
147 87
148 return AudioWorkletGlobalScope::create( 88 return AudioWorkletGlobalScope::create(
149 startupData->m_scriptURL, startupData->m_userAgent, 89 startupData->m_scriptURL, startupData->m_userAgent,
150 securityOrigin.release(), this->isolate(), this); 90 securityOrigin.release(), this->isolate(), this);
151 } 91 }
152 92
153 } // namespace blink 93 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698