diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2017-12-10 00:17:57 +0100 |
---|---|---|
committer | Robert C. Helling <helling@atdotde.de> | 2017-12-10 15:00:53 +0100 |
commit | 92ad7865d0f5269bfe12471b062fbda3bb373b7f (patch) | |
tree | 2e799a5cb764b1349e572bdcc3f4b83f1d954dec /qt-models | |
parent | c73828d6055db664354ae5d1b2637d379294ef8a (diff) | |
download | subsurface-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.cpp | 20 |
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() |