[Tizen] Change deletion order of FrameworkFactory 36/295636/3 accepted/tizen_unified_dev accepted/tizen/unified/dev/20230726.115635 accepted/tizen/unified/riscv/20230725.071330 accepted/tizen/unified/riscv/20231124.082818
authorHeeyong Song <heeyong.song@samsung.com>
Wed, 12 Jul 2023 02:17:58 +0000 (11:17 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Wed, 12 Jul 2023 06:24:04 +0000 (15:24 +0900)
Ensure to delete FrameworkFactory after WindowSystem::Shutdown in the Application destructor

Change-Id: Ica037f38c15cdca60b57c3467b89f6129f4889ab

20 files changed:
automated-tests/src/dali-adaptor/dali-test-suite-utils/adaptor-test-application.h
dali/internal/adaptor/android/framework-factory-android.cpp
dali/internal/adaptor/android/framework-factory-android.h
dali/internal/adaptor/androidjni/framework-factory-androidjni.cpp
dali/internal/adaptor/androidjni/framework-factory-androidjni.h
dali/internal/adaptor/common/application-impl.cpp
dali/internal/adaptor/common/application-impl.h
dali/internal/adaptor/common/framework-factory.h
dali/internal/adaptor/glib/framework-factory-glib.cpp
dali/internal/adaptor/glib/framework-factory-glib.h
dali/internal/adaptor/libuv/framework-factory-libuv.cpp
dali/internal/adaptor/libuv/framework-factory-libuv.h
dali/internal/adaptor/macos/framework-factory-mac.h
dali/internal/adaptor/macos/framework-factory-mac.mm
dali/internal/adaptor/tizen-wayland/framework-factory-tizen.cpp
dali/internal/adaptor/tizen-wayland/framework-factory-tizen.h
dali/internal/adaptor/ubuntu/framework-factory-ubuntu.cpp
dali/internal/adaptor/ubuntu/framework-factory-ubuntu.h
dali/internal/adaptor/windows/framework-factory-win.cpp
dali/internal/adaptor/windows/framework-factory-win.h

index 6d23c2f..386b946 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_ADAPTOR_TEST_APPLICATION_H
 
 /*
- * Copyright (c) 2019 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.
@@ -19,6 +19,7 @@
  */
 
 // INTERNAL INCLUDES
+#include <dali/internal/adaptor/common/framework-factory.h>
 #include "adaptor-test-adaptor-impl.h"
 #include "test-application.h"
 
@@ -37,11 +38,14 @@ public:
   : TestApplication(surfaceWidth, surfaceHeight, horizontalDpi, verticalDpi)
   {
     Internal::Adaptor::Adaptor::SetAvailable();
+    mFrameworkFactory = std::unique_ptr<Internal::Adaptor::FrameworkFactory>(Dali::Internal::Adaptor::CreateFrameworkFactory());
   }
 
   ~AdaptorTestApplication()
   {
   }
+
+  std::unique_ptr<Internal::Adaptor::FrameworkFactory> mFrameworkFactory;
 };
 
 } // namespace Dali
