Add exception handler for vconf_notify_key_changed() 47/315447/5
authorChanggyu Choi <changyu.choi@samsung.com>
Mon, 2 Dec 2024 06:52:21 +0000 (15:52 +0900)
committerChanggyu Choi <changyu.choi@samsung.com>
Mon, 2 Dec 2024 08:14:41 +0000 (17:14 +0900)
vconf_notify_key_changed() API can return errors.
So, in this case, launchpad can't receive vconf key changed event.
This patch adds retry logic.

Change-Id: I8291c1a26878a7fc05d4ef13dbdb0240f399e2a7
Signed-off-by: Changgyu Choi <changyu.choi@samsung.com>
17 files changed:
src/launchpad-loader/launchpad_loader.cc
src/launchpad-loader/launchpad_loader.hh
src/launchpad-process-pool/launchpad.cc
src/launchpad-process-pool/launchpad.hh
src/launchpad-process-pool/loader_manager.cc
src/launchpad-process-pool/loader_manager.hh
src/launchpad-process-pool/memory_monitor.cc
src/launchpad-process-pool/memory_monitor.hh
src/lib/launchpad-core/hw_acceleration_config.cc
src/lib/launchpad-core/hw_acceleration_config.hh
src/lib/launchpad-core/language_config.cc
src/lib/launchpad-core/language_config.hh
src/lib/launchpad-core/region_format_config.cc
src/lib/launchpad-core/region_format_config.hh
src/lib/launchpad-core/vconf.cc
src/lib/launchpad/launchpad_loader.cc
src/lib/launchpad/launchpad_loader.hh

index 68b53f8eb327d5aaa7930b40a64cbab22f2917ac..2f834a125f77f0151be45980b230e8258a1b9a28 100644 (file)
@@ -175,6 +175,31 @@ void LaunchpadLoader::OnCreate(const tizen_base::Bundle& extra, int type) {
   InitializeElementary();
 
   hw_acc_config_.reset(new launchpad::HWAccelerationConfig());
+  if (!hw_acc_config_->Init()) {
+    ++config_init_fail_cnt_;
+    _E("Config init failed retrying... (%d)", config_init_fail_cnt_);
+
+    config_init_timer_ = g_timeout_add(1000, [](gpointer data) -> gboolean {
+      auto* loader = static_cast<LaunchpadLoader*>(data);
+      if (!loader->hw_acc_config_->Init()) {
+        ++loader->config_init_fail_cnt_;
+        if (loader->config_init_fail_cnt_ < 30) {
+          _E("Config init failed retrying... (%d)",
+              loader->config_init_fail_cnt_);
+          return G_SOURCE_CONTINUE;
+        }
+
+        _E("Failed to init config");
+        loader->config_init_timer_ = 0;
+        return G_SOURCE_REMOVE;
+      }
+
+      _I("Config init done");
+      loader->config_init_timer_ = 0;
+      return G_SOURCE_REMOVE;
+    }, this);
+  }
+
   auto priority = extra.GetString("SCHED_PRIORITY");
   if (priority != "0")
     SchedPriority::Set(0);
index 3af2b5e5e2e384b7c08b790ef7d9cbf155b064bf..fa88ac28a1fad07b03f41ac79d053a9f96083031 100644 (file)
 #ifndef LAUNCHPAD_LOADER_LAUNCHPAD_LOADER_HH_
 #define LAUNCHPAD_LOADER_LAUNCHPAD_LOADER_HH_
 
+#include <bundle_cpp.h>
 #include <Ecore.h>
 #include <Elementary.h>
-#include <bundle_cpp.h>
+#include <glib.h>
 #include <launchpad.h>
 
 #include <memory>
@@ -85,6 +86,8 @@ class LaunchpadLoader {
   Evas_Object* conform_ = nullptr;
   std::unique_ptr<launchpad::HWAccelerationConfig> hw_acc_config_;
   std::string old_cwd_;
+  int config_init_fail_cnt_ = 0;
+  guint config_init_timer_ = 0;
 };
 
 }  // namespace loader
