diff options
author | kh1 <karsten.heimrich@nokia.com> | 2011-11-23 17:27:23 +0100 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@nokia.com> | 2011-11-23 20:21:47 +0100 |
commit | f55054ddddeecfdb28c233d42c07755667a0934c (patch) | |
tree | a5ff292afd204e1d4eef2d1faa28b03c9062f300 | |
parent | e99d393cd5604f4572a7e8c3ef7eecab1cd9b6ba (diff) |
Make archive info thread safe.
Change-Id: Ia5090ac54d845b9c026a503cdd1ac902c353c09e
Reviewed-by: Tim Jenssen <tim.jenssen@nokia.com>
-rw-r--r-- | installerbuilder/libinstaller/3rdparty/p7zip_9.04/lib7z_facade.cpp | 37 |
1 files 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<QIODevice*>(dev); Q_ASSERT(device); - Q_ASSERT(OpenArchiveInfo::instances.contains(device)); - delete OpenArchiveInfo::instances.take(device); + delete OpenArchiveInfo::take(device); } QVector<File> Lib7z::listArchive(QIODevice* archive) { assert(archive); try { - const OpenArchiveInfo* const openArchive = OpenArchiveInfo::instance(archive); + const OpenArchiveInfo* const openArchive = OpenArchiveInfo::value(archive); QVector<File> 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) { |