From 7553ba1b2a778a6ccaf7926fecbcc50b45a11666 Mon Sep 17 00:00:00 2001
From: Jeremie Deray <jeremie.deray@pal-robotics.com>
Date: Mon, 30 Oct 2017 17:04:21 +0100
Subject: [PATCH] add mutex to ProcessorBase and use it in
 ProcessorMotion::keyFrameCallback

---
 src/processor_base.h     |  5 +++++
 src/processor_motion.cpp | 14 ++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/src/processor_base.h b/src/processor_base.h
index f87df2394..97c730db7 100644
--- a/src/processor_base.h
+++ b/src/processor_base.h
@@ -40,6 +40,9 @@ class ProcessorBase : public NodeBase, public std::enable_shared_from_this<Proce
         static unsigned int processor_id_count_;
 
     public:
+
+        using mutex_t = std::recursive_timed_mutex;
+
         ProcessorBase(const std::string& _type, const Scalar& _time_tolerance = 0);
         virtual ~ProcessorBase();
         void remove();
@@ -92,6 +95,8 @@ class ProcessorBase : public NodeBase, public std::enable_shared_from_this<Proce
     protected:
         unsigned int processor_id_;
         Scalar time_tolerance_;         ///< self time tolerance for adding a capture into a frame
+
+        mutex_t mut_;
 };
 
 }
diff --git a/src/processor_motion.cpp b/src/processor_motion.cpp
index 227f476e0..f4dd03469 100644
--- a/src/processor_motion.cpp
+++ b/src/processor_motion.cpp
@@ -41,6 +41,8 @@ void ProcessorMotion::process(CaptureBasePtr _incoming_ptr)
     return;
   }
 
+  std::lock_guard<mutex_t> lock(mut_);
+
     if (status_ == IDLE)
     {
 //        std::cout << "PM: IDLE" << std::endl;
@@ -228,6 +230,18 @@ bool ProcessorMotion::keyFrameCallback(FrameBasePtr _new_keyframe, const Scalar&
     assert(_new_keyframe->getTrajectoryPtr() != nullptr
             && "ProcessorMotion::keyFrameCallback: key frame must be in the trajectory.");
 
+    using rep_t = std::chrono::milliseconds::rep;
+
+    // Tying to self-lock the mutex for duration == _time_tol_other
+    if (!timed_mut_.try_lock_for(std::chrono::milliseconds(rep_t(_time_tol_other))))
+    {
+      WOLF_DEBUG("ProcessorMotion::keyFrameCallback could not acquire the mutex on time.");
+      return false;
+    }
+
+    // Lock object takes ownership of the mutex
+    std::lock_guard<mutex_t> lock(timed_mut_, std::adopt_lock);
+
     // get keyframe's time stamp
     TimeStamp new_ts = _new_keyframe->getTimeStamp();
 
-- 
GitLab