Commit b3b9f74b authored by Julien Osman's avatar Julien Osman
Browse files

FIX: Add locks to otbGDALRPCTransformer to prevent multi-thread concurrency

parent a2b344e6
...@@ -133,6 +133,7 @@ bool GDALRPCTransformer::ForwardTransform(double* x, double* y, double* z, int n ...@@ -133,6 +133,7 @@ bool GDALRPCTransformer::ForwardTransform(double* x, double* y, double* z, int n
if (this->m_Modified) if (this->m_Modified)
this->Update(); this->Update();
std::vector<int> success(nPointCount); std::vector<int> success(nPointCount);
const std::lock_guard<std::mutex> lock(m_Mutex);
GDALRPCTransform(this->m_TransformArg, false, nPointCount, x, y, z, success.data()); GDALRPCTransform(this->m_TransformArg, false, nPointCount, x, y, z, success.data());
bool finalSuccess = std::all_of(success.begin(), success.end(), [](int i){return i;}); bool finalSuccess = std::all_of(success.begin(), success.end(), [](int i){return i;});
return finalSuccess; return finalSuccess;
...@@ -143,6 +144,7 @@ GDALRPCTransformer::PointType GDALRPCTransformer::ForwardTransform(GDALRPCTransf ...@@ -143,6 +144,7 @@ GDALRPCTransformer::PointType GDALRPCTransformer::ForwardTransform(GDALRPCTransf
if (m_Modified) if (m_Modified)
this->Update(); this->Update();
int success; int success;
const std::lock_guard<std::mutex> lock(m_Mutex);
GDALRPCTransform(this->m_TransformArg, false, 1, &p[0], &p[1], &p[2], &success); GDALRPCTransform(this->m_TransformArg, false, 1, &p[0], &p[1], &p[2], &success);
if (!success) if (!success)
throw std::runtime_error("GDALRPCTransform was not able to process the ForwardTransform."); throw std::runtime_error("GDALRPCTransform was not able to process the ForwardTransform.");
...@@ -158,6 +160,7 @@ bool GDALRPCTransformer::InverseTransform(double* x, double* y, double* z, int n ...@@ -158,6 +160,7 @@ bool GDALRPCTransformer::InverseTransform(double* x, double* y, double* z, int n
if (this->m_Modified) if (this->m_Modified)
this->Update(); this->Update();
std::vector<int> success(nPointCount); std::vector<int> success(nPointCount);
const std::lock_guard<std::mutex> lock(m_Mutex);
GDALRPCTransform(this->m_TransformArg, true, nPointCount, x, y, z, success.data()); GDALRPCTransform(this->m_TransformArg, true, nPointCount, x, y, z, success.data());
bool finalSuccess = std::all_of(success.begin(), success.end(), [](int i){return i;}); bool finalSuccess = std::all_of(success.begin(), success.end(), [](int i){return i;});
return finalSuccess; return finalSuccess;
...@@ -168,6 +171,7 @@ GDALRPCTransformer::PointType GDALRPCTransformer::InverseTransform(GDALRPCTransf ...@@ -168,6 +171,7 @@ GDALRPCTransformer::PointType GDALRPCTransformer::InverseTransform(GDALRPCTransf
if (m_Modified) if (m_Modified)
this->Update(); this->Update();
int success; int success;
const std::lock_guard<std::mutex> lock(m_Mutex);
GDALRPCTransform(this->m_TransformArg, true, 1, &p[0], &p[1], &p[2], &success); GDALRPCTransform(this->m_TransformArg, true, 1, &p[0], &p[1], &p[2], &success);
if (!success) if (!success)
throw std::runtime_error("GDALRPCTransform was not able to process the InverseTransform."); throw std::runtime_error("GDALRPCTransform was not able to process the InverseTransform.");
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment