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

Side by Side Diff: ppapi/shared_impl/proxy_lock.h

Issue 923263003: PPAPI: Make TrackedCallback more threadsafe (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: review comments Created 5 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
« no previous file with comments | « ppapi/shared_impl/callback_tracker.cc ('k') | ppapi/shared_impl/tracked_callback.h » ('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 #ifndef PPAPI_SHARED_IMPL_PROXY_LOCK_H_ 5 #ifndef PPAPI_SHARED_IMPL_PROXY_LOCK_H_
6 #define PPAPI_SHARED_IMPL_PROXY_LOCK_H_ 6 #define PPAPI_SHARED_IMPL_PROXY_LOCK_H_
7 7
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 168
169 template <typename RunType> 169 template <typename RunType>
170 class RunWhileLockedHelper; 170 class RunWhileLockedHelper;
171 171
172 template <> 172 template <>
173 class RunWhileLockedHelper<void()> { 173 class RunWhileLockedHelper<void()> {
174 public: 174 public:
175 typedef base::Callback<void()> CallbackType; 175 typedef base::Callback<void()> CallbackType;
176 explicit RunWhileLockedHelper(const CallbackType& callback) 176 explicit RunWhileLockedHelper(const CallbackType& callback)
177 : callback_(new CallbackType(callback)) { 177 : callback_(new CallbackType(callback)) {
178 // Copying |callback| may adjust reference counts for bound Vars or
179 // Resources; we should have the lock already.
180 ProxyLock::AssertAcquired();
181 // CallWhileLocked and destruction might happen on a different thread from 178 // CallWhileLocked and destruction might happen on a different thread from
182 // creation. 179 // creation.
183 thread_checker_.DetachFromThread(); 180 thread_checker_.DetachFromThread();
184 } 181 }
185 void CallWhileLocked() { 182 void CallWhileLocked() {
186 // Bind thread_checker_ to this thread so we can check in the destructor. 183 // Bind thread_checker_ to this thread so we can check in the destructor.
187 DCHECK(thread_checker_.CalledOnValidThread()); 184 DCHECK(thread_checker_.CalledOnValidThread());
188 ProxyAutoLock lock; 185 ProxyAutoLock lock;
189 { 186 {
190 // Use a scope and local Callback to ensure that the callback is cleared 187 // Use a scope and local Callback to ensure that the callback is cleared
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 // Used to ensure that the Callback is run and deleted on the same thread. 228 // Used to ensure that the Callback is run and deleted on the same thread.
232 base::ThreadChecker thread_checker_; 229 base::ThreadChecker thread_checker_;
233 }; 230 };
234 231
235 template <typename P1> 232 template <typename P1>
236 class RunWhileLockedHelper<void(P1)> { 233 class RunWhileLockedHelper<void(P1)> {
237 public: 234 public:
238 typedef base::Callback<void(P1)> CallbackType; 235 typedef base::Callback<void(P1)> CallbackType;
239 explicit RunWhileLockedHelper(const CallbackType& callback) 236 explicit RunWhileLockedHelper(const CallbackType& callback)
240 : callback_(new CallbackType(callback)) { 237 : callback_(new CallbackType(callback)) {
241 ProxyLock::AssertAcquired();
242 thread_checker_.DetachFromThread(); 238 thread_checker_.DetachFromThread();
243 } 239 }
244 void CallWhileLocked(P1 p1) { 240 void CallWhileLocked(P1 p1) {
245 DCHECK(thread_checker_.CalledOnValidThread()); 241 DCHECK(thread_checker_.CalledOnValidThread());
246 ProxyAutoLock lock; 242 ProxyAutoLock lock;
247 { 243 {
248 scoped_ptr<CallbackType> temp_callback(callback_.Pass()); 244 scoped_ptr<CallbackType> temp_callback(callback_.Pass());
249 temp_callback->Run(p1); 245 temp_callback->Run(p1);
250 } 246 }
251 } 247 }
252 ~RunWhileLockedHelper() { 248 ~RunWhileLockedHelper() {
253 DCHECK(thread_checker_.CalledOnValidThread()); 249 DCHECK(thread_checker_.CalledOnValidThread());
254 if (callback_) { 250 if (callback_) {
255 ProxyAutoLock lock; 251 ProxyAutoLock lock;
256 callback_.reset(); 252 callback_.reset();
257 } 253 }
258 } 254 }
259 255
260 private: 256 private:
261 scoped_ptr<CallbackType> callback_; 257 scoped_ptr<CallbackType> callback_;
262 base::ThreadChecker thread_checker_; 258 base::ThreadChecker thread_checker_;
263 }; 259 };
264 260
265 template <typename P1, typename P2> 261 template <typename P1, typename P2>
266 class RunWhileLockedHelper<void(P1, P2)> { 262 class RunWhileLockedHelper<void(P1, P2)> {
267 public: 263 public:
268 typedef base::Callback<void(P1, P2)> CallbackType; 264 typedef base::Callback<void(P1, P2)> CallbackType;
269 explicit RunWhileLockedHelper(const CallbackType& callback) 265 explicit RunWhileLockedHelper(const CallbackType& callback)
270 : callback_(new CallbackType(callback)) { 266 : callback_(new CallbackType(callback)) {
271 ProxyLock::AssertAcquired();
272 thread_checker_.DetachFromThread(); 267 thread_checker_.DetachFromThread();
273 } 268 }
274 void CallWhileLocked(P1 p1, P2 p2) { 269 void CallWhileLocked(P1 p1, P2 p2) {
275 DCHECK(thread_checker_.CalledOnValidThread()); 270 DCHECK(thread_checker_.CalledOnValidThread());
276 ProxyAutoLock lock; 271 ProxyAutoLock lock;
277 { 272 {
278 scoped_ptr<CallbackType> temp_callback(callback_.Pass()); 273 scoped_ptr<CallbackType> temp_callback(callback_.Pass());
279 temp_callback->Run(p1, p2); 274 temp_callback->Run(p1, p2);
280 } 275 }
281 } 276 }
282 ~RunWhileLockedHelper() { 277 ~RunWhileLockedHelper() {
283 DCHECK(thread_checker_.CalledOnValidThread()); 278 DCHECK(thread_checker_.CalledOnValidThread());
284 if (callback_) { 279 if (callback_) {
285 ProxyAutoLock lock; 280 ProxyAutoLock lock;
286 callback_.reset(); 281 callback_.reset();
287 } 282 }
288 } 283 }
289 284
290 private: 285 private:
291 scoped_ptr<CallbackType> callback_; 286 scoped_ptr<CallbackType> callback_;
292 base::ThreadChecker thread_checker_; 287 base::ThreadChecker thread_checker_;
293 }; 288 };
294 289
295 template <typename P1, typename P2, typename P3> 290 template <typename P1, typename P2, typename P3>
296 class RunWhileLockedHelper<void(P1, P2, P3)> { 291 class RunWhileLockedHelper<void(P1, P2, P3)> {
297 public: 292 public:
298 typedef base::Callback<void(P1, P2, P3)> CallbackType; 293 typedef base::Callback<void(P1, P2, P3)> CallbackType;
299 explicit RunWhileLockedHelper(const CallbackType& callback) 294 explicit RunWhileLockedHelper(const CallbackType& callback)
300 : callback_(new CallbackType(callback)) { 295 : callback_(new CallbackType(callback)) {
301 ProxyLock::AssertAcquired();
302 thread_checker_.DetachFromThread(); 296 thread_checker_.DetachFromThread();
303 } 297 }
304 void CallWhileLocked(P1 p1, P2 p2, P3 p3) { 298 void CallWhileLocked(P1 p1, P2 p2, P3 p3) {
305 DCHECK(thread_checker_.CalledOnValidThread()); 299 DCHECK(thread_checker_.CalledOnValidThread());
306 ProxyAutoLock lock; 300 ProxyAutoLock lock;
307 { 301 {
308 scoped_ptr<CallbackType> temp_callback(callback_.Pass()); 302 scoped_ptr<CallbackType> temp_callback(callback_.Pass());
309 temp_callback->Run(p1, p2, p3); 303 temp_callback->Run(p1, p2, p3);
310 } 304 }
311 } 305 }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 internal::RunWhileLockedHelper<FunctionType>* helper = 352 internal::RunWhileLockedHelper<FunctionType>* helper =
359 new internal::RunWhileLockedHelper<FunctionType>(callback); 353 new internal::RunWhileLockedHelper<FunctionType>(callback);
360 return base::Bind( 354 return base::Bind(
361 &internal::RunWhileLockedHelper<FunctionType>::CallWhileLocked, 355 &internal::RunWhileLockedHelper<FunctionType>::CallWhileLocked,
362 base::Owned(helper)); 356 base::Owned(helper));
363 } 357 }
364 358
365 } // namespace ppapi 359 } // namespace ppapi
366 360
367 #endif // PPAPI_SHARED_IMPL_PROXY_LOCK_H_ 361 #endif // PPAPI_SHARED_IMPL_PROXY_LOCK_H_
OLDNEW
« no previous file with comments | « ppapi/shared_impl/callback_tracker.cc ('k') | ppapi/shared_impl/tracked_callback.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698