diff options
Diffstat (limited to 'src/corelib/plugin/qlibrary.cpp')
-rw-r--r-- | src/corelib/plugin/qlibrary.cpp | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp index 468f759189..9736950c89 100644 --- a/src/corelib/plugin/qlibrary.cpp +++ b/src/corelib/plugin/qlibrary.cpp @@ -374,6 +374,7 @@ private: static QBasicMutex qt_library_mutex; static QLibraryStore *qt_library_data = 0; +static bool qt_library_data_once; QLibraryStore::~QLibraryStore() { @@ -429,8 +430,11 @@ Q_DESTRUCTOR_FUNCTION(qlibraryCleanup) // must be called with a locked mutex QLibraryStore *QLibraryStore::instance() { - if (Q_UNLIKELY(!qt_library_data)) + if (Q_UNLIKELY(!qt_library_data_once && !qt_library_data)) { + // only create once per process lifetime qt_library_data = new QLibraryStore; + qt_library_data_once = true; + } return qt_library_data; } @@ -440,12 +444,15 @@ inline QLibraryPrivate *QLibraryStore::findOrCreate(const QString &fileName, con QLibraryStore *data = instance(); // check if this library is already loaded - QLibraryPrivate *lib = data->libraryMap.value(fileName); + QLibraryPrivate *lib = 0; + if (Q_LIKELY(data)) + lib = data->libraryMap.value(fileName); if (!lib) lib = new QLibraryPrivate(fileName, version); // track this library - data->libraryMap.insert(fileName, lib); + if (Q_LIKELY(data)) + data->libraryMap.insert(fileName, lib); lib->libraryRefCount.ref(); return lib; @@ -464,9 +471,11 @@ inline void QLibraryStore::releaseLibrary(QLibraryPrivate *lib) // no one else is using Q_ASSERT(lib->libraryUnloadCount.load() == 0); - QLibraryPrivate *that = data->libraryMap.take(lib->fileName); - Q_ASSERT(lib == that); - Q_UNUSED(that); + if (Q_LIKELY(data)) { + QLibraryPrivate *that = data->libraryMap.take(lib->fileName); + Q_ASSERT(lib == that); + Q_UNUSED(that); + } delete lib; } |