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 <danilchap@webrtc.org>
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39616}
diff --git a/api/sequence_checker.h b/api/sequence_checker.h
index a79d04f..33e0f3c 100644
--- a/api/sequence_checker.h
+++ b/api/sequence_checker.h
@@ -44,6 +44,11 @@
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/api/sequence_checker_unittest.cc b/api/sequence_checker_unittest.cc
index a929c59..3efb5c7 100644
--- a/api/sequence_checker_unittest.cc
+++ b/api/sequence_checker_unittest.cc
@@ -122,8 +122,7 @@
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 @@
#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/rtc_base/synchronization/sequence_checker_internal.cc b/rtc_base/synchronization/sequence_checker_internal.cc
index 2612e9e..9831f07 100644
--- a/rtc_base/synchronization/sequence_checker_internal.cc
+++ b/rtc_base/synchronization/sequence_checker_internal.cc
@@ -33,8 +33,8 @@
} // 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/rtc_base/synchronization/sequence_checker_internal.h b/rtc_base/synchronization/sequence_checker_internal.h
index a20fbb0..a66e9ee 100644
--- a/rtc_base/synchronization/sequence_checker_internal.h
+++ b/rtc_base/synchronization/sequence_checker_internal.h
@@ -30,7 +30,7 @@
// 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 @@
// right version for your build configuration.
class SequenceCheckerDoNothing {
public:
+ explicit SequenceCheckerDoNothing(bool attach_to_current_thread) {}
bool IsCurrent() const { return true; }
void Detach() {}
};