From ca4f0e5239c38ac3329f2359f6e66d410a4d73c2 Mon Sep 17 00:00:00 2001 From: Hombre Date: Sat, 14 Jul 2018 15:52:43 +0200 Subject: [PATCH] Add mutex to the Lensfun library access. (try to fix #4580) --- rtengine/rtlensfun.cc | 15 +++++++++++++-- rtengine/rtlensfun.h | 2 ++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 8216f0b83..792a86b61 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -33,6 +33,7 @@ extern const Settings *settings; LFModifier::~LFModifier() { if (data_) { + MyMutex::MyLock lock(*lfModifierMutex); data_->Destroy(); } } @@ -56,7 +57,7 @@ void LFModifier::correctDistortion(double &x, double &y, int cx, int cy, double if (swap_xy_) { std::swap(xx, yy); } - if (data_->ApplyGeometryDistortion(xx, yy, 1, 1, pos)) { + if (data_->ApplyGeometryDistortion(xx, yy, 1, 1, pos)) { // This is thread-safe x = pos[0]; y = pos[1]; if (swap_xy_) { @@ -95,7 +96,7 @@ void LFModifier::correctCA(double &x, double &y, int cx, int cy, int channel) co if (swap_xy_) { std::swap(x, y); } - data_->ApplySubpixelDistortion(x, y, 1, 1, pos); + data_->ApplySubpixelDistortion(x, y, 1, 1, pos); // This is thread-safe x = pos[2*channel]; y = pos[2*channel+1]; if (swap_xy_) { @@ -112,12 +113,14 @@ void LFModifier::correctCA(double &x, double &y, int cx, int cy, int channel) co void LFModifier::processVignetteLine(int width, int y, float *line) const { + MyMutex::MyLock lock(*lfModifierMutex); data_->ApplyColorModification(line, 0, y, width, 1, LF_CR_1(INTENSITY), 0); } void LFModifier::processVignetteLine3Channels(int width, int y, float *line) const { + MyMutex::MyLock lock(*lfModifierMutex); data_->ApplyColorModification(line, 0, y, width, 1, LF_CR_3(RED, GREEN, BLUE), 0); } @@ -157,6 +160,7 @@ LFModifier::LFModifier(lfModifier *m, bool swap_xy, int flags): swap_xy_(swap_xy), flags_(flags) { + lfModifierMutex = new MyMutex; } @@ -374,12 +378,14 @@ bool LFDatabase::LoadDirectory(const char *dirname) LFDatabase::LFDatabase(): data_(nullptr) { + lfDBMutex = new MyMutex; } LFDatabase::~LFDatabase() { if (data_) { + MyMutex::MyLock lock(*lfDBMutex); data_->Destroy(); } } @@ -395,6 +401,7 @@ std::vector LFDatabase::getCameras() const { std::vector ret; if (data_) { + MyMutex::MyLock lock(*lfDBMutex); auto cams = data_->GetCameras(); while (*cams) { ret.emplace_back(); @@ -410,6 +417,7 @@ std::vector LFDatabase::getLenses() const { std::vector ret; if (data_) { + MyMutex::MyLock lock(*lfDBMutex); auto lenses = data_->GetLenses(); while (*lenses) { ret.emplace_back(); @@ -425,6 +433,7 @@ LFCamera LFDatabase::findCamera(const Glib::ustring &make, const Glib::ustring & { LFCamera ret; if (data_) { + MyMutex::MyLock lock(*lfDBMutex); auto found = data_->FindCamerasExt(make.c_str(), model.c_str()); if (found) { ret.data_ = found[0]; @@ -439,6 +448,7 @@ LFLens LFDatabase::findLens(const LFCamera &camera, const Glib::ustring &name) c { LFLens ret; if (data_) { + MyMutex::MyLock lock(*lfDBMutex); auto found = data_->FindLenses(camera.data_, nullptr, name.c_str()); for (size_t pos = 0; !found && pos < name.size(); ) { // try to split the maker from the model of the lens -- we have to @@ -476,6 +486,7 @@ std::unique_ptr LFDatabase::getModifier(const LFCamera &camera, cons { std::unique_ptr ret; if (data_) { + MyMutex::MyLock lock(*lfDBMutex); if (camera && lens) { lfModifier *mod = lfModifier::Create(lens.data_, camera.getCropFactor(), width, height); int flags = LF_MODIFY_DISTORTION | LF_MODIFY_SCALE | LF_MODIFY_TCA; diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index 7690ef544..f75f25d4f 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -57,6 +57,7 @@ private: lfModifier *data_; bool swap_xy_; int flags_; + MyMutex *lfModifierMutex; }; class LFCamera final @@ -121,6 +122,7 @@ private: LFDatabase(); bool LoadDirectory(const char *dirname); + MyMutex *lfDBMutex; static LFDatabase instance_; lfDatabase *data_; };