From f55054ddddeecfdb28c233d42c07755667a0934c Mon Sep 17 00:00:00 2001 From: kh1 Date: Wed, 23 Nov 2011 17:27:23 +0100 Subject: Make archive info thread safe. Change-Id: Ia5090ac54d845b9c026a503cdd1ac902c353c09e Reviewed-by: Tim Jenssen --- .../3rdparty/p7zip_9.04/lib7z_facade.cpp | 37 ++++++++++++++-------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/installerbuilder/libinstaller/3rdparty/p7zip_9.04/lib7z_facade.cpp b/installerbuilder/libinstaller/3rdparty/p7zip_9.04/lib7z_facade.cpp index de84cabfa..f489cc2f7 100644 --- a/installerbuilder/libinstaller/3rdparty/p7zip_9.04/lib7z_facade.cpp +++ b/installerbuilder/libinstaller/3rdparty/p7zip_9.04/lib7z_facade.cpp @@ -588,38 +588,49 @@ public: m_cleaner->deleteLater(); } - static QMap< QIODevice*, OpenArchiveInfo* > instances; + static OpenArchiveInfo* value(QIODevice* device) + { + QMutexLocker _(&m_mutex); + if (!instances.contains(device)) + instances.insert(device, new OpenArchiveInfo(device)); + return instances.value(device); + } - static OpenArchiveInfo* instance(QIODevice* device) + static OpenArchiveInfo* take(QIODevice *device) { - if (instances[device] == 0) - instances[device] = new OpenArchiveInfo(device); - return instances[device]; + QMutexLocker _(&m_mutex); + if (instances.contains(device)) + return instances.take(device); + return 0; } - std::auto_ptr< CCodecs > codecs; - CIntVector formatIndices; CArchiveLink archiveLink; - CMyComPtr< IInStream > stream; + private: + CIntVector formatIndices; + CMyComPtr< IInStream > stream; + std::auto_ptr< CCodecs > codecs; OpenArchiveInfoCleaner *m_cleaner; + + static QMutex m_mutex; + static QMap< QIODevice*, OpenArchiveInfo* > instances; }; +QMutex OpenArchiveInfo::m_mutex; QMap< QIODevice*, OpenArchiveInfo* > OpenArchiveInfo::instances; void OpenArchiveInfoCleaner::deviceDestroyed(QObject* dev) { QIODevice* device = static_cast(dev); Q_ASSERT(device); - Q_ASSERT(OpenArchiveInfo::instances.contains(device)); - delete OpenArchiveInfo::instances.take(device); + delete OpenArchiveInfo::take(device); } QVector Lib7z::listArchive(QIODevice* archive) { assert(archive); try { - const OpenArchiveInfo* const openArchive = OpenArchiveInfo::instance(archive); + const OpenArchiveInfo* const openArchive = OpenArchiveInfo::value(archive); QVector flat; @@ -1202,7 +1213,7 @@ void Lib7z::extractArchive(QIODevice* archive, const File& item, QIODevice* targ callback = dummyCallback.get(); try { - const OpenArchiveInfo* const openArchive = OpenArchiveInfo::instance(archive); + const OpenArchiveInfo* const openArchive = OpenArchiveInfo::value(archive); const int arcIdx = item.archiveIndex.x(); if (arcIdx < 0 || arcIdx >= openArchive->archiveLink.Arcs.Size()) { @@ -1276,7 +1287,7 @@ void Lib7z::extractArchive(QIODevice* archive, const QString &targetDirectory, E DirectoryGuard outDir(fi.absolutePath()); outDir.tryCreate(); - const OpenArchiveInfo* const openArchive = OpenArchiveInfo::instance(archive); + const OpenArchiveInfo* const openArchive = OpenArchiveInfo::value(archive); for (int a = 0; a < openArchive->archiveLink.Arcs.Size(); ++a) { -- cgit v1.2.3