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