Merge SendTask implementation for SingleThreadedTaskQueueForTesting and TaskQueueForTest
That allows to use SingleThreadedTaskQueueForTesting via TaskQueueBase interface
but still have access to test-only SendTask function.
Bug: webrtc:10933
Change-Id: I3cc397e55ea2f1ed9e5d885d6a2ccda412beb826
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/156002
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29480}
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index 564989a..896076b 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -1077,8 +1077,10 @@
deps = [
":checks",
":macromagic",
+ ":rtc_base_approved",
":rtc_event",
":rtc_task_queue",
+ "../api/task_queue",
"../api/task_queue:default_task_queue_factory",
"task_utils:to_queued_task",
"//third_party/abseil-cpp/absl/strings",
diff --git a/rtc_base/synchronization/sequence_checker_unittest.cc b/rtc_base/synchronization/sequence_checker_unittest.cc
index 00b847c..1e62e97 100644
--- a/rtc_base/synchronization/sequence_checker_unittest.cc
+++ b/rtc_base/synchronization/sequence_checker_unittest.cc
@@ -84,16 +84,20 @@
SequenceChecker sequence_checker;
sequence_checker.Detach();
TaskQueueForTest queue;
- queue.SendTask([&] { EXPECT_TRUE(sequence_checker.IsCurrent()); });
+ queue.SendTask([&] { EXPECT_TRUE(sequence_checker.IsCurrent()); },
+ RTC_FROM_HERE);
}
TEST(SequenceCheckerTest, DetachFromTaskQueueAndUseOnThread) {
TaskQueueForTest queue;
- queue.SendTask([] {
- SequenceChecker sequence_checker;
- sequence_checker.Detach();
- RunOnDifferentThread([&] { EXPECT_TRUE(sequence_checker.IsCurrent()); });
- });
+ queue.SendTask(
+ [] {
+ SequenceChecker sequence_checker;
+ sequence_checker.Detach();
+ RunOnDifferentThread(
+ [&] { EXPECT_TRUE(sequence_checker.IsCurrent()); });
+ },
+ RTC_FROM_HERE);
}
TEST(SequenceCheckerTest, MethodNotAllowedOnDifferentThreadInDebug) {
@@ -106,7 +110,8 @@
SequenceChecker sequence_checker;
TaskQueueForTest queue;
queue.SendTask(
- [&] { EXPECT_EQ(sequence_checker.IsCurrent(), !RTC_DCHECK_IS_ON); });
+ [&] { EXPECT_EQ(sequence_checker.IsCurrent(), !RTC_DCHECK_IS_ON); },
+ RTC_FROM_HERE);
}
TEST(SequenceCheckerTest, DetachFromTaskQueueInDebug) {
@@ -114,13 +119,15 @@
sequence_checker.Detach();
TaskQueueForTest queue1;
- queue1.SendTask([&] { EXPECT_TRUE(sequence_checker.IsCurrent()); });
+ queue1.SendTask([&] { EXPECT_TRUE(sequence_checker.IsCurrent()); },
+ RTC_FROM_HERE);
// IsCurrent should return false in debug builds after moving to
// another task queue.
TaskQueueForTest queue2;
queue2.SendTask(
- [&] { EXPECT_EQ(sequence_checker.IsCurrent(), !RTC_DCHECK_IS_ON); });
+ [&] { EXPECT_EQ(sequence_checker.IsCurrent(), !RTC_DCHECK_IS_ON); },
+ RTC_FROM_HERE);
}
class TestAnnotations {
@@ -147,7 +154,7 @@
void TestAnnotationsOnWrongQueue() {
TestAnnotations annotations;
TaskQueueForTest queue;
- queue.SendTask([&] { annotations.ModifyTestVar(); });
+ queue.SendTask([&] { annotations.ModifyTestVar(); }, RTC_FROM_HERE);
}
#if RTC_DCHECK_IS_ON
diff --git a/rtc_base/task_queue_for_test.h b/rtc_base/task_queue_for_test.h
index be91c50..40fc9c8 100644
--- a/rtc_base/task_queue_for_test.h
+++ b/rtc_base/task_queue_for_test.h
@@ -14,14 +14,27 @@
#include <utility>
#include "absl/strings/string_view.h"
+#include "api/task_queue/task_queue_base.h"
#include "rtc_base/checks.h"
#include "rtc_base/event.h"
+#include "rtc_base/location.h"
#include "rtc_base/task_queue.h"
#include "rtc_base/task_utils/to_queued_task.h"
#include "rtc_base/thread_annotations.h"
namespace webrtc {
+template <typename Closure>
+void SendTask(TaskQueueBase* task_queue, Closure&& task, rtc::Location loc) {
+ RTC_CHECK(!task_queue->IsCurrent())
+ << "Called SendTask to a queue from the same queue at " << loc.ToString();
+ rtc::Event event;
+ task_queue->PostTask(
+ ToQueuedTask(std::forward<Closure>(task), [&event] { event.Set(); }));
+ RTC_CHECK(event.Wait(/*give_up_after_ms=*/120'000, /*warn_after_ms=*/10'000))
+ << "Waited too long at " << loc.ToString();
+}
+
class RTC_LOCKABLE TaskQueueForTest : public rtc::TaskQueue {
public:
using rtc::TaskQueue::TaskQueue;
@@ -38,7 +51,7 @@
// task queue (i.e. the Run() method always returns |false|.).
template <class Closure>
void SendTask(Closure* task) {
- RTC_DCHECK(!IsCurrent());
+ RTC_CHECK(!IsCurrent());
rtc::Event event;
PostTask(ToQueuedTask(
[&task] { RTC_CHECK_EQ(false, static_cast<QueuedTask*>(task)->Run()); },
@@ -49,12 +62,8 @@
// A convenience, test-only method that blocks the current thread while
// a task executes on the task queue.
template <class Closure>
- void SendTask(Closure&& task) {
- RTC_DCHECK(!IsCurrent());
- rtc::Event event;
- PostTask(
- ToQueuedTask(std::forward<Closure>(task), [&event] { event.Set(); }));
- event.Wait(rtc::Event::kForever);
+ void SendTask(Closure&& task, rtc::Location loc) {
+ ::webrtc::SendTask(Get(), std::forward<Closure>(task), loc);
}
};
diff --git a/rtc_base/weak_ptr_unittest.cc b/rtc_base/weak_ptr_unittest.cc
index 9e22312..0757a1d 100644
--- a/rtc_base/weak_ptr_unittest.cc
+++ b/rtc_base/weak_ptr_unittest.cc
@@ -204,7 +204,7 @@
std::unique_ptr<T> NewObjectCreatedOnTaskQueue() {
std::unique_ptr<T> obj;
webrtc::TaskQueueForTest queue("NewObjectCreatedOnTaskQueue");
- queue.SendTask([&] { obj = std::make_unique<T>(); });
+ queue.SendTask([&] { obj = std::make_unique<T>(); }, RTC_FROM_HERE);
return obj;
}
@@ -226,11 +226,13 @@
// Create weak ptr on main thread
WeakPtr<Target> weak_ptr = target->factory.GetWeakPtr();
webrtc::TaskQueueForTest queue("queue");
- queue.SendTask([&] {
- // Dereference and invalide weak_ptr on another thread.
- EXPECT_EQ(weak_ptr.get(), target.get());
- target.reset();
- });
+ queue.SendTask(
+ [&] {
+ // Dereference and invalide weak_ptr on another thread.
+ EXPECT_EQ(weak_ptr.get(), target.get());
+ target.reset();
+ },
+ RTC_FROM_HERE);
}
} // namespace rtc