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

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

Issue 2432543002: Refactoring WorkletThreadBackingHolder with template pattern (Closed)
Patch Set: Add destructor for WorkletThreadHolder 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"
10 #include "modules/webaudio/AudioWorkletGlobalScope.h" 9 #include "modules/webaudio/AudioWorkletGlobalScope.h"
11 #include "platform/CrossThreadFunctional.h" 10 #include "platform/CrossThreadFunctional.h"
12 #include "platform/WaitableEvent.h" 11 #include "platform/WaitableEvent.h"
13 #include "platform/WebThreadSupportingGC.h" 12 #include "platform/WebThreadSupportingGC.h"
14 #include "platform/tracing/TraceEvent.h" 13 #include "platform/tracing/TraceEvent.h"
15 #include "platform/weborigin/SecurityOrigin.h" 14 #include "platform/weborigin/SecurityOrigin.h"
16 #include "public/platform/Platform.h" 15 #include "public/platform/Platform.h"
17 #include "wtf/Assertions.h" 16 #include "wtf/Assertions.h"
18 #include "wtf/PtrUtil.h" 17 #include "wtf/PtrUtil.h"
19 #include <memory> 18 #include <memory>
20 19
21 namespace blink { 20 namespace blink {
22 21
23 namespace { 22 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(
nhiroki 2016/10/25 22:39:33 Ah, we removed this part :p In unit tests, we nee
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 23
84 std::unique_ptr<AudioWorkletThread> AudioWorkletThread::create( 24 std::unique_ptr<AudioWorkletThread> AudioWorkletThread::create(
85 PassRefPtr<WorkerLoaderProxy> workerLoaderProxy, 25 PassRefPtr<WorkerLoaderProxy> workerLoaderProxy,
86 WorkerReportingProxy& workerReportingProxy) { 26 WorkerReportingProxy& workerReportingProxy) {
87 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("audio-worklet"), 27 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("audio-worklet"),
88 "AudioWorkletThread::create"); 28 "AudioWorkletThread::create");
89 DCHECK(isMainThread()); 29 DCHECK(isMainThread());
90 return wrapUnique(new AudioWorkletThread(std::move(workerLoaderProxy), 30 return wrapUnique(new AudioWorkletThread(std::move(workerLoaderProxy),
91 workerReportingProxy)); 31 workerReportingProxy));
92 } 32 }
93 33
94 AudioWorkletThread::AudioWorkletThread( 34 AudioWorkletThread::AudioWorkletThread(
95 PassRefPtr<WorkerLoaderProxy> workerLoaderProxy, 35 PassRefPtr<WorkerLoaderProxy> workerLoaderProxy,
96 WorkerReportingProxy& workerReportingProxy) 36 WorkerReportingProxy& workerReportingProxy)
97 : WorkerThread(std::move(workerLoaderProxy), workerReportingProxy) {} 37 : WorkerThread(std::move(workerLoaderProxy), workerReportingProxy) {}
98 38
99 AudioWorkletThread::~AudioWorkletThread() {} 39 AudioWorkletThread::~AudioWorkletThread() {}
100 40
101 WorkerBackingThread& AudioWorkletThread::workerBackingThread() { 41 WorkerBackingThread& AudioWorkletThread::workerBackingThread() {
102 return *AudioWorkletThreadHolder::instance()->thread(); 42 return *WorkletThreadHolder<AudioWorkletThread>::threadHolderInstance()
43 ->thread();
103 } 44 }
104 45
105 void collectAllGarbageOnAudioWorkletThread(WaitableEvent* doneEvent) { 46 void collectAllGarbageOnAudioWorkletThread(WaitableEvent* doneEvent) {
106 blink::ThreadState::current()->collectAllGarbage(); 47 blink::ThreadState::current()->collectAllGarbage();
107 doneEvent->signal(); 48 doneEvent->signal();
108 } 49 }
109 50
110 void AudioWorkletThread::collectAllGarbage() { 51 void AudioWorkletThread::collectAllGarbage() {
111 DCHECK(isMainThread()); 52 DCHECK(isMainThread());
112 WaitableEvent doneEvent; 53 WaitableEvent doneEvent;
113 AudioWorkletThreadHolder* instance = AudioWorkletThreadHolder::instance(); 54 WorkletThreadHolder<AudioWorkletThread>* threadHolderInstance =
114 if (!instance) 55 WorkletThreadHolder<AudioWorkletThread>::threadHolderInstance();
56 if (!threadHolderInstance)
115 return; 57 return;
116 instance->thread()->backingThread().postTask( 58 threadHolderInstance->thread()->backingThread().postTask(
117 BLINK_FROM_HERE, crossThreadBind(&collectAllGarbageOnAudioWorkletThread, 59 BLINK_FROM_HERE, crossThreadBind(&collectAllGarbageOnAudioWorkletThread,
118 crossThreadUnretained(&doneEvent))); 60 crossThreadUnretained(&doneEvent)));
119 doneEvent.wait(); 61 doneEvent.wait();
120 } 62 }
121 63
122 void AudioWorkletThread::ensureSharedBackingThread() { 64 void AudioWorkletThread::ensureSharedBackingThread() {
123 DCHECK(isMainThread()); 65 DCHECK(isMainThread());
124 AudioWorkletThreadHolder::ensureInstance(); 66 WorkletThreadHolder<AudioWorkletThread>::ensureInstance(
67 "AudioWorkletThread", BlinkGC::PerThreadHeapMode);
125 } 68 }
126 69
127 void AudioWorkletThread::clearSharedBackingThread() { 70 void AudioWorkletThread::clearSharedBackingThread() {
nhiroki 2016/10/26 08:08:17 Copied from https://codereview.chromium.org/244886
128 DCHECK(isMainThread()); 71 DCHECK(isMainThread());
129 AudioWorkletThreadHolder::clear(); 72 WorkletThreadHolder<AudioWorkletThread>::clearInstance();
130 }
131
132 void AudioWorkletThread::createSharedBackingThreadForTest() {
133 AudioWorkletThreadHolder::createForTest();
134 } 73 }
135 74
136 WorkerOrWorkletGlobalScope* AudioWorkletThread::createWorkerGlobalScope( 75 WorkerOrWorkletGlobalScope* AudioWorkletThread::createWorkerGlobalScope(
137 std::unique_ptr<WorkerThreadStartupData> startupData) { 76 std::unique_ptr<WorkerThreadStartupData> startupData) {
138 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("audio-worklet"), 77 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("audio-worklet"),
139 "AudioWorkletThread::createWorkerGlobalScope"); 78 "AudioWorkletThread::createWorkerGlobalScope");
140 79
141 RefPtr<SecurityOrigin> securityOrigin = 80 RefPtr<SecurityOrigin> securityOrigin =
142 SecurityOrigin::create(startupData->m_scriptURL); 81 SecurityOrigin::create(startupData->m_scriptURL);
143 if (startupData->m_starterOriginPrivilegeData) { 82 if (startupData->m_starterOriginPrivilegeData) {
144 securityOrigin->transferPrivilegesFrom( 83 securityOrigin->transferPrivilegesFrom(
145 std::move(startupData->m_starterOriginPrivilegeData)); 84 std::move(startupData->m_starterOriginPrivilegeData));
146 } 85 }
147 86
148 return AudioWorkletGlobalScope::create( 87 return AudioWorkletGlobalScope::create(
149 startupData->m_scriptURL, startupData->m_userAgent, 88 startupData->m_scriptURL, startupData->m_userAgent,
150 securityOrigin.release(), this->isolate(), this); 89 securityOrigin.release(), this->isolate(), this);
151 } 90 }
152 91
153 } // namespace blink 92 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698