index 29acd0b..70b74f8 100644 (file)
@@ -28,20 +28,31 @@ namespace Internal
 {
 namespace Adaptor
 {
+FrameworkFactory* gFrameworkFactory = nullptr;
+
+FrameworkFactoryAndroid::FrameworkFactoryAndroid()
+{
+  gFrameworkFactory = this;
+}
+
+FrameworkFactoryAndroid::~FrameworkFactoryAndroid()
+{
+  gFrameworkFactory = nullptr;
+}
+
 std::unique_ptr<Framework> FrameworkFactoryAndroid::CreateFramework(FrameworkBackend backend, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread)
 {
   return Utils::MakeUnique<FrameworkAndroid>(observer, taskObserver, argc, argv, type, useUiThread);
 }
 
-FrameworkFactory* GetFrameworkFactory()
+FrameworkFactory* CreateFrameworkFactory()
 {
-  static std::unique_ptr<FrameworkFactory> frameworkFactory = nullptr;
+  return (new FrameworkFactoryAndroid());
+}
 
-  if(!frameworkFactory)
-  {
-    frameworkFactory = Utils::MakeUnique<FrameworkFactoryAndroid>();
-  }
-  return frameworkFactory.get();
+FrameworkFactory* GetFrameworkFactory()
+{
+  return gFrameworkFactory;
 }
 
 } // namespace Adaptor
index 4b3b9e6..49e2965 100644 (file)
@@ -29,6 +29,9 @@ namespace Adaptor
 class FrameworkFactoryAndroid : public FrameworkFactory
 {
 public:
+  FrameworkFactoryAndroid();
+  ~FrameworkFactoryAndroid();
+
   std::unique_ptr<Framework> CreateFramework(FrameworkBackend frameworkType, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread) override;
 };
 
index d4dd93c..4d7849d 100644 (file)
@@ -28,20 +28,31 @@ namespace Internal
 {
 namespace Adaptor
 {
+FrameworkFactory* gFrameworkFactory = nullptr;
+
+FrameworkFactoryAndroidJni::FrameworkFactoryAndroidJni()
+{
+  gFrameworkFactory = this;
+}
+
+FrameworkFactoryAndroidJni::~FrameworkFactoryAndroidJni()
+{
+  gFrameworkFactory = nullptr;
+}
+
 std::unique_ptr<Framework> FrameworkFactoryAndroidJni::CreateFramework(FrameworkBackend backend, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread)
 {
   return Utils::MakeUnique<FrameworkAndroidJni>(observer, taskObserver, argc, argv, type, useUiThread);
 }
 
-FrameworkFactory* GetFrameworkFactory()
+FrameworkFactory* CreateFrameworkFactory()
 {
-  static std::unique_ptr<FrameworkFactory> frameworkFactory = nullptr;
+  return (new FrameworkFactoryAndroidJni());
+}
 
-  if(!frameworkFactory)
-  {
-    frameworkFactory = Utils::MakeUnique<FrameworkFactoryAndroidJni>();
-  }
-  return frameworkFactory.get();
+FrameworkFactory* GetFrameworkFactory()
+{
+  return gFrameworkFactory;
 }
 
 } // namespace Adaptor
index 782ed97..a3ead02 100644 (file)
@@ -29,6 +29,9 @@ namespace Adaptor
 class FrameworkFactoryAndroidJni : public FrameworkFactory
 {
 public:
+  FrameworkFactoryAndroidJni();
+  ~FrameworkFactoryAndroidJni();
+
   std::unique_ptr<Framework> CreateFramework(FrameworkBackend frameworkType, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread) override;
 };
 
index 9bad3be..13a5fe6 100644 (file)
@@ -81,11 +81,11 @@ void Application::PreInitialize(int* argc, char** argv[])
 {
   if(!gPreInitializedApplication)
   {
-    char* retEnv = std::getenv("TIZEN_UI_THREAD");
-    bool isUseUIThread = false;
+    char* retEnv        = std::getenv("TIZEN_UI_THREAD");
+    bool  isUseUIThread = false;
     if(retEnv)
     {
-      std::string uiThreadEnv = retEnv;
+      std::string uiThreadEnv   = retEnv;
       std::string enabledString = "true";
       if(uiThreadEnv == enabledString)
       {
@@ -101,15 +101,13 @@ void Application::PreInitialize(int* argc, char** argv[])
     {
       DALI_LOG_RELEASE_INFO("PRE_INITIALIZED with UI Threading");
       gPreInitializedApplication->mUIThreadLoader = new UIThreadLoader(argc, argv);
-      gPreInitializedApplication->mUIThreadLoader->Run([&](){gPreInitializedApplication->CreateWindow();});
+      gPreInitializedApplication->mUIThreadLoader->Run([&]() { gPreInitializedApplication->CreateWindow(); });
     }
     else
     {
       DALI_LOG_RELEASE_INFO("Only PRE_INITIALIZED");
       gPreInitializedApplication->CreateWindow(); // Only create window
     }
-
-
   }
 }
 
@@ -123,6 +121,7 @@ Application::Application(int* argc, char** argv[], const std::string& stylesheet
   mLanguageChangedSignal(),
   mRegionChangedSignal(),
   mFramework(nullptr),
+  mFrameworkFactory(nullptr),
   mCommandLineOptions(nullptr),
   mAdaptorBuilder(nullptr),
   mAdaptor(nullptr),
@@ -152,7 +151,9 @@ Application::Application(int* argc, char** argv[], const std::string& stylesheet
   }
 
   mCommandLineOptions = new CommandLineOptions(argc, argv);
-  mFramework          = Dali::Internal::Adaptor::GetFrameworkFactory()->CreateFramework(FrameworkBackend::DEFAULT, *this, *this, argc, argv, applicationType, mUseUiThread);
+
+  mFrameworkFactory = std::unique_ptr<FrameworkFactory>(Dali::Internal::Adaptor::CreateFrameworkFactory());
+  mFramework        = mFrameworkFactory->CreateFramework(FrameworkBackend::DEFAULT, *this, *this, argc, argv, applicationType, mUseUiThread);
 
   mUseRemoteSurface = (applicationType == Framework::WATCH);
 }
index 914664a..26d478f 100644 (file)
@@ -54,6 +54,7 @@ enum State
 } // namespace Launchpad
 
 class CommandLineOptions;
+class FrameworkFactory;
 
 typedef Dali::Rect<int> PositionSize;
 
@@ -520,7 +521,8 @@ private:
   LowMemorySignalType                mTaskLowMemorySignal;
   DeviceOrientationChangedSignalType mTaskDeviceOrientationChangedSignal;
 
-  std::unique_ptr<Framework> mFramework;
+  std::unique_ptr<Framework>        mFramework;
+  std::unique_ptr<FrameworkFactory> mFrameworkFactory;
 
   CommandLineOptions* mCommandLineOptions;
 
@@ -544,7 +546,7 @@ private:
 
   SlotDelegate<Application> mSlotDelegate;
 
-  UIThreadLoader* mUIThreadLoader;
+  UIThreadLoader*       mUIThreadLoader;
   static ApplicationPtr gPreInitializedApplication;
 };
 
index 885cdb1..9b67976 100644 (file)
@@ -46,7 +46,15 @@ public:
   }
 };
 
