Chromium Code Reviews| Index: webrtc/base/thread_checker.h |
| diff --git a/webrtc/base/thread_checker.h b/webrtc/base/thread_checker.h |
| index 6cd7d7b9e0e83e7ef1194e933022dba7b3cbb1ba..174c1475b70500aec4aae63bef0067e71a2cf2cd 100644 |
| --- a/webrtc/base/thread_checker.h |
| +++ b/webrtc/base/thread_checker.h |
| @@ -28,6 +28,9 @@ |
| #define ENABLE_THREAD_CHECKER 0 |
| #endif |
| +#include "webrtc/base/checks.h" |
| +#include "webrtc/base/constructormagic.h" |
| +#include "webrtc/base/thread_annotations.h" |
| #include "webrtc/base/thread_checker_impl.h" |
| namespace rtc { |
| @@ -77,15 +80,91 @@ class ThreadCheckerDoNothing { |
| // |
| // In Release mode, CalledOnValidThread will always return true. |
| #if ENABLE_THREAD_CHECKER |
| -class ThreadChecker : public ThreadCheckerImpl { |
| +class LOCKABLE ThreadChecker : public ThreadCheckerImpl { |
| }; |
| #else |
| -class ThreadChecker : public ThreadCheckerDoNothing { |
| +class LOCKABLE ThreadChecker : public ThreadCheckerDoNothing { |
| }; |
| #endif // ENABLE_THREAD_CHECKER |
| #undef ENABLE_THREAD_CHECKER |
| +class SCOPED_LOCKABLE AnnounceOnThread { |
|
tommi
2016/05/19 08:26:14
Since this class is not meant to be used directly,
danilchap
2016/05/19 11:45:29
Done.
|
| + public: |
| + template<typename ThreadLikeObject> |
| + explicit AnnounceOnThread(const ThreadLikeObject* thread_like_object) |
| + EXCLUSIVE_LOCK_FUNCTION(thread_like_object) {} |
| + |
| + template<typename ThreadLikeObject> |
| + static bool IsCurrent(const ThreadLikeObject* thread_like_object) { |
| + return thread_like_object->IsCurrent(); |
| + } |
| + static bool IsCurrent(const rtc::ThreadChecker* checker) { |
| + return checker->CalledOnValidThread(); |
| + } |
| + |
| + ~AnnounceOnThread() UNLOCK_FUNCTION() {} |
| + private: |
| + RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(AnnounceOnThread); |
| +}; |
| + |
| } // namespace rtc |
| +// RUN_ON/ACCESS_ON/RTC_DCHECK_RUN_ON macros allows to annotate variables are |
| +// access from same thread/queue. |
|
tommi
2016/05/19 08:26:14
s/access from same/accessed on the same
danilchap
2016/05/19 11:45:29
Done.
|
| +// Using tools designed to check mutexes, it checks at compile time everywhere |
| +// variable is access, there is a run-time dcheck thread/queue is correct. |
| +// |
| +// class ExampleThread { |
| +// rtc::Thread* network_thread_ |
| +// int transport_ ACCESS_ON(network_thread_); |
| +// void NeedVar1() { |
| +// RTC_DCHECK_RUN_ON(network_thread_); |
| +// transport_->Send(); |
| +// } |
| +// }; |
| +// |
| +// class ExampleThreadChecker { |
| +// int pacer_var_ ACCESS_ON(pacer_thread_checker_); |
| +// rtc::ThreadChecker pacer_thread_checker_; |
| +// |
| +// int CalledFromPacer() RUN_ON(pacer_thread_checker_) { |
| +// return var2_; |
| +// } |
| +// |
| +// void CallMeFromPacer() { |
| +// RTC_DCHECK_RUN_ON(&pacer_thread_checker_) |
| +// << "Should be called from pacer"; |
| +// CalledFromPacer(); |
| +// } |
| +// }; |
| +// |
| +// class TaskQueueExample { |
| +// class Encoder { |
| +// public: |
| +// rtc::TaskQueue* Queue() { return encoder_queue_; } |
| +// void Encode() { |
| +// RTC_DCHECK_RUN_ON(encoder_queue_); |
| +// DoSomething(var_); |
| +// } |
| +// |
| +// private: |
| +// rtc::TaskQueue* const encoder_queue_; |
| +// Frame var_ ACCESS_ON(encoder_queue_); |
| +// }; |
| +// rtc::scoped_ref_ptr<Encoder> encoder_; |
| +// |
| +// void Encode() { |
| +// // Will fail at runtime: |
| +// // encoder_->Encode(); |
| +// // Wile work: |
| +// rtc::scoped_ref_ptr<Encoder> encoder = encoder_; |
| +// encoder_->Queue()->PostTask([encoder] { encoder->Encode(); }); |
| +// } |
| +// } |
| + |
| +#define RTC_DCHECK_RUN_ON(thread_like_object) \ |
|
tommi
2016/05/19 08:26:14
have you checked if this produces zero code in non
danilchap
2016/05/19 11:45:29
I wrote it in a way it is easy for compiler to opt
|
| + rtc::AnnounceOnThread thread_announcer(thread_like_object); \ |
| + RTC_DCHECK(rtc::AnnounceOnThread::IsCurrent(thread_like_object)) |
| + |
| #endif // WEBRTC_BASE_THREAD_CHECKER_H_ |