Index: webrtc/base/asyncinvoker.h |
diff --git a/webrtc/base/asyncinvoker.h b/webrtc/base/asyncinvoker.h |
index 76e5d922e60ae214c867f1dd191a438b415dd879..d91e30601eff620aaec65537ee47632187a705c5 100644 |
--- a/webrtc/base/asyncinvoker.h |
+++ b/webrtc/base/asyncinvoker.h |
@@ -45,13 +45,13 @@ namespace rtc { |
// public: |
// void FireAsyncTaskWithResult(Thread* thread, int x) { |
// // Specify a callback to get the result upon completion. |
-// invoker_.AsyncInvoke<int>( |
+// 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>( |
+// invoker_.AsyncInvoke<void>(RTC_FROM_HERE, |
// thread, Bind(&MyClass::AnotherAsyncTask, this)); |
// |
// private: |
@@ -75,49 +75,63 @@ class AsyncInvoker : public MessageHandler { |
// Call |functor| asynchronously on |thread|, with no callback upon |
// completion. Returns immediately. |
template <class ReturnT, class FunctorT> |
- void AsyncInvoke(Thread* thread, const FunctorT& functor, uint32_t id = 0) { |
+ void AsyncInvoke(const Location& posted_from, |
+ Thread* thread, |
+ const FunctorT& functor, |
+ uint32_t id = 0) { |
scoped_refptr<AsyncClosure> closure( |
new RefCountedObject<FireAndForgetAsyncClosure<FunctorT> >(functor)); |
- DoInvoke(thread, closure, id); |
+ DoInvoke(posted_from, thread, closure, id); |
} |
// Call |functor| asynchronously on |thread| with |delay_ms|, with no callback |
// upon completion. Returns immediately. |
template <class ReturnT, class FunctorT> |
- void AsyncInvokeDelayed(Thread* thread, |
+ void AsyncInvokeDelayed(const Location& posted_from, |
+ Thread* thread, |
const FunctorT& functor, |
uint32_t delay_ms, |
uint32_t id = 0) { |
scoped_refptr<AsyncClosure> closure( |
new RefCountedObject<FireAndForgetAsyncClosure<FunctorT> >(functor)); |
- DoInvokeDelayed(thread, closure, delay_ms, id); |
+ DoInvokeDelayed(posted_from, thread, closure, delay_ms, id); |
} |
// Call |functor| asynchronously on |thread|, calling |callback| when done. |
+ // Uses a separate Location for |callback_posted_from| so that the functor |
+ // invoke and the callback invoke can be differentiated. |
template <class ReturnT, class FunctorT, class HostT> |
- void AsyncInvoke(Thread* thread, |
+ void AsyncInvoke(const Location& posted_from, |
+ const Location& callback_posted_from, |
+ Thread* thread, |
const FunctorT& functor, |
void (HostT::*callback)(ReturnT), |
HostT* callback_host, |
uint32_t id = 0) { |
scoped_refptr<AsyncClosure> closure( |
new RefCountedObject<NotifyingAsyncClosure<ReturnT, FunctorT, HostT> >( |
- this, Thread::Current(), functor, callback, callback_host)); |
- DoInvoke(thread, closure, id); |
+ this, callback_posted_from, Thread::Current(), functor, callback, |
+ callback_host)); |
+ DoInvoke(posted_from, thread, closure, id); |
} |
// Call |functor| asynchronously on |thread|, calling |callback| when done. |
+ // Uses a separate Location for |callback_posted_from| so that the functor |
+ // invoke and the callback invoke can be differentiated. |
// Overloaded for void return. |
template <class ReturnT, class FunctorT, class HostT> |
- void AsyncInvoke(Thread* thread, |
+ void AsyncInvoke(const Location& posted_from, |
+ const Location& callback_posted_from, |
+ Thread* thread, |
const FunctorT& functor, |
void (HostT::*callback)(), |
HostT* callback_host, |
uint32_t id = 0) { |
scoped_refptr<AsyncClosure> closure( |
new RefCountedObject<NotifyingAsyncClosure<void, FunctorT, HostT> >( |
- this, Thread::Current(), functor, callback, callback_host)); |
- DoInvoke(thread, closure, id); |
+ this, callback_posted_from, Thread::Current(), functor, callback, |
+ callback_host)); |
+ DoInvoke(posted_from, thread, closure, id); |
} |
// Synchronously execute on |thread| all outstanding calls we own |
@@ -132,10 +146,12 @@ class AsyncInvoker : public MessageHandler { |
private: |
void OnMessage(Message* msg) override; |
- void DoInvoke(Thread* thread, |
+ void DoInvoke(const Location& posted_from, |
+ Thread* thread, |
const scoped_refptr<AsyncClosure>& closure, |
uint32_t id); |
- void DoInvokeDelayed(Thread* thread, |
+ void DoInvokeDelayed(const Location& posted_from, |
+ Thread* thread, |
const scoped_refptr<AsyncClosure>& closure, |
uint32_t delay_ms, |
uint32_t id); |
@@ -164,55 +180,64 @@ class GuardedAsyncInvoker : public sigslot::has_slots<> { |
// 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 FunctorT& functor, uint32_t id = 0) { |
+ 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>(thread_, functor, id); |
+ 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 FunctorT& functor, |
+ 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>(thread_, functor, delay_ms, |
- id); |
+ 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 FunctorT& functor, |
+ 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>(thread_, functor, callback, |
- callback_host, id); |
+ 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 FunctorT& functor, |
+ 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>(thread_, functor, callback, |
- callback_host, id); |
+ invoker_.AsyncInvoke<ReturnT, FunctorT, HostT>( |
+ posted_from, callback_posted_from, thread_, functor, callback, |
+ callback_host, id); |
return true; |
} |