Index: webrtc/base/asyncinvoker.h |
diff --git a/webrtc/base/asyncinvoker.h b/webrtc/base/asyncinvoker.h |
index fe1506d99f8688ca53f92d6f7b3da401dbe84107..cac754b850bbd58cfadcb5956e01a8c7181fd753 100644 |
--- a/webrtc/base/asyncinvoker.h |
+++ b/webrtc/base/asyncinvoker.h |
@@ -144,7 +144,78 @@ class AsyncInvoker : public MessageHandler { |
DISALLOW_COPY_AND_ASSIGN(AsyncInvoker); |
}; |
-} // namespace rtc |
+// Similar to AsyncInvoker, but guards against the Thread being destroyed. 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. |
tommi (sloooow) - chröme
2015/08/19 20:01:54
Good comment. Can we add something like "...being
magjed_webrtc
2015/08/20 10:28:33
Done.
|
+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. |
+ void Flush(uint32 id = MQID_ANY); |
+ |
+ // Call |functor| asynchronously with no callback upon completion. Returns |
+ // immediately. |
+ template <class ReturnT, class FunctorT> |
+ void AsyncInvoke(const FunctorT& functor, uint32 id = 0) { |
tommi (sloooow) - chröme
2015/08/19 20:01:54
what about making this method return bool and retu
magjed_webrtc
2015/08/20 10:28:33
Done.
|
+ rtc::CritScope cs(&crit_); |
+ if (thread_ != nullptr) |
+ invoker_.AsyncInvoke<ReturnT, FunctorT>(thread_, functor, id); |
+ } |
+ // Call |functor| asynchronously with |delay_ms|, with no callback upon |
+ // completion. Returns immediately. |
+ template <class ReturnT, class FunctorT> |
+ void AsyncInvokeDelayed(const FunctorT& functor, |
+ uint32 delay_ms, |
+ uint32 id = 0) { |
+ rtc::CritScope cs(&crit_); |
+ if (thread_ != nullptr) |
tommi (sloooow) - chröme
2015/08/19 20:01:54
{} (and below)
magjed_webrtc
2015/08/20 10:28:33
Acknowledged.
|
+ invoker_.AsyncInvokeDelayed<ReturnT, FunctorT>(thread_, functor, |
+ delay_ms, id); |
+ } |
+ |
+ // Call |functor| asynchronously, calling |callback| when done. |
+ template <class ReturnT, class FunctorT, class HostT> |
+ void AsyncInvoke(const FunctorT& functor, |
+ void (HostT::*callback)(ReturnT), |
+ HostT* callback_host, |
+ uint32 id = 0) { |
+ rtc::CritScope cs(&crit_); |
+ if (thread_ != nullptr) |
+ invoker_.AsyncInvoke<ReturnT, FunctorT, HostT>( |
+ thread_, functor, callback, callback_host, id); |
+ } |
+ |
+ // Call |functor| asynchronously calling |callback| when done. Overloaded for |
+ // void return. |
+ template <class ReturnT, class FunctorT, class HostT> |
+ void AsyncInvoke(const FunctorT& functor, |
+ void (HostT::*callback)(), |
+ HostT* callback_host, |
+ uint32 id = 0) { |
+ rtc::CritScope cs(&crit_); |
+ if (thread_ != nullptr) |
+ invoker_.AsyncInvoke<ReturnT, FunctorT, HostT>( |
+ thread_, functor, callback, callback_host, id); |
+ } |
+ |
+ private: |
+ // Callback when |thread_| is destroyed. |
+ void ThreadDestroyed(); |
+ |
+ CriticalSection crit_; |
+ Thread* thread_ GUARDED_BY(crit_); |
+ AsyncInvoker invoker_ GUARDED_BY(crit_); |
+}; |
+ |
+} // namespace rtc |
#endif // WEBRTC_BASE_ASYNCINVOKER_H_ |