Call AMD_MOD_PREINIT function 72/314672/2
authorHwankyu Jhun <h.jhun@samsung.com>
Wed, 17 Jul 2024 06:53:16 +0000 (15:53 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Wed, 17 Jul 2024 08:08:45 +0000 (17:08 +0900)
Before amd starts the memory allocation, amd calls AMD_MOD_PREINIT() to
provider the entry point to plugin modules.

Change-Id: I37fb326905ae4103d9a41f85b518d19280861135
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/lib/amd_main.cc

index 6f7c84b0d5a24005204152951fab3bf7eaeb3f97..621924a06329a6b5f75a265b37c2054ab71bc9ff 100644 (file)
@@ -65,6 +65,7 @@
 
 typedef int (*amd_mod_init_func)(void);
 typedef void (*amd_mod_fini_func)(void);
+typedef void (*amd_mod_preinit_func)(void);
 
 namespace {
 
@@ -76,6 +77,7 @@ constexpr const char PATH_AUL_LOG[] = "/run/aul/log";
 constexpr const char PATH_AUL_RPCPORT[] = "/run/aul/rpcport";
 constexpr const char AMD_MOD_INIT[] = "AMD_MOD_INIT";
 constexpr const char AMD_MOD_FINI[] = "AMD_MOD_FINI";
+constexpr const char AMD_MOD_PREINIT[] = "AMD_MOD_PREINIT";
 
 class Plugin {
  public:
@@ -88,28 +90,44 @@ class Plugin {
       _E("dlopen() is failed. path(%s), error(%s)", path_.c_str(), dlerror());
       THROW(-ECANCELED);
     }
+  }
+
+  ~Plugin() = default;
+
+  void CallPreInit() {
+    auto* preinit_func = reinterpret_cast<amd_mod_preinit_func>(
+        dlsym(handle_.get(), AMD_MOD_PREINIT));
+    if (preinit_func == nullptr) return;
+
+    _W("[%s] AMD_MOD_PREINIT() ++", path_.c_str());
+    preinit_func();
+    _W("[%s] AMD_MOD_PREINIT() --", path_.c_str());
+  }
 
+  int CallInit() {
     auto* init_func = reinterpret_cast<amd_mod_init_func>(
         dlsym(handle_.get(), AMD_MOD_INIT));
     if (init_func == nullptr) {
-      _E("dlsym() is failed");
-      THROW(-ECANCELED);
+      _E("dlsym() is failed. path=%s", path_.c_str());
+      return -1;
     }
 
     _W("[%s] AMD_MOD_INIT() ++", path_.c_str());
     int ret = init_func();
     _W("[%s] AMD_MOD_INIT() --", path_.c_str());
     if (ret < 0) {
-      _E("AMD_MOD_INIT() is failed");
-      THROW(-ECANCELED);
+      _E("AMD_MOD_INIT() is failed. path=%s", path_.c_str());
+      return -ECANCELED;
     }
+
+    return 0;
   }
 
-  ~Plugin() {
+  void CallFinish() {
     auto* fini_func = reinterpret_cast<amd_mod_fini_func>(
         dlsym(handle_.get(), AMD_MOD_FINI));
     if (fini_func == nullptr)
-      _E("dlsym() is failed");
+      _E("dlsym() is failed. path=%s", path_.c_str());
     else
       fini_func();
   }
@@ -168,6 +186,23 @@ class PluginManager {
     plugin_list_.clear();
   }
 
+  void CallPreInit() {
+    for (auto& plugin : plugin_list_) plugin->CallPreInit();
+  }
+
+  int CallInit() {
+    for (auto& plugin : plugin_list_) {
+      if (plugin->CallInit() != 0)
+        return -1;
+    }
+
+    return 0;
+  }
+
+  void CallFinish() {
+    for (auto& plugin : plugin_list_) plugin->CallFinish();
+  }
+
  private:
   PluginManager() = default;
   ~PluginManager() = default;
@@ -196,6 +231,10 @@ void CreateAulDirectories() {
 
 static int Initialize() {
   _W("AMD_INIT");
+  auto& plugin_manager = PluginManager::GetInst();
+  plugin_manager.Load();
+  plugin_manager.CallPreInit();
+
   CreateAulDirectories();
   _config_init();
   _logger_init();
@@ -226,7 +265,7 @@ static int Initialize() {
   _restart_manager_init();
   _cpu_boost_init();
 
-  PluginManager::GetInst().Load();
+  plugin_manager.CallInit();
   return 0;
 }
 
@@ -258,7 +297,9 @@ static void Finalize() {
   _logger_fini();
   _config_fini();
 
-  PluginManager::GetInst().Unload();
+  auto& plugin_manager = PluginManager::GetInst();
+  plugin_manager.CallFinish();
+  plugin_manager.Unload();
 }
 
 static gboolean TimeoutCb(gpointer user_data) {