mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-05-13 03:47:35 +08:00
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user