diff options
Diffstat (limited to 'src/corelib/plugin')
-rw-r--r-- | src/corelib/plugin/qlibrary.cpp | 35 | ||||
-rw-r--r-- | src/corelib/plugin/qlibrary_p.h | 6 | ||||
-rw-r--r-- | src/corelib/plugin/qpluginloader.cpp | 7 |
3 files changed, 32 insertions, 16 deletions
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp index 9736950c89..50281b632a 100644 --- a/src/corelib/plugin/qlibrary.cpp +++ b/src/corelib/plugin/qlibrary.cpp @@ -359,7 +359,7 @@ class QLibraryStore { public: inline ~QLibraryStore(); - static inline QLibraryPrivate *findOrCreate(const QString &fileName, const QString &version); + static inline QLibraryPrivate *findOrCreate(const QString &fileName, const QString &version, QLibrary::LoadHints loadHints); static inline void releaseLibrary(QLibraryPrivate *lib); static inline void cleanup(); @@ -438,17 +438,21 @@ QLibraryStore *QLibraryStore::instance() return qt_library_data; } -inline QLibraryPrivate *QLibraryStore::findOrCreate(const QString &fileName, const QString &version) +inline QLibraryPrivate *QLibraryStore::findOrCreate(const QString &fileName, const QString &version, + QLibrary::LoadHints loadHints) { QMutexLocker locker(&qt_library_mutex); QLibraryStore *data = instance(); // check if this library is already loaded QLibraryPrivate *lib = 0; - if (Q_LIKELY(data)) + if (Q_LIKELY(data)) { lib = data->libraryMap.value(fileName); + if (lib) + lib->mergeLoadHints(loadHints); + } if (!lib) - lib = new QLibraryPrivate(fileName, version); + lib = new QLibraryPrivate(fileName, version, loadHints); // track this library if (Q_LIKELY(data)) @@ -479,21 +483,34 @@ inline void QLibraryStore::releaseLibrary(QLibraryPrivate *lib) delete lib; } -QLibraryPrivate::QLibraryPrivate(const QString &canonicalFileName, const QString &version) +QLibraryPrivate::QLibraryPrivate(const QString &canonicalFileName, const QString &version, QLibrary::LoadHints loadHints) : pHnd(0), fileName(canonicalFileName), fullVersion(version), instance(0), - loadHints(0), + loadHints(loadHints), libraryRefCount(0), libraryUnloadCount(0), pluginState(MightBeAPlugin) -{ } +{ + if (canonicalFileName.isEmpty()) + errorString = QLibrary::tr("The shared library was not found."); +} -QLibraryPrivate *QLibraryPrivate::findOrCreate(const QString &fileName, const QString &version) +QLibraryPrivate *QLibraryPrivate::findOrCreate(const QString &fileName, const QString &version, + QLibrary::LoadHints loadHints) { - return QLibraryStore::findOrCreate(fileName, version); + return QLibraryStore::findOrCreate(fileName, version, loadHints); } QLibraryPrivate::~QLibraryPrivate() { } +void QLibraryPrivate::mergeLoadHints(QLibrary::LoadHints lh) +{ + // if the library is already loaded, we can't change the load hints + if (pHnd) + return; + + loadHints = lh; +} + QFunctionPointer QLibraryPrivate::resolve(const char *symbol) { if (!pHnd) diff --git a/src/corelib/plugin/qlibrary_p.h b/src/corelib/plugin/qlibrary_p.h index 20b0c7e20f..e58d18e87b 100644 --- a/src/corelib/plugin/qlibrary_p.h +++ b/src/corelib/plugin/qlibrary_p.h @@ -94,7 +94,8 @@ public: void release(); QFunctionPointer resolve(const char *); - static QLibraryPrivate *findOrCreate(const QString &fileName, const QString &version = QString()); + static QLibraryPrivate *findOrCreate(const QString &fileName, const QString &version = QString(), + QLibrary::LoadHints loadHints = 0); static QStringList suffixes_sys(const QString &fullVersion); static QStringList prefixes_sys(); @@ -117,8 +118,9 @@ public: } private: - explicit QLibraryPrivate(const QString &canonicalFileName, const QString &version); + explicit QLibraryPrivate(const QString &canonicalFileName, const QString &version, QLibrary::LoadHints loadHints); ~QLibraryPrivate(); + void mergeLoadHints(QLibrary::LoadHints loadHints); bool load_sys(); bool unload_sys(); diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp index e4a1d725ec..2c139669e6 100644 --- a/src/corelib/plugin/qpluginloader.cpp +++ b/src/corelib/plugin/qpluginloader.cpp @@ -352,11 +352,8 @@ void QPluginLoader::setFileName(const QString &fileName) else fn = locatePlugin(fileName); - d = QLibraryPrivate::findOrCreate(fn); - d->loadHints = lh; - if (fn.isEmpty()) - d->errorString = QLibrary::tr("The shared library was not found."); - else + d = QLibraryPrivate::findOrCreate(fn, QString(), lh); + if (!fn.isEmpty()) d->updatePluginState(); #else |