Chromium Code Reviews| OLD | NEW | 
|---|---|
| 1 /* | 1 /* | 
| 2 * Copyright 2014 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2014 The WebRTC Project Authors. All rights reserved. | 
| 3 * | 3 * | 
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license | 
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source | 
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found | 
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may | 
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. | 
| 9 */ | 9 */ | 
| 10 | 10 | 
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 137 uint32 id); | 137 uint32 id); | 
| 138 void DoInvokeDelayed(Thread* thread, | 138 void DoInvokeDelayed(Thread* thread, | 
| 139 const scoped_refptr<AsyncClosure>& closure, | 139 const scoped_refptr<AsyncClosure>& closure, | 
| 140 uint32 delay_ms, | 140 uint32 delay_ms, | 
| 141 uint32 id); | 141 uint32 id); | 
| 142 bool destroying_; | 142 bool destroying_; | 
| 143 | 143 | 
| 144 DISALLOW_COPY_AND_ASSIGN(AsyncInvoker); | 144 DISALLOW_COPY_AND_ASSIGN(AsyncInvoker); | 
| 145 }; | 145 }; | 
| 146 | 146 | 
| 147 // Similar to AsyncInvoker, but guards against the Thread being destroyed. It | |
| 148 // will connect to the current thread in the constructor, and will get notified | |
| 149 // when that thread is destroyed. After GuardedAsyncInvoker is constructed, it | |
| 150 // can be used from other threads to post functors to the thread it was | |
| 151 // constructed on. If that thread dies, any further calls to AsyncInvoke() will | |
| 152 // 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.
 
 | |
| 153 class GuardedAsyncInvoker : public sigslot::has_slots<> { | |
| 154 public: | |
| 155 GuardedAsyncInvoker(); | |
| 156 ~GuardedAsyncInvoker() override; | |
| 157 | |
| 158 // Synchronously execute all outstanding calls we own, and wait for calls to | |
| 159 // complete before returning. Optionally filter by message id. The destructor | |
| 160 // will not wait for outstanding calls, so if that behavior is desired, call | |
| 161 // Flush() first. | |
| 162 void Flush(uint32 id = MQID_ANY); | |
| 163 | |
| 164 // Call |functor| asynchronously with no callback upon completion. Returns | |
| 165 // immediately. | |
| 166 template <class ReturnT, class FunctorT> | |
| 167 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.
 
 | |
| 168 rtc::CritScope cs(&crit_); | |
| 169 if (thread_ != nullptr) | |
| 170 invoker_.AsyncInvoke<ReturnT, FunctorT>(thread_, functor, id); | |
| 171 } | |
| 172 | |
| 173 // Call |functor| asynchronously with |delay_ms|, with no callback upon | |
| 174 // completion. Returns immediately. | |
| 175 template <class ReturnT, class FunctorT> | |
| 176 void AsyncInvokeDelayed(const FunctorT& functor, | |
| 177 uint32 delay_ms, | |
| 178 uint32 id = 0) { | |
| 179 rtc::CritScope cs(&crit_); | |
| 180 if (thread_ != nullptr) | |
| 
 
tommi (sloooow) - chröme
2015/08/19 20:01:54
{} (and below)
 
magjed_webrtc
2015/08/20 10:28:33
Acknowledged.
 
 | |
| 181 invoker_.AsyncInvokeDelayed<ReturnT, FunctorT>(thread_, functor, | |
| 182 delay_ms, id); | |
| 183 } | |
| 184 | |
| 185 // Call |functor| asynchronously, calling |callback| when done. | |
| 186 template <class ReturnT, class FunctorT, class HostT> | |
| 187 void AsyncInvoke(const FunctorT& functor, | |
| 188 void (HostT::*callback)(ReturnT), | |
| 189 HostT* callback_host, | |
| 190 uint32 id = 0) { | |
| 191 rtc::CritScope cs(&crit_); | |
| 192 if (thread_ != nullptr) | |
| 193 invoker_.AsyncInvoke<ReturnT, FunctorT, HostT>( | |
| 194 thread_, functor, callback, callback_host, id); | |
| 195 } | |
| 196 | |
| 197 // Call |functor| asynchronously calling |callback| when done. Overloaded for | |
| 198 // void return. | |
| 199 template <class ReturnT, class FunctorT, class HostT> | |
| 200 void AsyncInvoke(const FunctorT& functor, | |
| 201 void (HostT::*callback)(), | |
| 202 HostT* callback_host, | |
| 203 uint32 id = 0) { | |
| 204 rtc::CritScope cs(&crit_); | |
| 205 if (thread_ != nullptr) | |
| 206 invoker_.AsyncInvoke<ReturnT, FunctorT, HostT>( | |
| 207 thread_, functor, callback, callback_host, id); | |
| 208 } | |
| 209 | |
| 210 private: | |
| 211 // Callback when |thread_| is destroyed. | |
| 212 void ThreadDestroyed(); | |
| 213 | |
| 214 CriticalSection crit_; | |
| 215 Thread* thread_ GUARDED_BY(crit_); | |
| 216 AsyncInvoker invoker_ GUARDED_BY(crit_); | |
| 217 }; | |
| 218 | |
| 147 } // namespace rtc | 219 } // namespace rtc | 
| 148 | 220 | 
| 149 | |
| 150 #endif // WEBRTC_BASE_ASYNCINVOKER_H_ | 221 #endif // WEBRTC_BASE_ASYNCINVOKER_H_ | 
| OLD | NEW |