typedef int (*amd_mod_init_func)(void);
typedef void (*amd_mod_fini_func)(void);
+typedef void (*amd_mod_preinit_func)(void);
namespace {
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:
_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();
}
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;
static int Initialize() {
_W("AMD_INIT");
+ auto& plugin_manager = PluginManager::GetInst();
+ plugin_manager.Load();
+ plugin_manager.CallPreInit();
+
CreateAulDirectories();
_config_init();
_logger_init();
_restart_manager_init();
_cpu_boost_init();
- PluginManager::GetInst().Load();
+ plugin_manager.CallInit();
return 0;
}
_logger_fini();
_config_fini();
- PluginManager::GetInst().Unload();
+ auto& plugin_manager = PluginManager::GetInst();
+ plugin_manager.CallFinish();
+ plugin_manager.Unload();
}
static gboolean TimeoutCb(gpointer user_data) {