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 3 // found in the LICENSE file. 4 5 #ifndef PPAPI_PROXY_PROXY_COMPLETION_CALLBACK_FACTORY_H_ 6 #define PPAPI_PROXY_PROXY_COMPLETION_CALLBACK_FACTORY_H_ 7 8 #include "base/logging.h" 9 #include "base/message_loop/message_loop.h" 10 #include "ppapi/cpp/completion_callback.h" 11 #include "ppapi/utility/completion_callback_factory.h" 12 13 namespace ppapi { 14 namespace proxy { 15 16 // This class is just like pp::NonThreadSafeThreadTraits but rather than using 17 // pp::Module::core (which doesn't exist), it uses Chrome threads which do. 18 class ProxyNonThreadSafeThreadTraits { 19 public: 20 class RefCount { 21 public: 22 RefCount() : ref_(0) { 23 #ifndef NDEBUG 24 message_loop_ = base::MessageLoop::current(); 25 #endif 26 } 27 28 ~RefCount() { 29 #ifndef NDEBUG 30 DCHECK(message_loop_ == base::MessageLoop::current()); 31 #endif 32 } 33 34 int32_t AddRef() { 35 #ifndef NDEBUG 36 DCHECK(message_loop_ == base::MessageLoop::current()); 37 #endif 38 return ++ref_; 39 } 40 41 int32_t Release() { 42 #ifndef NDEBUG 43 DCHECK(message_loop_ == base::MessageLoop::current()); 44 #endif 45 DCHECK(ref_ > 0); 46 return --ref_; 47 } 48 49 private: 50 int32_t ref_; 51 #ifndef NDEBUG 52 base::MessageLoop* message_loop_; 53 #endif 54 }; 55 56 // No-op lock class. 57 class Lock { 58 public: 59 Lock() {} 60 ~Lock() {} 61 62 void Acquire() {} 63 void Release() {} 64 }; 65 66 // No-op AutoLock class. 67 class AutoLock { 68 public: 69 explicit AutoLock(Lock&) {} 70 ~AutoLock() {} 71 }; 72 }; 73 74 template<typename T> 75 class ProxyCompletionCallbackFactory 76 : public pp::CompletionCallbackFactory<T, ProxyNonThreadSafeThreadTraits> { 77 public: 78 ProxyCompletionCallbackFactory() 79 : pp::CompletionCallbackFactory<T, ProxyNonThreadSafeThreadTraits>() {} 80 ProxyCompletionCallbackFactory(T* t) 81 : pp::CompletionCallbackFactory<T, ProxyNonThreadSafeThreadTraits>(t) {} 82 }; 83 84 } // namespace proxy 85 } // namespace ppapi 86 87 #endif // PPAPI_PROXY_PROXY_COMPLETION_CALLBACK_FACTORY_H_ 88