MT#59962 DSMChartReader: add dl handler cleanup

Cleanup DL handlers when cleaning up DSMChartReader.

Change-Id: I54b21a0685cb4d6a5568bf97243949476132d90e
mr13.3.1
Donat Zenichev 1 year ago
parent 68afc10849
commit 13a8a50d52

@ -876,7 +876,18 @@ int DSMFactory::preloadModules(AmConfigReader& cfg, string& res, const string& M
res = "importing module '"+*it+"' for preload\n";
return -1;
}
DSMModule* last_loaded = preload_reader.mods.back();
DSMModule* last_loaded = NULL;
modLinkHdl modHdl = preload_reader.mods.back();
if (modHdl.mod)
last_loaded = modHdl.mod;
else
{
res = "Error while preloading '"+*it+"'\n";
return -1;
}
if (last_loaded) {
if (last_loaded->preload()) {
res = "Error while preloading '"+*it+"'\n";
@ -919,7 +930,19 @@ void DSMFactory::preloadModule(const AmArg& args, AmArg& ret) {
ret.push("importing module '"+mod_name+"' for preload");
return;
}
DSMModule* last_loaded = preload_reader.mods.back();
DSMModule* last_loaded = NULL;
modLinkHdl modHdl = preload_reader.mods.back();
if (modHdl.mod)
last_loaded = modHdl.mod;
else
{
ret.push(500);
ret.push("Error while preloading '"+mod_name+"'");
return;
}
if (last_loaded) {
if (last_loaded->preload()) {
ret.push(500);

@ -119,10 +119,16 @@ string DSMChartReader::getToken(string str, size_t& pos) {
}
DSMAction* DSMChartReader::actionFromToken(const string& str) {
for (vector<DSMModule*>::iterator it=
mods.begin(); it!= mods.end(); it++) {
DSMAction* a = (*it)->getAction(str);
if (a) return a;
for (v_modsHdls::iterator it=mods.begin(); it!= mods.end(); it++)
{
DSMModule* mod = (*it).mod;
if (!mod)
continue;
DSMAction* a = mod->getAction(str);
if (a)
return a;
}
DSMAction* a = core_mod.getAction(str);
@ -201,9 +207,14 @@ bool DSMChartReader::forFromToken(DSMArrayFor& af, const string& token) {
}
DSMCondition* DSMChartReader::conditionFromToken(const string& str, bool invert) {
for (vector<DSMModule*>::iterator it=
mods.begin(); it!= mods.end(); it++) {
DSMCondition* c=(*it)->getCondition(str);
for (v_modsHdls::iterator it=mods.begin(); it!= mods.end(); it++)
{
DSMModule* mod = (*it).mod;
if (!mod)
continue;
DSMCondition* c = mod->getCondition(str);
if (c) {
c->invert = invert;
return c;
@ -252,7 +263,10 @@ bool DSMChartReader::importModule(const string& mod_cmd, const string& mod_path)
fname.c_str());
return false;
}
mods.push_back(mod);
modLinkHdl mod_hdl = {mod, h_dl};
mods.push_back(mod_hdl);
DBG("loaded module '%s' from '%s'\n",
params.c_str(), fname.c_str());
return true;
@ -735,16 +749,30 @@ bool DSMChartReader::decode(DSMStateDiagram* e, const string& chart,
}
for (vector<DSMModule*>::iterator it=
mods.begin(); it != mods.end(); it++)
out_mods.push_back(*it);
for (v_modsHdls::iterator it=mods.begin(); it!= mods.end(); it++)
{
DSMModule* mod = (*it).mod;
if (mod)
out_mods.push_back(mod);
}
return true;
}
void DSMChartReader::cleanup() {
for (vector<DSMModule*>::iterator it=mods.begin(); it != mods.end(); it++)
delete *it;
for (v_modsHdls::iterator it=mods.begin(); it!= mods.end(); it++)
{
DSMModule* mod = (*it).mod;
void* h_dl = (*it).h_dl;
if (mod)
delete mod;
if (h_dl)
dlclose(h_dl);
}
mods.clear();
}

@ -34,6 +34,12 @@
#include <string>
using std::string;
struct modLinkHdl {
DSMModule* mod;
void* h_dl;
};
typedef vector<modLinkHdl> v_modsHdls;
class NamedAction : public DSMAction {
public:
NamedAction(const string& m_name) {
@ -96,7 +102,9 @@ class DSMChartReader {
bool forFromToken(DSMArrayFor& af, const string& token);
bool importModule(const string& mod_cmd, const string& mod_path);
vector<DSMModule*> mods;
v_modsHdls mods;
DSMCoreModule core_mod;
vector<DSMFunction*> funcs;

Loading…
Cancel
Save