summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkh1 <karsten.heimrich@nokia.com>2011-11-23 17:27:23 +0100
committerTim Jenssen <tim.jenssen@nokia.com>2011-11-23 20:21:47 +0100
commitf55054ddddeecfdb28c233d42c07755667a0934c (patch)
treea5ff292afd204e1d4eef2d1faa28b03c9062f300
parente99d393cd5604f4572a7e8c3ef7eecab1cd9b6ba (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.cpp37
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)
{