From 94371fd012c661859326b73246b781ae872e0871 Mon Sep 17 00:00:00 2001 From: Tao Bao Date: Wed, 6 Jun 2018 07:38:54 -0700 Subject: ui: join only if joinable. The threads in RecoveryUI only get initialized if their Init()s finish successfully. Test: recovery_unit_test on marlin. Change-Id: Ic4b62300a3cbd47887d9f4a90dc26f8a7deab616 --- screen_ui.cpp | 4 +++- tests/unit/screen_ui_test.cpp | 5 +++++ ui.cpp | 4 +++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/screen_ui.cpp b/screen_ui.cpp index b9aba807d..b4ef054ce 100644 --- a/screen_ui.cpp +++ b/screen_ui.cpp @@ -173,7 +173,9 @@ ScreenRecoveryUI::ScreenRecoveryUI(bool scrollable_menu) ScreenRecoveryUI::~ScreenRecoveryUI() { progress_thread_stopped_ = true; - progress_thread_.join(); + if (progress_thread_.joinable()) { + progress_thread_.join(); + } } GRSurface* ScreenRecoveryUI::GetCurrentFrame() const { diff --git a/tests/unit/screen_ui_test.cpp b/tests/unit/screen_ui_test.cpp index 2179b729f..a3dd2add9 100644 --- a/tests/unit/screen_ui_test.cpp +++ b/tests/unit/screen_ui_test.cpp @@ -293,6 +293,11 @@ TEST_F(ScreenRecoveryUITest, Init) { ASSERT_FALSE(ui_->WasTextEverVisible()); } +TEST_F(ScreenRecoveryUITest, dtor_NotCallingInit) { + ui_.reset(); + ASSERT_FALSE(ui_); +} + TEST_F(ScreenRecoveryUITest, ShowText) { ASSERT_TRUE(ui_->Init(kTestLocale)); ASSERT_FALSE(ui_->IsTextVisible()); diff --git a/ui.cpp b/ui.cpp index 51d7f129c..6c91d01b8 100644 --- a/ui.cpp +++ b/ui.cpp @@ -78,7 +78,9 @@ RecoveryUI::RecoveryUI() RecoveryUI::~RecoveryUI() { ev_exit(); input_thread_stopped_ = true; - input_thread_.join(); + if (input_thread_.joinable()) { + input_thread_.join(); + } } void RecoveryUI::OnKeyDetected(int key_code) { -- cgit v1.2.3