Gradient checker multithreading bugfix.
This is a follow-up on c/7470. GradientCheckingCostFunction calls
callback_->SetGradientErrorDetected() in its Evaluate method,
which will run in multiple threads simultaneously when enabling
this option in the solver. Thus, the string append operation
inside that method has to be protected by a mutex.
Change-Id: I314ef1df2be52595370d9af05851bf6da39bb45e
diff --git a/internal/ceres/gradient_checking_cost_function.cc b/internal/ceres/gradient_checking_cost_function.cc
index 6f0c59b..f2c7336 100644
--- a/internal/ceres/gradient_checking_cost_function.cc
+++ b/internal/ceres/gradient_checking_cost_function.cc
@@ -148,8 +148,10 @@
}
void GradientCheckingIterationCallback::SetGradientErrorDetected(
std::string& error_log) {
+ mutex_.Lock();
gradient_error_detected_ = true;
error_log_ += "\n" + error_log;
+ mutex_.Unlock();
}
CostFunction* CreateGradientCheckingCostFunction(
diff --git a/internal/ceres/gradient_checking_cost_function.h b/internal/ceres/gradient_checking_cost_function.h
index d8bbfed..f137349 100644
--- a/internal/ceres/gradient_checking_cost_function.h
+++ b/internal/ceres/gradient_checking_cost_function.h
@@ -37,6 +37,7 @@
#include "ceres/cost_function.h"
#include "ceres/iteration_callback.h"
#include "ceres/local_parameterization.h"
+#include "ceres/mutex.h"
namespace ceres {
namespace internal {
@@ -53,14 +54,17 @@
// then return SOLVER_ABORT.
virtual CallbackReturnType operator()(const IterationSummary& summary);
- // Notify this that a gradient error has occured.
+ // Notify this that a gradient error has occured (thread safe).
void SetGradientErrorDetected(std::string& error_log);
+ // Retrieve error status (not thread safe).
bool gradient_error_detected() const { return gradient_error_detected_; }
const std::string& error_log() const { return error_log_; }
private:
bool gradient_error_detected_;
std::string error_log_;
+ // Mutex protecting member variables.
+ ceres::internal::Mutex mutex_;
};
// Creates a CostFunction that checks the Jacobians that cost_function computes