From 36e97b5e10aea613f809e0442470888edc6dd1c6 Mon Sep 17 00:00:00 2001 From: Eunki Hong Date: Mon, 25 Sep 2023 18:56:35 +0900 Subject: [PATCH] Add API for check core thread + shutting down Add some API to check whether the core is shutting down or not, So out of dali-core side can also know it. Also, Make combined helper API to check whether core installed before or not. It will be useful when we check worker thread access into UI classes of dali. Change-Id: I2d8d3120b4fc959056f4644846d3d14a3b89bcc6 Signed-off-by: Eunki Hong --- automated-tests/src/dali/utc-Dali-Stage.cpp | 93 +++++++++++++++++++++++++++++ dali/devel-api/common/stage.cpp | 13 +++- dali/devel-api/common/stage.h | 17 +++++- dali/internal/event/common/stage-impl.cpp | 5 ++ dali/internal/event/common/stage-impl.h | 5 ++ 5 files changed, 131 insertions(+), 2 deletions(-) diff --git a/automated-tests/src/dali/utc-Dali-Stage.cpp b/automated-tests/src/dali/utc-Dali-Stage.cpp index b9b8050..d3866df 100644 --- a/automated-tests/src/dali/utc-Dali-Stage.cpp +++ b/automated-tests/src/dali/utc-Dali-Stage.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -24,6 +25,7 @@ #include #include #include +#include #include @@ -317,6 +319,44 @@ void GenerateTouch(TestApplication& application, PointState::Type state, const V application.ProcessEvent(touchEvent); } +volatile bool gRunThreadEntryFunc = false; + +class TestThread : public Dali::Thread +{ +public: + TestThread() + : mCallback(nullptr) + { + } + TestThread(Dali::CallbackBase* callback) + : mCallback(callback) + { + } + + ~TestThread() + { + delete mCallback; + } + + virtual void Run() + { + if(mCallback) + { + Dali::CallbackBase::Execute(*mCallback); + } + + gRunThreadEntryFunc = true; + } + +private: + Dali::CallbackBase* mCallback{nullptr}; +}; + +void CoreThreadCheck() +{ + DALI_TEST_CHECK(!Stage::IsCoreThread()); +} + } // unnamed namespace int UtcDaliStageDefaultConstructorP(void) @@ -387,6 +427,59 @@ int UtcDaliStageIsInstalledN(void) END_TEST; } +int UtcDaliStageIsShuttingDown(void) +{ + DALI_TEST_CHECK(!Stage::IsShuttingDown()); + + { + TestApplication application; + + DALI_TEST_CHECK(!Stage::IsShuttingDown()); + + Stage::GetCurrent(); + + DALI_TEST_CHECK(!Stage::IsShuttingDown()); + } + + // Core destroyed + DALI_TEST_CHECK(Stage::IsShuttingDown()); + END_TEST; +} + +int UtcDaliStageIsCoreThread(void) +{ + DALI_TEST_CHECK(!Stage::IsCoreThread()); + + { + TestApplication application; + + DALI_TEST_CHECK(Stage::IsCoreThread()); + + Stage::GetCurrent(); + + DALI_TEST_CHECK(Stage::IsCoreThread()); + + TestThread thread(Dali::MakeCallback(&CoreThreadCheck)); + + gRunThreadEntryFunc = false; + + thread.Start(); + // wait till the thread is terminated + while(!gRunThreadEntryFunc) + { + usleep(1); // 1 microsecond + } + DALI_TEST_EQUALS(true, gRunThreadEntryFunc, TEST_LOCATION); + + thread.Join(); + } + + // Core destroyed + DALI_TEST_CHECK(Stage::IsCoreThread()); + END_TEST; +} + + int UtcDaliStageCopyConstructorP(void) { TestApplication application; diff --git a/dali/devel-api/common/stage.cpp b/dali/devel-api/common/stage.cpp index 02f361f..7a594d2 100644 --- a/dali/devel-api/common/stage.cpp +++ b/dali/devel-api/common/stage.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2023 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,6 +59,17 @@ bool Stage::IsInstalled() return Internal::Stage::IsInstalled(); } +bool Stage::IsShuttingDown() +{ + return Internal::Stage::IsShuttingDown(); +} + +bool Stage::IsCoreThread() +{ + return IsInstalled() || ///< Check if Core is installed now, + IsShuttingDown(); ///< or Core is shutting down now. +} + void Stage::Add(Actor& actor) { GetImplementation(*this).Add(GetImplementation(actor)); diff --git a/dali/devel-api/common/stage.h b/dali/devel-api/common/stage.h index cf271cf..6597f0b 100644 --- a/dali/devel-api/common/stage.h +++ b/dali/devel-api/common/stage.h @@ -2,7 +2,7 @@ #define DALI_STAGE_H /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2023 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -114,6 +114,21 @@ public: static bool IsInstalled(); /** + * @brief Queries whether the Stage shutting down now; this should only return false during or before destruction of Dali core. + * + * @return True when Dali core destructor called. + */ + static bool IsShuttingDown(); + + /** + * @brief Queries whether we installed Dali core before, or not. + * It will be useful whether you want to check we are on valid core ui thread or not, after Core initalized ensured. + * + * @return True when this API called at core ui thread. False otherwise. + */ + static bool IsCoreThread(); + + /** * @brief Destructor. * * This is non-virtual since derived Handle types must not contain data or virtual methods. diff --git a/dali/internal/event/common/stage-impl.cpp b/dali/internal/event/common/stage-impl.cpp index d2309d6..ae0b7d2 100644 --- a/dali/internal/event/common/stage-impl.cpp +++ b/dali/internal/event/common/stage-impl.cpp @@ -112,6 +112,11 @@ bool Stage::IsInstalled() return ThreadLocalStorage::Created(); } +bool Stage::IsShuttingDown() +{ + return ThreadLocalStorage::IsShuttingDown(); +} + ObjectRegistry& Stage::GetObjectRegistry() { return ThreadLocalStorage::Get().GetObjectRegistry(); diff --git a/dali/internal/event/common/stage-impl.h b/dali/internal/event/common/stage-impl.h index 8711fcf..8b4abed 100644 --- a/dali/internal/event/common/stage-impl.h +++ b/dali/internal/event/common/stage-impl.h @@ -90,6 +90,11 @@ public: static bool IsInstalled(); /** + * @copydoc Dali::Stage::IsShuttingDown(). + */ + static bool IsShuttingDown(); + + /** * @copydoc Dali::Stage::GetObjectRegistry() */ ObjectRegistry& GetObjectRegistry(); -- 2.7.4