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>
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);
#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>
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
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;
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();
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);
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;
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
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();
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);
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
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();
void MemoryMonitor::Dispose() {
if (disposed_) return;
+ if (config_init_timer_ > 0) {
+ g_source_remove(config_init_timer_);
+ config_init_timer_ = 0;
+ }
+
Stop();
disposed_ = true;
}
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_);
MemoryMonitor();
~MemoryMonitor();
+ bool VconfInit();
void Stop();
void Start();
void Init();
guint interval_ = 0;
guint timer_ = 0;
bool low_memory_ = false;
+ int config_init_fail_cnt_ = 0;
+ guint config_init_timer_ = 0;
};
} // 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 {
class HWAccelerationConfig : public Vconf::IEvent {
public:
HWAccelerationConfig();
+ bool Init();
int Get() const;
private:
Vconf vconf_;
int hwacc_;
+ bool init_ = false;
};
} // namespace launchpad
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 {
class LanguageConfig : public Vconf::IEvent {
public:
LanguageConfig();
+ bool Init();
const std::string& Get() const;
private:
Vconf vconf_;
std::string lang_;
+ bool init_ = false;
};
} // 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 {
class EXPORT_API RegionFormatConfig : public Vconf::IEvent {
public:
RegionFormatConfig();
+ bool Init();
const std::string& Get() const;
private:
Vconf vconf_;
std::string region_;
+ bool init_ = false;
};
} // namespace launchpad
#include "launchpad-core/vconf.hh"
#include <errno.h>
+#include <tizen.h>
#include <string>
#include <type_traits>
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;
}
}
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;
}
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();
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",
#define LIB_LAUNCHPAD_LAUNCHPAD_LOADER_HH_
#include <bundle_cpp.h>
+#include <glib.h>
#include <memory>
#include <string>
void HandleReceiverEvent(int fd);
void ProcessLaunchRequest(tizen_base::Parcel* parcel);
static void ReceiverCb(int fd);
+ bool InitConfig();
private:
int argc_;
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