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

Side by Side Diff: ppapi/shared_impl/ppb_audio_shared.cc

Issue 240523002: Add test to make sure if PPB_Audio_Shared::StartThread() works. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « ppapi/shared_impl/ppb_audio_shared.h ('k') | ppapi/tests/DEPS » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "ppapi/shared_impl/ppb_audio_shared.h" 5 #include "ppapi/shared_impl/ppb_audio_shared.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "ppapi/shared_impl/ppapi_globals.h" 8 #include "ppapi/shared_impl/ppapi_globals.h"
9 #include "ppapi/shared_impl/ppb_audio_config_shared.h" 9 #include "ppapi/shared_impl/ppb_audio_config_shared.h"
10 #include "ppapi/shared_impl/proxy_lock.h" 10 #include "ppapi/shared_impl/proxy_lock.h"
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 memset(shared_memory_->memory(), 0, shared_memory_size_); 139 memset(shared_memory_->memory(), 0, shared_memory_size_);
140 memset(client_buffer_.get(), 0, client_buffer_size_bytes_); 140 memset(client_buffer_.get(), 0, client_buffer_size_bytes_);
141 #if !defined(OS_NACL) 141 #if !defined(OS_NACL)
142 DCHECK(!audio_thread_.get()); 142 DCHECK(!audio_thread_.get());
143 audio_thread_.reset( 143 audio_thread_.reset(
144 new base::DelegateSimpleThread(this, "plugin_audio_thread")); 144 new base::DelegateSimpleThread(this, "plugin_audio_thread"));
145 audio_thread_->Start(); 145 audio_thread_->Start();
146 #else 146 #else
147 // Use NaCl's special API for IRT code that creates threads that call back 147 // Use NaCl's special API for IRT code that creates threads that call back
148 // into user code. 148 // into user code.
149 if (NULL == thread_functions.thread_create || 149 if (!IsThreadFunctionReady())
150 NULL == thread_functions.thread_join)
151 return; 150 return;
152 151
152 DCHECK(!thread_active_);
153 int result = thread_functions.thread_create(&thread_id_, CallRun, this); 153 int result = thread_functions.thread_create(&thread_id_, CallRun, this);
154 DCHECK_EQ(result, 0); 154 DCHECK_EQ(result, 0);
155 thread_active_ = true; 155 thread_active_ = true;
156 #endif 156 #endif
157 } 157 }
158 158
159 void PPB_Audio_Shared::StopThread() { 159 void PPB_Audio_Shared::StopThread() {
160 #if !defined(OS_NACL) 160 #if !defined(OS_NACL)
161 if (audio_thread_.get()) { 161 if (audio_thread_.get()) {
162 // In general, the audio thread should not do Pepper calls, but it might 162 // In general, the audio thread should not do Pepper calls, but it might
163 // anyway (for example, our Audio test does CallOnMainThread). If it did 163 // anyway (for example, our Audio test does CallOnMainThread). If it did
164 // a pepper call which acquires the lock (most of them do), and we try to 164 // a pepper call which acquires the lock (most of them do), and we try to
165 // shut down the thread and Join it while holding the lock, we would 165 // shut down the thread and Join it while holding the lock, we would
166 // deadlock. So we give up the lock here so that the thread at least _can_ 166 // deadlock. So we give up the lock here so that the thread at least _can_
167 // make Pepper calls without causing deadlock. 167 // make Pepper calls without causing deadlock.
168 CallWhileUnlocked(base::Bind(&base::DelegateSimpleThread::Join, 168 CallWhileUnlocked(base::Bind(&base::DelegateSimpleThread::Join,
169 base::Unretained(audio_thread_.get()))); 169 base::Unretained(audio_thread_.get())));
170 audio_thread_.reset(); 170 audio_thread_.reset();
171 } 171 }
172 #else 172 #else
173 if (thread_active_) { 173 if (thread_active_) {
174 // See comment above about why we unlock here. 174 // See comment above about why we unlock here.
175 int result = CallWhileUnlocked(thread_functions.thread_join, thread_id_); 175 int result = CallWhileUnlocked(thread_functions.thread_join, thread_id_);
176 DCHECK_EQ(0, result); 176 DCHECK_EQ(0, result);
177 thread_active_ = false; 177 thread_active_ = false;
178 } 178 }
179 #endif 179 #endif
180 } 180 }
181 181
182 // static
183 bool PPB_Audio_Shared::IsThreadFunctionReady() {
184 #if defined(OS_NACL)
185 if (thread_functions.thread_create == NULL ||
186 thread_functions.thread_join == NULL)
187 return false;
188 #endif
189 return true;
190 }
191
182 #if defined(OS_NACL) 192 #if defined(OS_NACL)
183 // static 193 // static
184 void PPB_Audio_Shared::SetThreadFunctions( 194 void PPB_Audio_Shared::SetThreadFunctions(
185 const struct PP_ThreadFunctions* functions) { 195 const struct PP_ThreadFunctions* functions) {
186 DCHECK(thread_functions.thread_create == NULL);
187 DCHECK(thread_functions.thread_join == NULL);
188 thread_functions = *functions; 196 thread_functions = *functions;
189 } 197 }
190 198
191 // static 199 // static
192 void PPB_Audio_Shared::CallRun(void* self) { 200 void PPB_Audio_Shared::CallRun(void* self) {
193 PPB_Audio_Shared* audio = static_cast<PPB_Audio_Shared*>(self); 201 PPB_Audio_Shared* audio = static_cast<PPB_Audio_Shared*>(self);
194 audio->Run(); 202 audio->Run();
195 } 203 }
196 #endif 204 #endif
197 205
(...skipping 20 matching lines...) Expand all
218 // Let the other end know which buffer we just filled. The buffer index is 226 // Let the other end know which buffer we just filled. The buffer index is
219 // used to ensure the other end is getting the buffer it expects. For more 227 // used to ensure the other end is getting the buffer it expects. For more
220 // details on how this works see AudioSyncReader::WaitUntilDataIsReady(). 228 // details on how this works see AudioSyncReader::WaitUntilDataIsReady().
221 size_t bytes_sent = socket_->Send(&buffer_index_, sizeof(buffer_index_)); 229 size_t bytes_sent = socket_->Send(&buffer_index_, sizeof(buffer_index_));
222 if (bytes_sent != sizeof(buffer_index_)) 230 if (bytes_sent != sizeof(buffer_index_))
223 break; 231 break;
224 } 232 }
225 } 233 }
226 234
227 } // namespace ppapi 235 } // namespace ppapi
OLDNEW
« no previous file with comments | « ppapi/shared_impl/ppb_audio_shared.h ('k') | ppapi/tests/DEPS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698