From 895dea5ebaffd6172f1956063e3253cd51cfb700 Mon Sep 17 00:00:00 2001 From: asmodai Date: Tue, 9 May 2017 19:59:13 +0300 Subject: [PATCH] Make correct messages for delayed load/unload --- metamod/src/commands_meta.cpp | 15 ++++++++------- metamod/src/mlist.cpp | 16 ++++++++++------ metamod/src/mplugin.cpp | 25 ++++++++++++++++--------- metamod/src/mplugin.h | 6 +++--- 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/metamod/src/commands_meta.cpp b/metamod/src/commands_meta.cpp index 46f2e0a..2bbd2c0 100644 --- a/metamod/src/commands_meta.cpp +++ b/metamod/src/commands_meta.cpp @@ -364,11 +364,12 @@ void cmd_doplug(PLUG_CMD pcmd) case PC_UNLOAD: { findp->set_action(PA_UNLOAD); - if (findp->unload(PT_ANYTIME, PNL_COMMAND)) { + bool delayed; + if (findp->unload(PT_ANYTIME, PNL_COMMAND, delayed)) { META_CONS("Unloaded plugin '%s'", findp->description()); g_plugins->show(); } - else if (false /*meta_errno == ME_DELAYED*/) // TODO + else if (delayed) META_CONS("Unload delayed for plugin '%s'", findp->description()); else META_CONS("Unload failed for plugin '%s'", findp->description()); @@ -377,7 +378,8 @@ void cmd_doplug(PLUG_CMD pcmd) case PC_FORCE_UNLOAD: { findp->set_action(PA_UNLOAD); - if (findp->unload(PT_ANYTIME, PNL_CMD_FORCED)) { + bool delayed; + if (findp->unload(PT_ANYTIME, PNL_CMD_FORCED, delayed)) { META_CONS("Forced unload plugin '%s'", findp->description()); g_plugins->show(); } @@ -388,12 +390,11 @@ void cmd_doplug(PLUG_CMD pcmd) case PC_RELOAD: { findp->set_action(PA_RELOAD); - if (findp->reload(PT_ANYTIME, PNL_COMMAND)) + bool delayed; + if (findp->reload(PT_ANYTIME, PNL_COMMAND, delayed)) META_CONS("Reloaded plugin '%s'", findp->description()); - else if (0/*meta_errno == ME_DELAYED*/) // TODO + else if (delayed) META_CONS("Reload delayed for plugin '%s'", findp->description()); - else if (0/*meta_errno == ME_NOTALLOWED*/) - META_CONS("Reload not allowed for plugin '%s' now, only allowed %s", findp->description(), findp->str_loadable(SL_ALLOWED)); else META_CONS("Reload failed for plugin '%s'", findp->description()); break; diff --git a/metamod/src/mlist.cpp b/metamod/src/mlist.cpp index 89a217f..0a3cc86 100644 --- a/metamod/src/mlist.cpp +++ b/metamod/src/mlist.cpp @@ -191,7 +191,8 @@ MPlugin* MPluginList::plugin_addload(plid_t plid, const char* fname, PLUG_LOADTI } pl_added->m_action = PA_LOAD; - if (!pl_added->load(now)) { + bool delayed; + if (!pl_added->load(now, delayed)) { if (pl_added->m_status == PL_OPENED) { META_DEBUG(1, "Opened plugin '%s', but failed to attach; see log", pl_added->m_desc); } @@ -448,7 +449,8 @@ bool MPluginList::cmd_addload(const char* args) // try to load new plugin pl_added->m_action = PA_LOAD; - if (!pl_added->load(PT_ANYTIME)) { + bool delayed; + if (!pl_added->load(PT_ANYTIME, delayed)) { // load failed if (pl_added->m_status == PL_OPENED) META_CONS("Opened plugin '%s', but failed to attach; see log", pl_added->m_desc); @@ -479,7 +481,8 @@ bool MPluginList::load() if (m_plist[i].m_status < PL_VALID) continue; - if (m_plist[i].load(PT_STARTUP)) + bool delayed; + if (m_plist[i].load(PT_STARTUP, delayed)) n++; else // all plugins should be loadable at startup... @@ -502,6 +505,7 @@ bool MPluginList::refresh(PLUG_LOADTIME now) } META_LOG("dll: Updating plugins..."); + bool delayed; for (int i = 0; i < m_max_loaded_count; i++) { auto iplug = &m_plist[i]; if (iplug->m_status < PL_VALID) @@ -515,14 +519,14 @@ bool MPluginList::refresh(PLUG_LOADTIME now) break; case PA_LOAD: META_DEBUG(1, "Loading plugin '%s'", iplug->m_desc); - if (iplug->load(now)) + if (iplug->load(now, delayed)) nloaded++; /*else if (meta_errno == ME_DELAYED) TODO ndelayed++;*/ break; case PA_RELOAD: META_DEBUG(1, "Reloading plugin '%s'", iplug->m_desc); - if (iplug->reload(now, PNL_FILE_NEWER)) + if (iplug->reload(now, PNL_FILE_NEWER, delayed)) nreloaded++; /*else if (meta_errno == ME_DELAYED) TODO ndelayed++;*/ @@ -532,7 +536,7 @@ bool MPluginList::refresh(PLUG_LOADTIME now) if (iplug->m_source == PS_INI && iplug->m_status >= PL_RUNNING) { META_DEBUG(1, "Unloading plugin '%s'", iplug->m_desc); iplug->m_action = PA_UNLOAD; - if (iplug->unload(now, PNL_INI_DELETED)) + if (iplug->unload(now, PNL_INI_DELETED, delayed)) nunloaded++; /*else if (meta_errno == ME_DELAYED) TODO ndelayed++;*/ diff --git a/metamod/src/mplugin.cpp b/metamod/src/mplugin.cpp index 86c2998..3bb7a67 100644 --- a/metamod/src/mplugin.cpp +++ b/metamod/src/mplugin.cpp @@ -372,8 +372,9 @@ bool MPlugin::platform_match(MPlugin *other) const } // Load a plugin; query, check allowed time, attach. -bool MPlugin::load(PLUG_LOADTIME now) +bool MPlugin::load(PLUG_LOADTIME now, bool& delayed) { + delayed = false; if (!check_input()) { return false; } @@ -405,6 +406,7 @@ bool MPlugin::load(PLUG_LOADTIME now) if (m_info->loadable > PT_STARTUP) { // will try to attach again at next opportunity META_DEBUG(2, "dll: Delaying load plugin '%s'; can't attach now: allowed=%s; now=%s", m_desc, str_loadable(), str_loadtime(now, SL_SIMPLE)); + delayed = true; return false; } @@ -445,8 +447,9 @@ bool MPlugin::load(PLUG_LOADTIME now) } // Unload a plugin. Check time, detach. -bool MPlugin::unload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason) +bool MPlugin::unload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason, bool& delayed) { + delayed = false; if (!check_input()) { return false; } @@ -472,6 +475,7 @@ bool MPlugin::unload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason) META_DEBUG(2, "dll: Delaying unload plugin '%s'; can't detach now: allowed=%s; now=%s", m_desc, str_unloadable(), str_loadtime(now, SL_SIMPLE)); // caller should give message to user // try to unload again at next opportunity + delayed = true; return false; } @@ -534,8 +538,9 @@ bool MPlugin::unload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason) } // Reload a plugin; unload and load again. -bool MPlugin::reload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason) +bool MPlugin::reload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason, bool& delayed) { + delayed = false; if (!check_input()) { return false; } @@ -560,12 +565,12 @@ bool MPlugin::reload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason) reason = PNL_RELOAD; } - if (!unload(now, reason)) { + if (!unload(now, reason, delayed)) { META_WARNING("dll: Failed to unload plugin '%s' for reloading", m_desc); return false; } - if (!load(now)) { + if (!load(now, delayed)) { META_WARNING("dll: Failed to reload plugin '%s' after unloading", m_desc); return false; } @@ -613,12 +618,13 @@ bool MPlugin::unpause() // Retry pending action, presumably from a previous failure. bool MPlugin::retry(PLUG_LOADTIME now, PL_UNLOAD_REASON reason) { + bool delayed; if (m_action == PA_LOAD || m_action == PA_ATTACH) - return load(now); + return load(now, delayed); if (m_action == PA_UNLOAD) - return unload(now, reason); + return unload(now, reason, delayed); if (m_action == PA_RELOAD) - return reload(now, reason); + return reload(now, reason, delayed); META_ERROR("No pending action to retry for plugin '%s'; (status=%s, action=%s)", m_desc, str_status(), str_action()); return false; @@ -703,8 +709,9 @@ bool MPlugin::plugin_unload(plid_t plid, PLUG_LOADTIME now, PL_UNLOAD_REASON rea //try unload PLUG_ACTION old_action = m_action; m_action = PA_UNLOAD; + bool delayed; - if (unload(now, reason)) { + if (unload(now, reason, delayed)) { META_DEBUG(1, "Unloaded plugin '%s'", m_desc); pl_unloader->m_is_unloader = false; return true; diff --git a/metamod/src/mplugin.h b/metamod/src/mplugin.h index 3aad46f..41f0c6f 100644 --- a/metamod/src/mplugin.h +++ b/metamod/src/mplugin.h @@ -89,9 +89,9 @@ public: bool platform_match(MPlugin* plugin) const; // check if a given plugin is the same but possibly for a different platform - bool load(PLUG_LOADTIME now); // load parsed plugin - bool unload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason); - bool reload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason); + bool load(PLUG_LOADTIME now, bool& delayed); // load parsed plugin + bool unload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason, bool& delayed); + bool reload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason, bool& delayed); bool pause(); bool unpause(); bool retry(PLUG_LOADTIME now, PL_UNLOAD_REASON reason); // if previously failed