diff --git a/rtc_base/sequenced_task_checker.h b/rtc_base/sequenced_task_checker.h index cc369be68e..eb151985de 100644 --- a/rtc_base/sequenced_task_checker.h +++ b/rtc_base/sequenced_task_checker.h @@ -22,6 +22,12 @@ #include "rtc_base/thread_annotations.h" namespace rtc { +namespace internal { +// Forward declaration of the internal implementation of RTC_GUARDED_BY(). +// SequencedTaskChecker grants this class access to call its IsCurrent() method. +// See thread_checker.h for more details. +class AnnounceOnThread; +} // namespace internal // Do nothing implementation, for use in release mode. // @@ -30,8 +36,11 @@ namespace rtc { class SequencedTaskCheckerDoNothing { public: bool CalledSequentially() const { return true; } - void Detach() {} + + private: + friend class internal::AnnounceOnThread; + bool IsCurrent() const { return CalledSequentially(); } }; // SequencedTaskChecker is a helper class used to help verify that some methods diff --git a/rtc_base/sequenced_task_checker_impl.h b/rtc_base/sequenced_task_checker_impl.h index 0a5464efe8..86d5ef0213 100644 --- a/rtc_base/sequenced_task_checker_impl.h +++ b/rtc_base/sequenced_task_checker_impl.h @@ -34,6 +34,9 @@ class SequencedTaskCheckerImpl { void Detach(); private: + friend class internal::AnnounceOnThread; + bool IsCurrent() const { return CalledSequentially(); } + typedef const void* QueueId; CriticalSection lock_; ThreadChecker thread_checker_; diff --git a/rtc_base/sequenced_task_checker_unittest.cc b/rtc_base/sequenced_task_checker_unittest.cc index d77546289d..9199eb7c8f 100644 --- a/rtc_base/sequenced_task_checker_unittest.cc +++ b/rtc_base/sequenced_task_checker_unittest.cc @@ -9,15 +9,38 @@ */ #include "rtc_base/sequenced_task_checker.h" + #include "rtc_base/checks.h" #include "rtc_base/constructormagic.h" #include "rtc_base/platform_thread.h" #include "rtc_base/task_queue.h" +#include "rtc_base/thread_checker.h" #include "test/gtest.h" namespace rtc { namespace { + +// This class is dead code, but its purpose is to make sure that +// SequencedTaskChecker is compatible with the RTC_GUARDED_BY and RTC_RUN_ON +// attributes that are checked at compile-time. +class CompileTimeTestForGuardedBy { + public: + int CalledOnSequence() RTC_RUN_ON(sequence_checker_) { + return guarded_; + } + + void CallMeFromSequence() { + RTC_DCHECK_RUN_ON(&sequence_checker_) + << "Should be called on sequence"; + } + + private: + int guarded_ RTC_GUARDED_BY(sequence_checker_); + rtc::SequencedTaskChecker sequence_checker_; +}; + + // Calls SequencedTaskChecker::CalledSequentially on another thread. class CallCalledSequentiallyOnThread { public: