summaryrefslogtreecommitdiffstats
path: root/qt-models
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2017-12-10 00:17:57 +0100
committerGravatar Robert C. Helling <helling@atdotde.de>2017-12-10 15:00:53 +0100
commit92ad7865d0f5269bfe12471b062fbda3bb373b7f (patch)
tree2e799a5cb764b1349e572bdcc3f4b83f1d954dec /qt-models
parentc73828d6055db664354ae5d1b2637d379294ef8a (diff)
downloadsubsurface-92ad7865d0f5269bfe12471b062fbda3bb373b7f.tar.gz
Make thumbnail code threadsafe
The thumbnailing in qt-models/divepicturemodel.cpp was performed concurrently, but the thumbnailCache was not protected from races. Resolve this by guarding the thumbnalCache accesses with mutexes. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'qt-models')
-rw-r--r--qt-models/divepicturemodel.cpp20
1 files changed, 13 insertions, 7 deletions
diff --git a/qt-models/divepicturemodel.cpp b/qt-models/divepicturemodel.cpp
index d135e0faa..41035aba2 100644
--- a/qt-models/divepicturemodel.cpp
+++ b/qt-models/divepicturemodel.cpp
@@ -8,20 +8,26 @@
#include <QtConcurrent>
extern QHash <QString, QImage> thumbnailCache;
+static QMutex thumbnailMutex;
void scaleImages(PictureEntry &entry)
{
+ QMutexLocker l(&thumbnailMutex);
if (thumbnailCache.contains(entry.filename) && !thumbnailCache.value(entry.filename).isNull()) {
entry.image = thumbnailCache.value(entry.filename);
- } else {
- int dim = defaultIconMetrics().sz_pic;
- QImage p = SHashedImage(entry.picture);
- if(!p.isNull()) {
- p = p.scaled(dim, dim, Qt::KeepAspectRatio);
+ return;
+ }
+ l.unlock();
+
+ int dim = defaultIconMetrics().sz_pic;
+ QImage p = SHashedImage(entry.picture);
+ if(!p.isNull()) {
+ p = p.scaled(dim, dim, Qt::KeepAspectRatio);
+ QMutexLocker l(&thumbnailMutex);
+ if (!thumbnailCache.contains(entry.filename))
thumbnailCache.insert(entry.filename, p);
- }
- entry.image = p;
}
+ entry.image = p;
}
DivePictureModel *DivePictureModel::instance()