summaryrefslogtreecommitdiff
path: root/system/common/message_loop_thread_unittest.cc
diff options
context:
space:
mode:
authorHansong Zhang <hsz@google.com>2018-09-29 14:23:31 -0700
committerHansong Zhang <hsz@google.com>2018-10-03 16:04:55 -0700
commit33b5f550fcf2037b80ea880afbd948152fc4f4d9 (patch)
tree23013e4e906e9ac9222d1537f04ce1b2d053e934 /system/common/message_loop_thread_unittest.cc
parentd1c2f786c4a50b42602ada432ab6fe277683ae73 (diff)
MessageLoopThread: Release lock during blocked StartUp/ShutDown
During StartUp/ShutDown(), if another running task in message loop needs api_lock, then it will deadlock. Release api_lock in StartUp and ShutDown when current thread is blocked by another task Bug: 116081383 Test: run unit test Change-Id: Ic34406d0cfc6364ac965c4f1aa917a5ccaf6b373
Diffstat (limited to 'system/common/message_loop_thread_unittest.cc')
-rw-r--r--system/common/message_loop_thread_unittest.cc50
1 files changed, 50 insertions, 0 deletions
diff --git a/system/common/message_loop_thread_unittest.cc b/system/common/message_loop_thread_unittest.cc
index 67a0cfd37d..e77a44ce19 100644
--- a/system/common/message_loop_thread_unittest.cc
+++ b/system/common/message_loop_thread_unittest.cc
@@ -280,3 +280,53 @@ TEST_F(MessageLoopThreadTest, shut_down_while_in_callback) {
std::string my_name = name_future.get();
ASSERT_EQ(name, my_name);
}
+
+// Verify the message loop thread will shutdown after callback finishes
+TEST_F(MessageLoopThreadTest, shut_down_while_in_callback_check_lock) {
+ std::string name = "test_thread";
+ MessageLoopThread message_loop_thread(name);
+ message_loop_thread.StartUp();
+ message_loop_thread.DoInThread(
+ FROM_HERE,
+ base::BindOnce([](MessageLoopThread* thread) { thread->IsRunning(); },
+ &message_loop_thread));
+ message_loop_thread.ShutDown();
+}
+
+// Verify multiple threads try shutdown, no deadlock/crash
+TEST_F(MessageLoopThreadTest, shut_down_multi_thread) {
+ std::string name = "test_thread";
+ MessageLoopThread message_loop_thread(name);
+ message_loop_thread.StartUp();
+ auto thread = std::thread(&MessageLoopThread::ShutDown, &message_loop_thread);
+ message_loop_thread.ShutDown();
+ thread.join();
+}
+
+// Verify multiple threads try startup, no deadlock/crash
+TEST_F(MessageLoopThreadTest, start_up_multi_thread) {
+ std::string name = "test_thread";
+ MessageLoopThread message_loop_thread(name);
+ message_loop_thread.StartUp();
+ auto thread = std::thread(&MessageLoopThread::StartUp, &message_loop_thread);
+ thread.join();
+}
+
+// Verify multiple threads try startup/shutdown, no deadlock/crash
+TEST_F(MessageLoopThreadTest, start_up_shut_down_multi_thread) {
+ std::string name = "test_thread";
+ MessageLoopThread message_loop_thread(name);
+ message_loop_thread.StartUp();
+ auto thread = std::thread(&MessageLoopThread::ShutDown, &message_loop_thread);
+ thread.join();
+}
+
+// Verify multiple threads try shutdown/startup, no deadlock/crash
+TEST_F(MessageLoopThreadTest, shut_down_start_up_multi_thread) {
+ std::string name = "test_thread";
+ MessageLoopThread message_loop_thread(name);
+ message_loop_thread.StartUp();
+ message_loop_thread.ShutDown();
+ auto thread = std::thread(&MessageLoopThread::StartUp, &message_loop_thread);
+ thread.join();
+}