diff options
author | Hansong Zhang <hsz@google.com> | 2018-09-29 14:23:31 -0700 |
---|---|---|
committer | Hansong Zhang <hsz@google.com> | 2018-10-03 16:04:55 -0700 |
commit | 33b5f550fcf2037b80ea880afbd948152fc4f4d9 (patch) | |
tree | 23013e4e906e9ac9222d1537f04ce1b2d053e934 /system/common/message_loop_thread_unittest.cc | |
parent | d1c2f786c4a50b42602ada432ab6fe277683ae73 (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.cc | 50 |
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(); +} |