Home | History | Annotate | Download | only in proxy
      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