Support initializing PendingTaskSafetyFlag with a specific TaskQueue.
Bug: none
Change-Id: I0f354708e6275372601adc36da3012259bb57303
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/324280
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41008}
diff --git a/api/task_queue/pending_task_safety_flag.cc b/api/task_queue/pending_task_safety_flag.cc
index 437ce07..3145550 100644
--- a/api/task_queue/pending_task_safety_flag.cc
+++ b/api/task_queue/pending_task_safety_flag.cc
@@ -32,6 +32,16 @@
return safety_flag;
}
+// Creates a flag, but with its SequenceChecker explicitly initialized for
+// a given task queue and the `alive()` flag specified.
+rtc::scoped_refptr<PendingTaskSafetyFlag>
+PendingTaskSafetyFlag::CreateAttachedToTaskQueue(
+ bool alive,
+ TaskQueueBase* attached_queue) {
+ return rtc::scoped_refptr<PendingTaskSafetyFlag>(
+ new PendingTaskSafetyFlag(alive, attached_queue));
+}
+
rtc::scoped_refptr<PendingTaskSafetyFlag>
PendingTaskSafetyFlag::CreateDetachedInactive() {
rtc::scoped_refptr<PendingTaskSafetyFlag> safety_flag = CreateInternal(false);
diff --git a/api/task_queue/pending_task_safety_flag.h b/api/task_queue/pending_task_safety_flag.h
index 7f6a592..b601b94 100644
--- a/api/task_queue/pending_task_safety_flag.h
+++ b/api/task_queue/pending_task_safety_flag.h
@@ -68,6 +68,12 @@
// may be created on a different thread than the flag will be used on.
static rtc::scoped_refptr<PendingTaskSafetyFlag> CreateDetached();
+ // Creates a flag, but with its SequenceChecker explicitly initialized for
+ // a given task queue and the `alive()` flag specified.
+ static rtc::scoped_refptr<PendingTaskSafetyFlag> CreateAttachedToTaskQueue(
+ bool alive,
+ TaskQueueBase* attached_queue);
+
// Same as `CreateDetached()` except the initial state of the returned flag
// will be `!alive()`.
static rtc::scoped_refptr<PendingTaskSafetyFlag> CreateDetachedInactive();
@@ -95,6 +101,8 @@
protected:
explicit PendingTaskSafetyFlag(bool alive) : alive_(alive) {}
+ PendingTaskSafetyFlag(bool alive, TaskQueueBase* attached_queue)
+ : alive_(alive), main_sequence_(attached_queue) {}
private:
static rtc::scoped_refptr<PendingTaskSafetyFlag> CreateInternal(bool alive);
diff --git a/api/task_queue/pending_task_safety_flag_unittest.cc b/api/task_queue/pending_task_safety_flag_unittest.cc
index cedf0eb..3a1ed26 100644
--- a/api/task_queue/pending_task_safety_flag_unittest.cc
+++ b/api/task_queue/pending_task_safety_flag_unittest.cc
@@ -167,6 +167,17 @@
EXPECT_TRUE(task_2_ran);
}
+TEST(PendingTaskSafetyFlagTest, PendingTaskInitializedForTaskQueue) {
+ TaskQueueForTest tq("PendingTaskAliveInitializedForTaskQueue");
+
+ // Create a new flag that initially `alive`, attached to a specific TQ.
+ auto flag = PendingTaskSafetyFlag::CreateAttachedToTaskQueue(true, tq.Get());
+ tq.SendTask([&flag]() { EXPECT_TRUE(flag->alive()); });
+ // Repeat the same steps but initialize as inactive.
+ flag = PendingTaskSafetyFlag::CreateAttachedToTaskQueue(false, tq.Get());
+ tq.SendTask([&flag]() { EXPECT_FALSE(flag->alive()); });
+}
+
TEST(PendingTaskSafetyFlagTest, SafeTask) {
rtc::scoped_refptr<PendingTaskSafetyFlag> flag =
PendingTaskSafetyFlag::Create();