Index: webrtc/base/asyncinvoker.h |
diff --git a/webrtc/base/asyncinvoker.h b/webrtc/base/asyncinvoker.h |
index 541486741841b82b09b936cf6aceb65d56f4872a..0fcfc04947bd9f93b48e4ec49af9c65c6624a6d8 100644 |
--- a/webrtc/base/asyncinvoker.h |
+++ b/webrtc/base/asyncinvoker.h |
@@ -11,211 +11,9 @@ |
#ifndef WEBRTC_BASE_ASYNCINVOKER_H_ |
#define WEBRTC_BASE_ASYNCINVOKER_H_ |
-#include <memory> |
-#include <utility> |
-#include "webrtc/base/asyncinvoker-inl.h" |
-#include "webrtc/base/bind.h" |
-#include "webrtc/base/constructormagic.h" |
-#include "webrtc/base/event.h" |
-#include "webrtc/base/sigslot.h" |
-#include "webrtc/base/thread.h" |
- |
-namespace rtc { |
- |
-// Invokes function objects (aka functors) asynchronously on a Thread, and |
-// owns the lifetime of calls (ie, when this object is destroyed, calls in |
-// flight are cancelled). AsyncInvoker can optionally execute a user-specified |
-// function when the asynchronous call is complete, or operates in |
-// fire-and-forget mode otherwise. |
-// |
-// AsyncInvoker does not own the thread it calls functors on. |
-// |
-// A note about async calls and object lifetimes: users should |
-// be mindful of object lifetimes when calling functions asynchronously and |
-// ensure objects used by the function _cannot_ be deleted between the |
-// invocation and execution of the functor. AsyncInvoker is designed to |
-// help: any calls in flight will be cancelled when the AsyncInvoker used to |
-// make the call is destructed, and any calls executing will be allowed to |
-// complete before AsyncInvoker destructs. |
-// |
-// The easiest way to ensure lifetimes are handled correctly is to create a |
-// class that owns the Thread and AsyncInvoker objects, and then call its |
-// methods asynchronously as needed. |
-// |
-// Example: |
-// class MyClass { |
-// public: |
-// void FireAsyncTaskWithResult(Thread* thread, int x) { |
-// // Specify a callback to get the result upon completion. |
-// invoker_.AsyncInvoke<int>(RTC_FROM_HERE, |
-// thread, Bind(&MyClass::AsyncTaskWithResult, this, x), |
-// &MyClass::OnTaskComplete, this); |
-// } |
-// void FireAnotherAsyncTask(Thread* thread) { |
-// // No callback specified means fire-and-forget. |
-// invoker_.AsyncInvoke<void>(RTC_FROM_HERE, |
-// thread, Bind(&MyClass::AnotherAsyncTask, this)); |
-// |
-// private: |
-// int AsyncTaskWithResult(int x) { |
-// // Some long running process... |
-// return x * x; |
-// } |
-// void AnotherAsyncTask() { |
-// // Some other long running process... |
-// } |
-// void OnTaskComplete(int result) { result_ = result; } |
-// |
-// AsyncInvoker invoker_; |
-// int result_; |
-// }; |
-class AsyncInvoker : public MessageHandler { |
- public: |
- AsyncInvoker(); |
- ~AsyncInvoker() override; |
- |
- // Call |functor| asynchronously on |thread|, with no callback upon |
- // completion. Returns immediately. |
- template <class ReturnT, class FunctorT> |
- void AsyncInvoke(const Location& posted_from, |
- Thread* thread, |
- const FunctorT& functor, |
- uint32_t id = 0) { |
- std::unique_ptr<AsyncClosure> closure( |
- new FireAndForgetAsyncClosure<FunctorT>(this, functor)); |
- DoInvoke(posted_from, thread, std::move(closure), id); |
- } |
- |
- // Call |functor| asynchronously on |thread| with |delay_ms|, with no callback |
- // upon completion. Returns immediately. |
- template <class ReturnT, class FunctorT> |
- void AsyncInvokeDelayed(const Location& posted_from, |
- Thread* thread, |
- const FunctorT& functor, |
- uint32_t delay_ms, |
- uint32_t id = 0) { |
- std::unique_ptr<AsyncClosure> closure( |
- new FireAndForgetAsyncClosure<FunctorT>(this, functor)); |
- DoInvokeDelayed(posted_from, thread, std::move(closure), delay_ms, id); |
- } |
- |
- // Synchronously execute on |thread| all outstanding calls we own |
- // that are pending on |thread|, and wait for calls to complete |
- // before returning. Optionally filter by message id. |
- // The destructor will not wait for outstanding calls, so if that |
- // behavior is desired, call Flush() before destroying this object. |
- void Flush(Thread* thread, uint32_t id = MQID_ANY); |
- |
- private: |
- void OnMessage(Message* msg) override; |
- void DoInvoke(const Location& posted_from, |
- Thread* thread, |
- std::unique_ptr<AsyncClosure> closure, |
- uint32_t id); |
- void DoInvokeDelayed(const Location& posted_from, |
- Thread* thread, |
- std::unique_ptr<AsyncClosure> closure, |
- uint32_t delay_ms, |
- uint32_t id); |
- volatile int pending_invocations_ = 0; |
- Event invocation_complete_; |
- bool destroying_ = false; |
- friend class AsyncClosure; |
- |
- RTC_DISALLOW_COPY_AND_ASSIGN(AsyncInvoker); |
-}; |
- |
-// Similar to AsyncInvoker, but guards against the Thread being destroyed while |
-// there are outstanding dangling pointers to it. It will connect to the current |
-// thread in the constructor, and will get notified when that thread is |
-// destroyed. After GuardedAsyncInvoker is constructed, it can be used from |
-// other threads to post functors to the thread it was constructed on. If that |
-// thread dies, any further calls to AsyncInvoke() will be safely ignored. |
-class GuardedAsyncInvoker : public sigslot::has_slots<> { |
- public: |
- GuardedAsyncInvoker(); |
- ~GuardedAsyncInvoker() override; |
- |
- // Synchronously execute all outstanding calls we own, and wait for calls to |
- // complete before returning. Optionally filter by message id. The destructor |
- // will not wait for outstanding calls, so if that behavior is desired, call |
- // Flush() first. Returns false if the thread has died. |
- bool Flush(uint32_t id = MQID_ANY); |
- |
- // Call |functor| asynchronously with no callback upon completion. Returns |
- // immediately. Returns false if the thread has died. |
- template <class ReturnT, class FunctorT> |
- bool AsyncInvoke(const Location& posted_from, |
- const FunctorT& functor, |
- uint32_t id = 0) { |
- rtc::CritScope cs(&crit_); |
- if (thread_ == nullptr) |
- return false; |
- invoker_.AsyncInvoke<ReturnT, FunctorT>(posted_from, thread_, functor, id); |
- return true; |
- } |
- |
- // Call |functor| asynchronously with |delay_ms|, with no callback upon |
- // completion. Returns immediately. Returns false if the thread has died. |
- template <class ReturnT, class FunctorT> |
- bool AsyncInvokeDelayed(const Location& posted_from, |
- const FunctorT& functor, |
- uint32_t delay_ms, |
- uint32_t id = 0) { |
- rtc::CritScope cs(&crit_); |
- if (thread_ == nullptr) |
- return false; |
- invoker_.AsyncInvokeDelayed<ReturnT, FunctorT>(posted_from, thread_, |
- functor, delay_ms, id); |
- return true; |
- } |
- |
- // Call |functor| asynchronously, calling |callback| when done. Returns false |
- // if the thread has died. |
- template <class ReturnT, class FunctorT, class HostT> |
- bool AsyncInvoke(const Location& posted_from, |
- const Location& callback_posted_from, |
- const FunctorT& functor, |
- void (HostT::*callback)(ReturnT), |
- HostT* callback_host, |
- uint32_t id = 0) { |
- rtc::CritScope cs(&crit_); |
- if (thread_ == nullptr) |
- return false; |
- invoker_.AsyncInvoke<ReturnT, FunctorT, HostT>( |
- posted_from, callback_posted_from, thread_, functor, callback, |
- callback_host, id); |
- return true; |
- } |
- |
- // Call |functor| asynchronously calling |callback| when done. Overloaded for |
- // void return. Returns false if the thread has died. |
- template <class ReturnT, class FunctorT, class HostT> |
- bool AsyncInvoke(const Location& posted_from, |
- const Location& callback_posted_from, |
- const FunctorT& functor, |
- void (HostT::*callback)(), |
- HostT* callback_host, |
- uint32_t id = 0) { |
- rtc::CritScope cs(&crit_); |
- if (thread_ == nullptr) |
- return false; |
- invoker_.AsyncInvoke<ReturnT, FunctorT, HostT>( |
- posted_from, callback_posted_from, thread_, functor, callback, |
- callback_host, id); |
- return true; |
- } |
- |
- private: |
- // Callback when |thread_| is destroyed. |
- void ThreadDestroyed(); |
- |
- CriticalSection crit_; |
- Thread* thread_ GUARDED_BY(crit_); |
- AsyncInvoker invoker_ GUARDED_BY(crit_); |
-}; |
- |
-} // namespace rtc |
+// This header is deprecated and is just left here temporarily during |
+// refactoring. See https://bugs.webrtc.org/7634 for more details. |
+#include "webrtc/rtc_base/asyncinvoker.h" |
#endif // WEBRTC_BASE_ASYNCINVOKER_H_ |