index 96c83b7533436d321d0efa35f9a919174e1804f2..109b02bcb5cf225d71c3cd184d07c06062b4ed1d 100644 (file)
@@ -228,6 +228,27 @@ bool Launchpad::OnCreate() {
   Util::SendCmdToAmd(AmdCmd::LaunchpadLaunchSignal);
   lang_config_.reset(new LanguageConfig());
   region_format_config_.reset(new RegionFormatConfig());
+  if (!InitConfig()) {
+    _E("Config init failed retrying... (%d)", config_init_fail_cnt_);
+    config_init_timer_ = g_timeout_add(1000, [](gpointer data) -> gboolean {
+      auto* launchpad = static_cast<Launchpad*>(data);
+      if (!launchpad->InitConfig()) {
+        if (launchpad->config_init_fail_cnt_ < 30) {
+          _E("Config init failed retrying... (%d)",
+              launchpad->config_init_fail_cnt_);
+          return G_SOURCE_CONTINUE;
+        }
+
+        _E("Failed to init config");
+        launchpad->config_init_timer_ = 0;
+        return G_SOURCE_REMOVE;
+      }
+
+      _I("Config init done");
+      launchpad->config_init_timer_ = 0;
+      return G_SOURCE_REMOVE;
+    }, this);
+  }
 
   Log::Init();
   return true;
@@ -235,6 +256,11 @@ bool Launchpad::OnCreate() {
 
 void Launchpad::OnTerminate() {
   Log::Finish();
+  if (config_init_timer_ > 0) {
+    g_source_remove(config_init_timer_);
+    config_init_timer_ = 0;
+  }
+
   region_format_config_.reset();
   lang_config_.reset();
 
@@ -664,6 +690,15 @@ bool Launchpad::SendSigchldEvent(pid_t pid, int status) {
   return true;
 }
 
+bool Launchpad::InitConfig() {
+  if (!lang_config_->Init() || !region_format_config_->Init()) {
+    config_init_fail_cnt_++;
+    return false;
+  }
+
+  return true;
+}
+
 void Launchpad::OnSigchldReceived(pid_t pid, int status) {
   fast_launches_.erase(pid);
   auto found = pid_map_.find(pid);
index ddecaf11988fac84861be8a33450ccc64c31b40f..937efcc94b74f5c6bd5e79787ef8a3ae1957c787 100644 (file)
@@ -89,6 +89,7 @@ class Launchpad : public IOChannel::IEvent,
   LaunchResult LaunchRequestPend(std::shared_ptr<Request> request);
   void LaunchRequestComplete(std::shared_ptr<Request> request);
   bool SendSigchldEvent(pid_t pid, int status);
+  bool InitConfig();
 
   void OnIOEventReceived(int fd, int condition) override;
   void OnSigchldReceived(pid_t pid, int status) override;
@@ -113,6 +114,8 @@ class Launchpad : public IOChannel::IEvent,
   std::unordered_map<pid_t, std::string> fast_launches_;
   std::unique_ptr<ClientSocket> sigchld_socket_;
   std::vector<std::pair<pid_t, int>> pending_siginfos_;
+  int config_init_fail_cnt_ = 0;
+  guint config_init_timer_ = 0;
 };
 
 }  // namespace launchpad
index 7872104b7ede3e6514f570db4493efa28c8d48f1..b261531565484112b182af5e9edbc496033954c6 100644 (file)
@@ -43,6 +43,11 @@ void LoaderManager::Dispose() {
   if (disposed_) return;
 
   loader_mount_.reset();
+  if (config_init_timer_ > 0) {
+    g_source_remove(config_init_timer_);
+    config_init_timer_ = 0;
+  }
+
   hwacc_config_.reset();
   app_defined_loader_info_manager_.reset();
   loader_info_manager_.reset();
@@ -64,6 +69,28 @@ void LoaderManager::Init() {
     app_defined_loader_info_manager_.reset(new AppDefinedLoaderInfoManager());
     app_defined_loader_info_manager_->SetEventListener(this);
     hwacc_config_.reset(new HWAccelerationConfig());
+    if (!hwacc_config_->Init()) {
+      _E("Config init failed retrying... (%d)", config_init_fail_cnt_);
+
+      config_init_timer_ = g_timeout_add(1000, [](gpointer data) -> gboolean {
+        auto* loader_manager = static_cast<LoaderManager*>(data);
+        if (!loader_manager->hwacc_config_->Init()) {
+          if (loader_manager->config_init_fail_cnt_ < 30) {
+            _E("Config init failed retrying... (%d)",
+                loader_manager->config_init_fail_cnt_);
+            return G_SOURCE_CONTINUE;
+          }
+
+          _E("Failed to init config");
+          loader_manager->config_init_timer_ = 0;
+          return G_SOURCE_REMOVE;
+        }
+
+        _I("Config init done");
+        loader_manager->config_init_timer_ = 0;
+        return G_SOURCE_REMOVE;
+      }, this);
+    }
 
     if (!label_monitor.IsDisposed()) {
       setenv("LOADER_MOUNT", "1", 1);
index 065b77b872086f4efe1bfa2379d0842069175ac8..1f296eb66a17492561a478c17bfb90eec59d9658 100644 (file)
@@ -123,6 +123,8 @@ class LoaderManager : public AppDefinedLoaderInfoManager::IEvent,
   std::vector<std::shared_ptr<LoaderContext>> loader_contexts_;
   std::unique_ptr<HWAccelerationConfig> hwacc_config_;
   std::shared_ptr<LoaderMount> loader_mount_;
+  int config_init_fail_cnt_ = 0;
+  guint config_init_timer_ = 0;
 };
 
 }  // namespace launchpad
index 7e0b7c9450b0a77b4567df1b078ed8cacfa42d4d..ef10ab9a67a031d6359e6642d5b337f6e7003cb4 100644 (file)
@@ -37,8 +37,28 @@ MemoryMonitor& MemoryMonitor::GetInst() {
 MemoryMonitor::MemoryMonitor()
     : low_vconf_(Vconf(Config::GetInst().GetMemoryStatus().GetLowKey())),
       normal_vconf_(Vconf(Config::GetInst().GetMemoryStatus().GetNormalKey())) {
-  low_vconf_.Listen(this);
-  normal_vconf_.Listen(this);
+  if (!VconfInit()) {
+    ++config_init_fail_cnt_;
+    _E("Config init failed retrying... (%d)", config_init_fail_cnt_);
+    config_init_timer_ = g_timeout_add(1000, [](gpointer data) -> gboolean {
+      auto* memory_monitor = static_cast<MemoryMonitor*>(data);
+      if (!memory_monitor->VconfInit()) {
+        if (memory_monitor->config_init_fail_cnt_ < 30) {
+          _E("Config init failed retrying... (%d)",
+              memory_monitor->config_init_fail_cnt_);
+          return G_SOURCE_CONTINUE;
+        }
+
+        _E("Failed to init config");
+        memory_monitor->config_init_timer_ = 0;
+        return G_SOURCE_REMOVE;
+      }
+
+      _I("Config init done");
+      memory_monitor->config_init_timer_ = 0;
+      return G_SOURCE_REMOVE;
+    }, this);
+  }
 
   auto& config = Config::GetInst();
   threshold_ = config.GetMemoryMonitor().GetThreshold();
@@ -51,6 +71,11 @@ MemoryMonitor::~MemoryMonitor() { Dispose(); }
 void MemoryMonitor::Dispose() {
   if (disposed_) return;
 
+  if (config_init_timer_ > 0) {
+    g_source_remove(config_init_timer_);
+    config_init_timer_ = 0;
+  }
+
   Stop();
   disposed_ = true;
 }
@@ -97,6 +122,18 @@ void MemoryMonitor::Start() {
   interval_ += interval_ * INTERVAL_BASE_RATE;
 }
 
+
+bool MemoryMonitor::VconfInit() {
+  try {
+    low_vconf_.Listen(this);
+    normal_vconf_.Listen(this);
+  } catch (const  Exception& e) {
+    return false;
+  }
+
+  return true;
+}
+
 void MemoryMonitor::Stop() {
   if (timer_ != 0) {
     g_source_remove(timer_);
index 869da091d48b108ff7f6b095252150a4e65b711e..b65636a4b8b6a44ebe65f346fb0e5e4bb80ca670 100644 (file)
@@ -50,6 +50,7 @@ class MemoryMonitor : public Vconf::IEvent {
   MemoryMonitor();
   ~MemoryMonitor();
 
+  bool VconfInit();
   void Stop();
   void Start();
   void Init();
@@ -68,6 +69,8 @@ class MemoryMonitor : public Vconf::IEvent {
   guint interval_ = 0;
   guint timer_ = 0;
   bool low_memory_ = false;
+  int config_init_fail_cnt_ = 0;
+  guint config_init_timer_ = 0;
 };
 
 }  // namespace launchpad
index 82663c6449aadd676d9d2045536650e9cc370206..851201806fea5c1978acfbb9dd8f790ef7f9d10c 100644 (file)
@@ -22,14 +22,23 @@ namespace launchpad {
 
 HWAccelerationConfig::HWAccelerationConfig()
     : vconf_(Vconf(VCONFKEY_SETAPPL_APP_HW_ACCELERATION)) {
-  vconf_.Listen(this);
+}
+
+bool HWAccelerationConfig::Init() {
+  if (init_)
+    return true;
 
   try {
+    vconf_.Listen(this);
     hwacc_ = vconf_.Get<int>();
   } catch (const Exception& e) {
     _E("Exception occurs. error: %s", e.what());
     hwacc_ = -1;
+    return false;
   }
+
+  init_ = true;
+  return true;
 }
 
 int HWAccelerationConfig::Get() const {
index 8c59c0bcad5ad0efb9827e87ccbe7147da4b21a2..d3ac2d90b880d7504440b4d04db2338803760cf4 100644 (file)
@@ -24,6 +24,7 @@ namespace launchpad {
 class HWAccelerationConfig : public Vconf::IEvent {
  public:
   HWAccelerationConfig();
+  bool Init();
 
   int Get() const;
 
@@ -33,6 +34,7 @@ class HWAccelerationConfig : public Vconf::IEvent {
  private:
   Vconf vconf_;
   int hwacc_;
+  bool init_ = false;
 };
 
 }  // namespace launchpad
index 26b5dc8e4e8acd53219a139ada2bc2b7258f6ba6..346ee83e820901c9d3b6e35d2c555a3098beaa4f 100644 (file)
 namespace launchpad {
 
 LanguageConfig::LanguageConfig() : vconf_(Vconf(VCONFKEY_LANGSET)) {
-  vconf_.Listen(this);
+}
+
+bool LanguageConfig::Init() {
+  if (init_)
+    return true;
 
   try {
+    vconf_.Listen(this);
     lang_ = vconf_.Get<std::string>();
     setenv("LANG", lang_.c_str(), 1);
     _W("Language: %s", lang_.c_str());
   } catch (const Exception& e) {
     _E("Exception occurs. error: %s", e.what());
+    return false;
   }
+
+  init_ = true;
+  return true;
 }
 
 const std::string& LanguageConfig::Get() const {
index 1ee5b852b5b973b36bb4a05445f32638f6a74756..004f158a69dbd497e2f5165ea9cabafd852418da 100644 (file)
@@ -26,6 +26,7 @@ namespace launchpad {
 class LanguageConfig : public Vconf::IEvent {
  public:
   LanguageConfig();
+  bool Init();
 
   const std::string& Get() const;
 
@@ -35,6 +36,7 @@ class LanguageConfig : public Vconf::IEvent {
  private:
   Vconf vconf_;
   std::string lang_;
+  bool init_ = false;
 };
 
 }  // namespace launchpad
index 3cebbdb72dde42350974ea1a2a704cfb6720421b..7bc10c9efb3c940f39241052aaef1cffeecfd4ed 100644 (file)
@@ -24,15 +24,24 @@ namespace launchpad {
 
 RegionFormatConfig::RegionFormatConfig()
     : vconf_(Vconf(VCONFKEY_REGIONFORMAT)) {
-  vconf_.Listen(this);
+}
+
+bool RegionFormatConfig::Init() {
+  if (init_)
+    return true;
 
   try {
+    vconf_.Listen(this);
     region_ = vconf_.Get<std::string>();
     setenv("LC_CTYPE", region_.c_str(), 1);
     _W("Region: %s", region_.c_str());
   } catch (const Exception& e) {
     _E("Exception occurs. error: %s", e.what());
+    return false;
   }
+
+  init_ = true;
+  return true;
 }
 
 const std::string& RegionFormatConfig::Get() const {
index 9ba183c6ed17ac324348b982f8ea4f6581db97c3..bf0acc88dcd1095f13d642b1a22ca8eb10a8be46 100644 (file)
@@ -29,6 +29,7 @@ namespace launchpad {
 class EXPORT_API RegionFormatConfig : public Vconf::IEvent {
  public:
   RegionFormatConfig();
+  bool Init();
 
   const std::string& Get() const;
 
@@ -38,6 +39,7 @@ class EXPORT_API RegionFormatConfig : public Vconf::IEvent {
  private:
   Vconf vconf_;
   std::string region_;
+  bool init_ = false;
 };
 
 }  // namespace launchpad
index b2efbf878207200609c405e4b21090567afb4884..3f8d73ad8d4adfba047009f68592f0c4d6344e7a 100644 (file)
@@ -17,6 +17,7 @@
 #include "launchpad-core/vconf.hh"
 
 #include <errno.h>
+#include <tizen.h>
 
 #include <string>
 #include <type_traits>
@@ -122,13 +123,17 @@ void Vconf::Listen(IEvent* listener) {
     THROW(-EINVAL);
   }
 
-  bool listening = listener_ != nullptr ? true : false;
-  listener_ = listener;
-
-  if (!listening) {
+  if (!listener_) {
     int ret = vconf_notify_key_changed(key_.c_str(), VconfCb, this);
-    if (ret != VCONF_OK)
-      _E("vconf_notify_key_changed() is failed. key: %s", key_.c_str());
+    if (ret != VCONF_OK) {
+      int error = -errno;
+      _E("vconf_notify_key_changed() is failed. key:err(%s:%d)",
+          key_.c_str(), error);
+      if (error != TIZEN_ERROR_FILE_EXISTS)
+        THROW(ret);
+    }
+
+    listener_ = listener;
   }
 }
 
index be109a488498197c9485df0bbfd4ef61d8edc01f..147b3d8989cbfc5ea0cb22671f601f77ba3feff0 100644 (file)
@@ -209,6 +209,29 @@ bool LaunchpadLoader::OnCreate() {
 
   language_config_.reset(new LanguageConfig());
   region_format_config_.reset(new RegionFormatConfig());
+  if (!InitConfig()) {
+    _E("Config init failed retrying... (%d)", config_init_fail_cnt_);
+
+    config_init_timer_ = g_timeout_add(1000, [](gpointer data) -> gboolean {
+      auto* loader = static_cast<LaunchpadLoader*>(data);
+      if (!loader->InitConfig()) {
+        if (loader->config_init_fail_cnt_ < 30) {
+          _E("Config init failed retrying... (%d)",
+              loader->config_init_fail_cnt_);
+          return G_SOURCE_CONTINUE;
+        }
+
+        _E("Failed to init config");
+        loader->config_init_timer_ = 0;
+        return G_SOURCE_REMOVE;
+      }
+
+      _I("Config init done");
+      loader->config_init_timer_ = 0;
+      return G_SOURCE_REMOVE;
+    }, this);
+  }
+
   return true;
 }
 
@@ -255,6 +278,11 @@ int LaunchpadLoader::OnLaunch(int argc, char** argv, AppInfo* app_info) {
 
 int LaunchpadLoader::OnTerminate() {
   _D("Terminating...");
+  if (config_init_timer_ > 0) {
+    g_source_remove(config_init_timer_);
+    config_init_timer_ = 0;
+  }
+
   region_format_config_.reset();
   language_config_.reset();
 
@@ -316,6 +344,15 @@ void LaunchpadLoader::ReceiverCb(int fd) {
   context->HandleReceiverEvent(fd);
 }
 
+bool LaunchpadLoader::InitConfig() {
+  if (!language_config_->Init() || !region_format_config_->Init()) {
+    config_init_fail_cnt_++;
+    return false;
+  }
+
+  return true;
+}
+
 void LaunchpadLoader::ProcessLaunchRequest(tizen_base::Parcel* parcel) {
   parcel->ReadParcelable(&app_info_);
   SECURE_LOGD("App Id: %s, Package Id: %s, Loader Type: %d",
index 8f44252c2e832824c6e471cd1bc1db08a21e374e..728e6e6ed24ec86dfb32cf16d46789be4352b7c4 100644 (file)
@@ -18,6 +18,7 @@
 #define LIB_LAUNCHPAD_LAUNCHPAD_LOADER_HH_
 
 #include <bundle_cpp.h>
+#include <glib.h>
 
 #include <memory>
 #include <string>
@@ -62,6 +63,7 @@ class LaunchpadLoader {
   void HandleReceiverEvent(int fd);
   void ProcessLaunchRequest(tizen_base::Parcel* parcel);
   static void ReceiverCb(int fd);
+  bool InitConfig();
 
  private:
   int argc_;
@@ -76,6 +78,8 @@ class LaunchpadLoader {
   std::unique_ptr<RegionFormatConfig> region_format_config_;
   int app_argc_ = 0;
   char** app_argv_ = nullptr;
+  int config_init_fail_cnt_ = 0;
+  guint config_init_timer_ = 0;
 };
 
 }  // namespace launchpad