diff options
author | Hansong Zhang <hsz@google.com> | 2018-08-14 14:29:23 -0700 |
---|---|---|
committer | Hansong Zhang <hsz@google.com> | 2018-09-13 13:37:42 -0700 |
commit | f05a8c49a889b5a83841e4bf55dd3cf5a1afa8d0 (patch) | |
tree | 5bc7d1343c049f61e0bafec0158a3f336dc2b137 /system/common/message_loop_thread_unittest.cc | |
parent | 76250727b2fa2a5a6364edcb20e4d379c82090a4 (diff) |
Add Timer as an alternative to osi alarm
* Add a private method MessageLoopThread.DoInThreadDelayed to post a
delayed task in message loop, as an alternative approach to osi alarm
clock
* Add a unit test for MessageLoopThread to check ShutDown() waits until
current task finishes
* Add Timer using MessageLoopThread.DoInThreadDelayed
* Timer provides similar API as osi alarm, and uses same OS clock (boot
timer) as alarm
* Add benchmark and unit tests to ensure the performance is comparable
to the existing osi alarm
Test: Run unit test and benchmark test
./test/run_unit_tests.sh bluetooth_test_common
./test/run_benchmarks.sh bluetooth_benchmark_timer_performance
--benchmark_repetitions=10 --benchmark_report_aggregates_only=true
Bug: 110303473
Change-Id: I6f2e7ae2f80f9889fc5fe3c8cd6b9b2670938b46
Diffstat (limited to 'system/common/message_loop_thread_unittest.cc')
-rw-r--r-- | system/common/message_loop_thread_unittest.cc | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/system/common/message_loop_thread_unittest.cc b/system/common/message_loop_thread_unittest.cc index 0924ebe14e..67a0cfd37d 100644 --- a/system/common/message_loop_thread_unittest.cc +++ b/system/common/message_loop_thread_unittest.cc @@ -61,6 +61,11 @@ class MessageLoopThreadTest : public ::testing::Test { execution_promise.set_value(); } + void SleepAndGetName(std::promise<std::string> name_promise, int sleep_ms) { + std::this_thread::sleep_for(std::chrono::milliseconds(sleep_ms)); + GetName(std::move(name_promise)); + } + protected: static bool CanSetCurrentThreadPriority() { struct __user_cap_header_struct linux_user_header = { @@ -78,6 +83,16 @@ class MessageLoopThreadTest : public ::testing::Test { } }; +TEST_F(MessageLoopThreadTest, get_weak_ptr) { + base::WeakPtr<MessageLoopThread> message_loop_thread_ptr; + { + MessageLoopThread message_loop_thread("test_thread"); + message_loop_thread_ptr = message_loop_thread.GetWeakPtr(); + ASSERT_NE(message_loop_thread_ptr, nullptr); + } + ASSERT_EQ(message_loop_thread_ptr, nullptr); +} + TEST_F(MessageLoopThreadTest, test_running_thread) { MessageLoopThread message_loop_thread("test_thread"); message_loop_thread.StartUp(); @@ -248,3 +263,20 @@ TEST_F(MessageLoopThreadTest, test_to_string_method) { ASSERT_STREQ(thread_string_after_shutdown.c_str(), thread_string_before_start.c_str()); } + +// Verify the message loop thread will shutdown after callback finishes +TEST_F(MessageLoopThreadTest, shut_down_while_in_callback) { + std::string name = "test_thread"; + MessageLoopThread message_loop_thread(name); + message_loop_thread.StartUp(); + std::promise<std::string> name_promise; + std::future<std::string> name_future = name_promise.get_future(); + uint32_t delay_ms = 5; + message_loop_thread.DoInThread( + FROM_HERE, base::BindOnce(&MessageLoopThreadTest::SleepAndGetName, + base::Unretained(this), std::move(name_promise), + delay_ms)); + message_loop_thread.ShutDown(); + std::string my_name = name_future.get(); + ASSERT_EQ(name, my_name); +} |