Skip to content

Commit 69bd407

Browse files
authored
chore(cpn): delay loading libsims (#5778)
1 parent 424a0f1 commit 69bd407

File tree

2 files changed

+34
-47
lines changed

2 files changed

+34
-47
lines changed

companion/src/simulation/simulatorinterface.cpp

Lines changed: 33 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,7 @@
3030
#include <windows.h>
3131
#endif
3232

33-
#ifndef SIMULATOR_INTERFACE_LOADER_METHOD
34-
#define SIMULATOR_INTERFACE_LOADER_DYNAMIC 1 // How to load simulator libraries: 1=dynamic load and unload; 0=load once (old way)
35-
#endif
36-
37-
QMap<QString, QLibrary *> SimulatorLoader::registeredSimulators;
33+
QMap<QString, QPair<QString, QLibrary *>> SimulatorLoader::registeredSimulators;
3834

3935
QStringList SimulatorLoader::getAvailableSimulators()
4036
{
@@ -45,42 +41,26 @@ int SimulatorLoader::registerSimulators(const QDir & dir)
4541
{
4642
QStringList filters;
4743
#if defined(__APPLE__)
48-
filters << "*-simulator.dylib";
44+
filters << "libedgetx-*-simulator.dylib";
4945
#elif defined(WIN32) || defined(__CYGWIN__)
50-
filters << "*-simulator.dll";
46+
filters << "libedgetx-*-simulator.dll";
5147
#else
52-
filters << "*-simulator.so";
48+
filters << "libedgetx-*-simulator.so";
5349
#endif
5450
registeredSimulators.clear();
5551

5652
qCDebug(simulatorInterfaceLoader) << "Searching for simulators in" << dir.path() << "matching pattern" << filters;
5753

5854
foreach(QString filename, dir.entryList(filters, QDir::Files)) {
59-
QLibrary * lib = new QLibrary( dir.path() + "/" + filename);
60-
61-
qCDebug(simulatorInterfaceLoader) << "Trying to register simulator in " << filename;
55+
QString simuName(filename.mid(3, filename.lastIndexOf('-') - 3));
56+
QString libPath(dir.path() + "/" + filename);
6257

63-
SimulatorFactory * factory;
64-
RegisterSimulator registerFunc = (RegisterSimulator)lib->resolve("registerSimu");
65-
66-
if (registerFunc && (factory = registerFunc())) {
67-
if (getAvailableSimulators().contains(factory->name()))
68-
continue;
69-
70-
lib->setProperty("instances_used", 0);
71-
registeredSimulators.insert(factory->name(), lib);
72-
delete factory;
73-
#if SIMULATOR_INTERFACE_LOADER_DYNAMIC
74-
lib->unload();
75-
#endif
76-
qCDebug(simulatorInterfaceLoader) << "Registered" << registeredSimulators.lastKey() << "simulator in " << lib->fileName() << "and unloaded:" << !lib->isLoaded();
77-
}
78-
else {
79-
qWarning() << "Library error" << lib->fileName() << lib->errorString();
80-
delete lib;
81-
}
58+
if (getAvailableSimulators().contains(simuName))
59+
continue;
8260

61+
registeredSimulators.insert(simuName, {libPath, nullptr});
8362
}
63+
8464
qCDebug(simulatorInterfaceLoader) << "Found libraries:" << (registeredSimulators.size() ? registeredSimulators.keys() : QStringList() << "none");
8565
return registeredSimulators.size();
8666
}
@@ -106,8 +86,10 @@ void SimulatorLoader::registerSimulators()
10686

10787
void SimulatorLoader::unregisterSimulators()
10888
{
109-
foreach(QLibrary * lib, registeredSimulators)
110-
delete lib;
89+
for(QPair<QString, QLibrary *> lib : registeredSimulators) {
90+
if (lib.second)
91+
delete lib.second;
92+
}
11193
}
11294

11395
QString SimulatorLoader::findSimulatorByName(const QString & name)
@@ -133,22 +115,29 @@ QString SimulatorLoader::findSimulatorByName(const QString & name)
133115

134116
SimulatorInterface * SimulatorLoader::loadSimulator(const QString & name)
135117
{
136-
SimulatorInterface * si = NULL;
137-
QString libname = findSimulatorByName(name);
118+
SimulatorInterface * si = nullptr;
119+
QString simuName = findSimulatorByName(name);
138120

139-
if (libname.isEmpty()) {
121+
if (simuName.isEmpty()) {
140122
qWarning() << "Simulator" << name << "not found.";
141123
return si;
142124
}
143125

144-
QLibrary * lib = registeredSimulators.value(libname, NULL);
126+
QPair<QString, QLibrary *> libInfo = registeredSimulators.value(simuName, {QString(), nullptr});
127+
QString libPath = libInfo.first;
128+
QLibrary *lib = libInfo.second;
129+
qCDebug(simulatorInterfaceLoader) << "Trying to load simulator in " << libPath;
130+
145131
if (!lib) {
146-
qWarning() << "Simulator library is NULL";
147-
return si;
132+
lib = new QLibrary(libPath);
133+
if (lib)
134+
registeredSimulators.insert(simuName, {libPath, lib});
135+
else {
136+
qWarning() << "Unable to load library";
137+
return si;
138+
}
148139
}
149140

150-
qCDebug(simulatorInterfaceLoader) << "Trying to load simulator in " << lib->fileName();
151-
152141
SimulatorFactory * factory;
153142
RegisterSimulator registerFunc = (RegisterSimulator)lib->resolve("registerSimu");
154143
if (registerFunc && (factory = registerFunc()) && (si = factory->create())) {
@@ -158,20 +147,21 @@ SimulatorInterface * SimulatorLoader::loadSimulator(const QString & name)
158147
delete factory;
159148
}
160149
else {
161-
qWarning() << "Library error" << lib->fileName() << lib->errorString();
150+
qWarning() << "Library error" << libPath << lib->errorString();
162151
}
152+
163153
return si;
164154
}
165155

166156
bool SimulatorLoader::unloadSimulator(const QString & name)
167157
{
168158
bool ret = false;
169-
#if SIMULATOR_INTERFACE_LOADER_DYNAMIC
170159
QString simuName = findSimulatorByName(name);
160+
171161
if (simuName.isEmpty())
172162
return ret;
173163

174-
QLibrary * lib = registeredSimulators.value(simuName, NULL);
164+
QLibrary * lib = registeredSimulators.value(simuName).second;
175165

176166
if (lib && lib->isLoaded()) {
177167
quint8 instance = lib->property("instances_used").toUInt();
@@ -188,9 +178,6 @@ bool SimulatorLoader::unloadSimulator(const QString & name)
188178
else {
189179
qCDebug(simulatorInterfaceLoader) << "Simulator library for " << simuName << "already unloaded.";
190180
}
191-
#else
192-
qCDebug(simulatorInterfaceLoader) << "Keeping simulator library" << simuName << "loaded.";
193-
#endif
194181

195182
return ret;
196183
}

companion/src/simulation/simulatorinterface.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,5 +218,5 @@ class SimulatorLoader
218218
typedef SimulatorFactory * (*RegisterSimulator)();
219219

220220
static int registerSimulators(const QDir & dir);
221-
static QMap<QString, QLibrary *> registeredSimulators;
221+
static QMap<QString, QPair<QString, QLibrary *>> registeredSimulators;
222222
};

0 commit comments

Comments
 (0)