Index: webrtc/base/task_queue_unittest.cc |
diff --git a/webrtc/base/task_queue_unittest.cc b/webrtc/base/task_queue_unittest.cc |
index 74433b91440117250fc72cc959326db0afa2f935..4389d35f59258f36122d54b41b18fc715572ee20 100644 |
--- a/webrtc/base/task_queue_unittest.cc |
+++ b/webrtc/base/task_queue_unittest.cc |
@@ -37,22 +37,21 @@ TEST(TaskQueueTest, Construct) { |
TEST(TaskQueueTest, PostAndCheckCurrent) { |
static const char kQueueName[] = "PostAndCheckCurrent"; |
+ Event event(false, false); |
TaskQueue queue(kQueueName); |
// We're not running a task, so there shouldn't be a current queue. |
EXPECT_FALSE(queue.IsCurrent()); |
EXPECT_FALSE(TaskQueue::Current()); |
- Event event(false, false); |
queue.PostTask(Bind(&CheckCurrent, kQueueName, &event, &queue)); |
EXPECT_TRUE(event.Wait(1000)); |
} |
TEST(TaskQueueTest, PostCustomTask) { |
static const char kQueueName[] = "PostCustomImplementation"; |
- TaskQueue queue(kQueueName); |
- |
Event event(false, false); |
+ TaskQueue queue(kQueueName); |
class CustomTask : public QueuedTask { |
public: |
@@ -74,18 +73,18 @@ TEST(TaskQueueTest, PostCustomTask) { |
TEST(TaskQueueTest, PostLambda) { |
static const char kQueueName[] = "PostLambda"; |
+ Event event(false, false); |
TaskQueue queue(kQueueName); |
- Event event(false, false); |
queue.PostTask([&event]() { event.Set(); }); |
EXPECT_TRUE(event.Wait(1000)); |
} |
TEST(TaskQueueTest, PostFromQueue) { |
static const char kQueueName[] = "PostFromQueue"; |
+ Event event(false, false); |
TaskQueue queue(kQueueName); |
- Event event(false, false); |
queue.PostTask( |
[&event, &queue]() { queue.PostTask([&event]() { event.Set(); }); }); |
EXPECT_TRUE(event.Wait(1000)); |
@@ -93,9 +92,9 @@ TEST(TaskQueueTest, PostFromQueue) { |
TEST(TaskQueueTest, PostDelayed) { |
static const char kQueueName[] = "PostDelayed"; |
+ Event event(false, false); |
TaskQueue queue(kQueueName); |
- Event event(false, false); |
uint32_t start = Time(); |
queue.PostDelayedTask(Bind(&CheckCurrent, kQueueName, &event, &queue), 100); |
EXPECT_TRUE(event.Wait(1000)); |
@@ -135,10 +134,10 @@ TEST(TaskQueueTest, PostDelayedAfterDestruct) { |
TEST(TaskQueueTest, PostAndReply) { |
static const char kPostQueue[] = "PostQueue"; |
static const char kReplyQueue[] = "ReplyQueue"; |
+ Event event(false, false); |
TaskQueue post_queue(kPostQueue); |
TaskQueue reply_queue(kReplyQueue); |
- Event event(false, false); |
post_queue.PostTaskAndReply( |
Bind(&CheckCurrent, kPostQueue, nullptr, &post_queue), |
Bind(&CheckCurrent, kReplyQueue, &event, &reply_queue), &reply_queue); |
@@ -148,6 +147,7 @@ TEST(TaskQueueTest, PostAndReply) { |
TEST(TaskQueueTest, PostAndReuse) { |
static const char kPostQueue[] = "PostQueue"; |
static const char kReplyQueue[] = "ReplyQueue"; |
+ Event event(false, false); |
TaskQueue post_queue(kPostQueue); |
TaskQueue reply_queue(kReplyQueue); |
@@ -184,7 +184,6 @@ TEST(TaskQueueTest, PostAndReuse) { |
Event* const event_; |
}; |
- Event event(false, false); |
std::unique_ptr<QueuedTask> task( |
new ReusedTask(&call_count, &reply_queue, &event)); |
@@ -195,10 +194,10 @@ TEST(TaskQueueTest, PostAndReuse) { |
TEST(TaskQueueTest, PostAndReplyLambda) { |
static const char kPostQueue[] = "PostQueue"; |
static const char kReplyQueue[] = "ReplyQueue"; |
+ Event event(false, false); |
TaskQueue post_queue(kPostQueue); |
TaskQueue reply_queue(kReplyQueue); |
- Event event(false, false); |
bool my_flag = false; |
post_queue.PostTaskAndReply([&my_flag]() { my_flag = true; }, |
[&event]() { event.Set(); }, &reply_queue); |
@@ -206,6 +205,21 @@ TEST(TaskQueueTest, PostAndReplyLambda) { |
EXPECT_TRUE(my_flag); |
} |
+// This test covers a particular bug that we had in the libevent implementation |
+// where we could hit a deadlock while trying to post a reply task to a queue |
+// that was being deleted. The test isn't guaranteed to hit that case but it's |
+// written in a way that makes it likely and by running with --gtest_repeat=1000 |
+// the bug would occur. Alas, now it should be fixed. |
+TEST(TaskQueueTest, PostAndReplyDeadlock) { |
+ Event event(false, false); |
+ TaskQueue post_queue("PostQueue"); |
+ TaskQueue reply_queue("ReplyQueue"); |
+ |
+ post_queue.PostTaskAndReply([&event]() { event.Set(); }, []() {}, |
+ &reply_queue); |
+ EXPECT_TRUE(event.Wait(1000)); |
+} |
+ |
void TestPostTaskAndReply(TaskQueue* work_queue, |
const char* work_queue_name, |
Event* event) { |
@@ -220,10 +234,10 @@ void TestPostTaskAndReply(TaskQueue* work_queue, |
TEST(TaskQueueTest, PostAndReply2) { |
static const char kQueueName[] = "PostAndReply2"; |
static const char kWorkQueueName[] = "PostAndReply2_Worker"; |
+ Event event(false, false); |
TaskQueue queue(kQueueName); |
TaskQueue work_queue(kWorkQueueName); |
- Event event(false, false); |
queue.PostTask( |
Bind(&TestPostTaskAndReply, &work_queue, kWorkQueueName, &event)); |
EXPECT_TRUE(event.Wait(1000)); |