diff --git a/src/driver/rcinput.cpp b/src/driver/rcinput.cpp index 070e3a6ec..e4bfb23cc 100644 --- a/src/driver/rcinput.cpp +++ b/src/driver/rcinput.cpp @@ -471,15 +471,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; } @@ -489,6 +492,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 ) @@ -497,12 +501,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 ) @@ -525,8 +531,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); @@ -536,6 +541,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 b5010bcb5..8c0893d16 100644 --- a/src/driver/rcinput.h +++ b/src/driver/rcinput.h @@ -158,6 +158,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);