-extern FrameworkFactory* GetFrameworkFactory();
+/**
+ * @brief Creates a framework factory
+ */
+FrameworkFactory* CreateFrameworkFactory();
+
+/**
+ * @brief Gets a framework factory
+ */
+FrameworkFactory* GetFrameworkFactory();
 
 } // namespace Adaptor
 } // namespace Internal
index baf5954..aa92665 100644 (file)
@@ -28,20 +28,31 @@ namespace Internal
 {
 namespace Adaptor
 {
+FrameworkFactory* gFrameworkFactory = nullptr;
+
+FrameworkFactoryGlib::FrameworkFactoryGlib()
+{
+  gFrameworkFactory = this;
+}
+
+FrameworkFactoryGlib::~FrameworkFactoryGlib()
+{
+  gFrameworkFactory = nullptr;
+}
+
 std::unique_ptr<Framework> FrameworkFactoryGlib::CreateFramework(FrameworkBackend backend, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread)
 {
   return Utils::MakeUnique<FrameworkGlib>(observer, taskObserver, argc, argv, type, useUiThread);
 }
 
-FrameworkFactory* GetFrameworkFactory()
+FrameworkFactory* CreateFrameworkFactory()
 {
-  static std::unique_ptr<FrameworkFactory> frameworkFactory = nullptr;
+  return (new FrameworkFactoryGlib());
+}
 
-  if(!frameworkFactory)
-  {
-    frameworkFactory = Utils::MakeUnique<FrameworkFactoryGlib>();
-  }
-  return frameworkFactory.get();
+FrameworkFactory* GetFrameworkFactory()
+{
+  return gFrameworkFactory;
 }
 
 } // namespace Adaptor
index 5969b3b..f38877b 100644 (file)
@@ -29,6 +29,9 @@ namespace Adaptor
 class FrameworkFactoryGlib : public FrameworkFactory
 {
 public:
+  FrameworkFactoryGlib();
+  ~FrameworkFactoryGlib();
+
   std::unique_ptr<Framework> CreateFramework(FrameworkBackend frameworkType, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread) override;
 };
 
index b608d45..8b25184 100644 (file)
@@ -28,20 +28,31 @@ namespace Internal
 {
 namespace Adaptor
 {
+FrameworkFactory* gFrameworkFactory = nullptr;
+
+FrameworkFactoryLibuv::FrameworkFactoryLibuv()
+{
+  gFrameworkFactory = this;
+}
+
+FrameworkFactoryLibuv::~FrameworkFactoryLibuv()
+{
+  gFrameworkFactory = nullptr;
+}
+
 std::unique_ptr<Framework> FrameworkFactoryLibuv::CreateFramework(FrameworkBackend backend, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread)
 {
   return Utils::MakeUnique<FrameworkLibuv>(observer, taskObserver, argc, argv, type, useUiThread);
 }
 
-FrameworkFactory* GetFrameworkFactory()
+FrameworkFactory* CreateFrameworkFactory()
 {
-  static std::unique_ptr<FrameworkFactory> frameworkFactory = nullptr;
+  return (new FrameworkFactoryLibuv());
+}
 
-  if(!frameworkFactory)
-  {
-    frameworkFactory = Utils::MakeUnique<FrameworkFactoryLibuv>();
-  }
-  return frameworkFactory.get();
+FrameworkFactory* GetFrameworkFactory()
+{
+  return gFrameworkFactory;
 }
 
 } // namespace Adaptor
index 2b4d0ae..2205761 100644 (file)
@@ -29,6 +29,9 @@ namespace Adaptor
 class FrameworkFactoryLibuv : public FrameworkFactory
 {
 public:
+  FrameworkFactoryLibuv();
+  ~FrameworkFactoryLibuv();
+
   std::unique_ptr<Framework> CreateFramework(FrameworkBackend frameworkType, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread) override;
 };
 
index 1778d70..44663c3 100644 (file)
@@ -29,6 +29,9 @@ namespace Adaptor
 class FrameworkFactoryMac : public FrameworkFactory
 {
 public:
+  FrameworkFactoryMac();
+  ~FrameworkFactoryMac();
+
   std::unique_ptr<Framework> CreateFramework(FrameworkBackend frameworkType, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread) override;
 };
 
index 8deb80e..9d8afa8 100644 (file)
@@ -28,20 +28,31 @@ namespace Internal
 {
 namespace Adaptor
 {
+FrameworkFactory* gFrameworkFactory = nullptr;
+
+FrameworkFactoryMac::FrameworkFactoryMac()
+{
+  gFrameworkFactory = this;
+}
+
+FrameworkFactoryMac::~FrameworkFactoryMac()
+{
+  gFrameworkFactory = nullptr;
+}
+
 std::unique_ptr<Framework> FrameworkFactoryMac::CreateFramework(FrameworkBackend backend, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread)
 {
   return Utils::MakeUnique<FrameworkMac>(observer, taskObserver, argc, argv, type, useUiThread);
 }
 
-FrameworkFactory* GetFrameworkFactory()
+FrameworkFactory* CreateFrameworkFactory()
 {
-  static std::unique_ptr<FrameworkFactory> frameworkFactory = nullptr;
+  return (new FrameworkFactoryMac());
+}
 
-  if(!frameworkFactory)
-  {
-    frameworkFactory = Utils::MakeUnique<FrameworkFactoryMac>();
-  }
-  return frameworkFactory.get();
+FrameworkFactory* GetFrameworkFactory()
+{
+  return gFrameworkFactory;
 }
 
 } // namespace Adaptor
index d466db1..fc84ee3 100644 (file)
@@ -29,6 +29,18 @@ namespace Internal
 {
 namespace Adaptor
 {
+FrameworkFactory* gFrameworkFactory = nullptr;
+
+FrameworkFactoryTizen::FrameworkFactoryTizen()
+{
+  gFrameworkFactory = this;
+}
+
+FrameworkFactoryTizen::~FrameworkFactoryTizen()
+{
+  gFrameworkFactory = nullptr;
+}
+
 std::unique_ptr<Framework> FrameworkFactoryTizen::CreateFramework(FrameworkBackend backend, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread)
 {
   mBackend = backend;
@@ -42,15 +54,14 @@ std::unique_ptr<Framework> FrameworkFactoryTizen::CreateFramework(FrameworkBacke
   }
 }
 
-FrameworkFactory* GetFrameworkFactory()
+FrameworkFactory* CreateFrameworkFactory()
 {
-  static std::unique_ptr<FrameworkFactory> frameworkFactory = nullptr;
+  return (new FrameworkFactoryTizen());
+}
 
-  if(!frameworkFactory)
-  {
-    frameworkFactory = Utils::MakeUnique<FrameworkFactoryTizen>();
-  }
-  return frameworkFactory.get();
+FrameworkFactory* GetFrameworkFactory()
+{
+  return gFrameworkFactory;
 }
 
 } // namespace Adaptor
index 68879fb..a337b3b 100644 (file)
@@ -29,6 +29,9 @@ namespace Adaptor
 class FrameworkFactoryTizen : public FrameworkFactory
 {
 public:
+  FrameworkFactoryTizen();
+  ~FrameworkFactoryTizen();
+
   std::unique_ptr<Framework> CreateFramework(FrameworkBackend frameworkType, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread) override;
 
   FrameworkBackend GetFrameworkBackend() const override
@@ -37,7 +40,7 @@ public:
   }
 
 private:
-  FrameworkBackend mBackend;
+  FrameworkBackend mBackend{FrameworkBackend::DEFAULT};
 };
 
 } // namespace Adaptor
index ae2c084..be754e9 100644 (file)
@@ -28,20 +28,31 @@ namespace Internal
 {
 namespace Adaptor
 {
+FrameworkFactory* gFrameworkFactory = nullptr;
+
+FrameworkFactoryUbuntu::FrameworkFactoryUbuntu()
+{
+  gFrameworkFactory = this;
+}
+
+FrameworkFactoryUbuntu::~FrameworkFactoryUbuntu()
+{
+  gFrameworkFactory = nullptr;
+}
+
 std::unique_ptr<Framework> FrameworkFactoryUbuntu::CreateFramework(FrameworkBackend backend, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread)
 {
   return Utils::MakeUnique<FrameworkUbuntu>(observer, taskObserver, argc, argv, type, useUiThread);
 }
 
-FrameworkFactory* GetFrameworkFactory()
+FrameworkFactory* CreateFrameworkFactory()
 {
-  static std::unique_ptr<FrameworkFactory> frameworkFactory = nullptr;
+  return (new FrameworkFactoryUbuntu());
+}
 
-  if(!frameworkFactory)
-  {
-    frameworkFactory = Utils::MakeUnique<FrameworkFactoryUbuntu>();
-  }
-  return frameworkFactory.get();
+FrameworkFactory* GetFrameworkFactory()
+{
+  return gFrameworkFactory;
 }
 
 } // namespace Adaptor
index f7d6b2a..61cf122 100644 (file)
@@ -29,6 +29,9 @@ namespace Adaptor
 class FrameworkFactoryUbuntu : public FrameworkFactory
 {
 public:
+  FrameworkFactoryUbuntu();
+  ~FrameworkFactoryUbuntu();
+
   std::unique_ptr<Framework> CreateFramework(FrameworkBackend frameworkType, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread) override;
 };
 
index e94a561..16c595b 100644 (file)
@@ -28,20 +28,31 @@ namespace Internal
 {
 namespace Adaptor
 {
+FrameworkFactory* gFrameworkFactory = nullptr;
+
+FrameworkFactoryWin::FrameworkFactoryWin()
+{
+  gFrameworkFactory = this;
+}
+
+FrameworkFactoryWin::~FrameworkFactoryWin()
+{
+  gFrameworkFactory = nullptr;
+}
+
 std::unique_ptr<Framework> FrameworkFactoryWin::CreateFramework(FrameworkBackend backend, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread)
 {
   return Utils::MakeUnique<FrameworkWin>(observer, taskObserver, argc, argv, type, useUiThread);
 }
 
-FrameworkFactory* GetFrameworkFactory()
+FrameworkFactory* CreateFrameworkFactory()
 {
-  static std::unique_ptr<FrameworkFactory> frameworkFactory = nullptr;
+  return (new FrameworkFactoryWin());
+}
 
-  if(!frameworkFactory)
-  {
-    frameworkFactory = Utils::MakeUnique<FrameworkFactoryWin>();
-  }
-  return frameworkFactory.get();
+FrameworkFactory* GetFrameworkFactory()
+{
+  return gFrameworkFactory;
 }
 
 } // namespace Adaptor
index 039e3fa..50c4447 100644 (file)
@@ -29,6 +29,9 @@ namespace Adaptor
 class FrameworkFactoryWin : public FrameworkFactory
 {
 public:
+  FrameworkFactoryWin();
+  ~FrameworkFactoryWin();
+
   std::unique_ptr<Framework> CreateFramework(FrameworkBackend frameworkType, Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Framework::Type type, bool useUiThread) override;
 };