WorkQueue: avoid potential semaphore counter overflow

This could happen in the following cases:
- IRQ/publisher rate is faster than the processing rate, and therefore
  WorkQueue::Add is called at a higher rate
- a long-running or stuck task that blocks the work queue a long time

Both cases are not expected to happen under 'normal' circumstances (if the
system runs as expected).
This commit is contained in:
Beat Küng
2019-10-16 11:48:14 +02:00
committed by Julian Oes
parent 2296c9acfa
commit 25aded36ec
2 changed files with 14 additions and 5 deletions
+12 -5
View File
@@ -99,9 +99,7 @@ WorkQueue::Detach(WorkItem *item)
PX4_DEBUG("stopping: %s, last active WorkItem closing", _config.name);
request_stop();
// Wake up the worker thread
px4_sem_post(&_process_lock);
signal_worker_thread();
}
work_unlock();
@@ -114,8 +112,17 @@ WorkQueue::Add(WorkItem *item)
_q.push(item);
work_unlock();
// Wake up the worker thread
px4_sem_post(&_process_lock);
signal_worker_thread();
}
void
WorkQueue::signal_worker_thread()
{
int sem_val;
if (px4_sem_getvalue(&_process_lock, &sem_val) == 0 && sem_val <= 0) {
px4_sem_post(&_process_lock);
}
}
void