From 8824e004924b5b93426453aef773001aac1056c4 Mon Sep 17 00:00:00 2001 From: Andreas Pehrson Date: Tue, 23 May 2023 06:14:38 +0000 Subject: [PATCH] Bug 1832751 - cherry-pick upstream libwebrtc commit 3da04a93cd. r=webrtc-reviewers,mjf Upstream commit: https://webrtc.googlesource.com/src/+/3da04a93cd18dc7b65c6756910cc8a9cbf20fb8c Allow SequenceChecker to be initialized detached. The motivation for this is to not have to implement this pattern: foo.h: class Foo { public: Foo(); private: SequenceChecker checker_; }; foo.cc: Foo::Foo() { checker_.Detach(); } And instead be able to do this inline in the .h file: class Foo { public: Foo(); private: SequenceChecker checker_{SequenceChecker::kDetached}; }; Bug: none Change-Id: Idd7ca82d15c2f77f3aaccf26f1943a49f4b40661 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/298445 Reviewed-by: Danil Chapovalov Commit-Queue: Tomas Gunnarsson Cr-Commit-Position: refs/heads/main@{#39616} Differential Revision: https://phabricator.services.mozilla.com/D177874 --- third_party/libwebrtc/api/sequence_checker.h | 5 +++++ .../api/sequence_checker_unittest.cc | 21 +++++++++++++++++-- .../sequence_checker_internal.cc | 4 ++-- .../sequence_checker_internal.h | 3 ++- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/third_party/libwebrtc/api/sequence_checker.h b/third_party/libwebrtc/api/sequence_checker.h index a79d04f61fd3..33e0f3c074ca 100644 --- a/third_party/libwebrtc/api/sequence_checker.h +++ b/third_party/libwebrtc/api/sequence_checker.h @@ -44,6 +44,11 @@ class RTC_LOCKABLE SequenceChecker using Impl = webrtc_sequence_checker_internal::SequenceCheckerDoNothing; #endif public: + enum InitialState : bool { kDetached = false, kAttached = true }; + + explicit SequenceChecker(InitialState initial_state = kAttached) + : Impl(initial_state) {} + // Returns true if sequence checker is attached to the current sequence. bool IsCurrent() const { return Impl::IsCurrent(); } // Detaches checker from sequence to which it is attached. Next attempt diff --git a/third_party/libwebrtc/api/sequence_checker_unittest.cc b/third_party/libwebrtc/api/sequence_checker_unittest.cc index a929c59655b0..3efb5c78eed8 100644 --- a/third_party/libwebrtc/api/sequence_checker_unittest.cc +++ b/third_party/libwebrtc/api/sequence_checker_unittest.cc @@ -122,8 +122,7 @@ TEST(SequenceCheckerTest, DetachFromTaskQueueInDebug) { TEST(SequenceCheckerTest, ExpectationToString) { TaskQueueForTest queue1; - SequenceChecker sequence_checker; - sequence_checker.Detach(); + SequenceChecker sequence_checker(SequenceChecker::kDetached); rtc::Event blocker; queue1.PostTask([&blocker, &sequence_checker]() { @@ -149,6 +148,24 @@ TEST(SequenceCheckerTest, ExpectationToString) { #endif } +TEST(SequenceCheckerTest, InitiallyDetached) { + TaskQueueForTest queue1; + + SequenceChecker sequence_checker(SequenceChecker::kDetached); + + rtc::Event blocker; + queue1.PostTask([&blocker, &sequence_checker]() { + EXPECT_TRUE(sequence_checker.IsCurrent()); + blocker.Set(); + }); + + blocker.Wait(rtc::Event::kForever); + +#if RTC_DCHECK_IS_ON + EXPECT_FALSE(sequence_checker.IsCurrent()); +#endif +} + class TestAnnotations { public: TestAnnotations() : test_var_(false) {} diff --git a/third_party/libwebrtc/rtc_base/synchronization/sequence_checker_internal.cc b/third_party/libwebrtc/rtc_base/synchronization/sequence_checker_internal.cc index 2612e9ee8473..9831f07d7ddd 100644 --- a/third_party/libwebrtc/rtc_base/synchronization/sequence_checker_internal.cc +++ b/third_party/libwebrtc/rtc_base/synchronization/sequence_checker_internal.cc @@ -33,8 +33,8 @@ const void* GetSystemQueueRef() { } // namespace -SequenceCheckerImpl::SequenceCheckerImpl() - : attached_(true), +SequenceCheckerImpl::SequenceCheckerImpl(bool attach_to_current_thread) + : attached_(attach_to_current_thread), valid_thread_(rtc::CurrentThreadRef()), valid_queue_(TaskQueueBase::Current()), valid_system_queue_(GetSystemQueueRef()) {} diff --git a/third_party/libwebrtc/rtc_base/synchronization/sequence_checker_internal.h b/third_party/libwebrtc/rtc_base/synchronization/sequence_checker_internal.h index a20fbb0a5497..a66e9ee8ec9c 100644 --- a/third_party/libwebrtc/rtc_base/synchronization/sequence_checker_internal.h +++ b/third_party/libwebrtc/rtc_base/synchronization/sequence_checker_internal.h @@ -30,7 +30,7 @@ namespace webrtc_sequence_checker_internal { // right version for your build configuration. class RTC_EXPORT SequenceCheckerImpl { public: - SequenceCheckerImpl(); + explicit SequenceCheckerImpl(bool attach_to_current_thread); ~SequenceCheckerImpl() = default; bool IsCurrent() const; @@ -59,6 +59,7 @@ class RTC_EXPORT SequenceCheckerImpl { // right version for your build configuration. class SequenceCheckerDoNothing { public: + explicit SequenceCheckerDoNothing(bool attach_to_current_thread) {} bool IsCurrent() const { return true; } void Detach() {} };