From 2613ce696c22f9ec845e19f8de39a4db0ff70a0d Mon Sep 17 00:00:00 2001 From: Jacek Jendrzej Date: Mon, 14 Oct 2019 15:45:01 +0200 Subject: [PATCH] rcinput: use mutex, suggested by Seife Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/409b36c776be7dc072b191de121d967f88f4c00c Author: Jacek Jendrzej Date: 2019-10-14 (Mon, 14 Oct 2019) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/driver/rcinput.cpp | 12 +++++++++--- src/driver/rcinput.h | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/driver/rcinput.cpp b/src/driver/rcinput.cpp index 70ba98973..b2ee24ba3 100644 --- a/src/driver/rcinput.cpp +++ b/src/driver/rcinput.cpp @@ -475,15 +475,18 @@ int CRCInput::addTimer(uint64_t Interval, bool oneshot, bool correct_time ) _newtimer.times_out = Interval; _newtimer.correct_time = correct_time; - //printf("adding timer %d (0x%" PRIx64 ", 0x%" PRIx64 ")\n", _newtimer.id, _newtimer.times_out, Interval); + timer_mutex.lock(); + std::vector::iterator e; for ( e= timers.begin(); e!= timers.end(); ++e ) if ( e->times_out> _newtimer.times_out ) break; timers.insert(e, _newtimer); + + timer_mutex.unlock(); return _newtimer.id; } @@ -493,6 +496,7 @@ void CRCInput::killTimer(uint32_t &id) if(id == 0) return; + timer_mutex.lock(); std::vector::iterator e; for ( e= timers.begin(); e!= timers.end(); ++e ) if ( e->id == id ) @@ -501,12 +505,14 @@ void CRCInput::killTimer(uint32_t &id) break; } id = 0; + timer_mutex.unlock(); } int CRCInput::checkTimers() { int _id = 0; uint64_t timeNow = time_monotonic_us(); + timer_mutex.lock(); std::vector::iterator e; for ( e= timers.begin(); e!= timers.end(); ++e ) if ( e->times_out< timeNow+ 2000 ) @@ -529,8 +535,7 @@ int CRCInput::checkTimers() if ( e->times_out> _newtimer.times_out ) break; - if(e != timers.end()) - timers.insert(e, _newtimer); + timers.insert(e, _newtimer); } else timers.erase(e); @@ -540,6 +545,7 @@ int CRCInput::checkTimers() // else // printf("skipped timer %d %llx %llx\n",e->id,e->times_out, timeNow ); //printf("checkTimers: return %d\n", _id); + timer_mutex.unlock(); return _id; } diff --git a/src/driver/rcinput.h b/src/driver/rcinput.h index c42c2b915..a469b425d 100644 --- a/src/driver/rcinput.h +++ b/src/driver/rcinput.h @@ -162,6 +162,7 @@ class CRCInput int fd_max; __u16 rc_last_key; OpenThreads::Mutex mutex; + OpenThreads::Mutex timer_mutex; void open(bool recheck = false); bool checkpath(in_dev id);