| /* | 
 |  *  Copyright 2014 The WebRTC Project Authors. All rights reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #ifndef RTC_BASE_ASYNC_INVOKER_INL_H_ | 
 | #define RTC_BASE_ASYNC_INVOKER_INL_H_ | 
 |  | 
 | #include "api/scoped_refptr.h" | 
 | #include "rtc_base/bind.h" | 
 | #include "rtc_base/critical_section.h" | 
 | #include "rtc_base/event.h" | 
 | #include "rtc_base/message_handler.h" | 
 | #include "rtc_base/ref_counted_object.h" | 
 | #include "rtc_base/third_party/sigslot/sigslot.h" | 
 | #include "rtc_base/thread.h" | 
 | #include "rtc_base/thread_annotations.h" | 
 |  | 
 | namespace rtc { | 
 |  | 
 | class AsyncInvoker; | 
 |  | 
 | // Helper class for AsyncInvoker. Runs a task and triggers a callback | 
 | // on the calling thread if necessary. | 
 | class AsyncClosure { | 
 |  public: | 
 |   explicit AsyncClosure(AsyncInvoker* invoker); | 
 |   virtual ~AsyncClosure(); | 
 |   // Runs the asynchronous task, and triggers a callback to the calling | 
 |   // thread if needed. Should be called from the target thread. | 
 |   virtual void Execute() = 0; | 
 |  | 
 |  protected: | 
 |   AsyncInvoker* invoker_; | 
 |   // Reference counted so that if the AsyncInvoker destructor finishes before | 
 |   // an AsyncClosure's destructor that's about to call | 
 |   // "invocation_complete_->Set()", it's not dereferenced after being | 
 |   // destroyed. | 
 |   scoped_refptr<RefCountedObject<Event>> invocation_complete_; | 
 | }; | 
 |  | 
 | // Simple closure that doesn't trigger a callback for the calling thread. | 
 | template <class FunctorT> | 
 | class FireAndForgetAsyncClosure : public AsyncClosure { | 
 |  public: | 
 |   explicit FireAndForgetAsyncClosure(AsyncInvoker* invoker, FunctorT&& functor) | 
 |       : AsyncClosure(invoker), functor_(std::forward<FunctorT>(functor)) {} | 
 |   virtual void Execute() { functor_(); } | 
 |  | 
 |  private: | 
 |   typename std::decay<FunctorT>::type functor_; | 
 | }; | 
 |  | 
 | }  // namespace rtc | 
 |  | 
 | #endif  // RTC_BASE_ASYNC_INVOKER_INL_H_ |