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}
This commit is contained in:
Tommi 2023-03-21 11:42:27 +01:00 committed by WebRTC LUCI CQ
parent 00029fe97e
commit 3da04a93cd
4 changed files with 28 additions and 5 deletions

View file

@ -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

View file

@ -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) {}

View file

@ -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()) {}

View file

@ -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() {}
};