mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-06-01 19:07:45 +08:00
posix: HRT hrt_lock() sem_wait try again if error returned
This commit is contained in:
@@ -123,7 +123,7 @@ int hrt_work_queue(struct work_s *work, worker_t worker, void *arg, uint32_t del
|
|||||||
work->qtime = hrt_absolute_time(); /* Time work queued */
|
work->qtime = hrt_absolute_time(); /* Time work queued */
|
||||||
//PX4_INFO("hrt work_queue adding work delay=%u time=%lu", delay, work->qtime);
|
//PX4_INFO("hrt work_queue adding work delay=%u time=%lu", delay, work->qtime);
|
||||||
|
|
||||||
dq_addlast((dq_entry_t *)work, &wqueue->q);
|
dq_addlast(&work->dq, &wqueue->q);
|
||||||
|
|
||||||
if (px4_getpid() != wqueue->pid) { /* only need to wake up if called from a different thread */
|
if (px4_getpid() != wqueue->pid) { /* only need to wake up if called from a different thread */
|
||||||
#ifdef __PX4_QURT
|
#ifdef __PX4_QURT
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ static void hrt_work_process()
|
|||||||
if (elapsed >= work->delay) {
|
if (elapsed >= work->delay) {
|
||||||
/* Remove the ready-to-execute work from the list */
|
/* Remove the ready-to-execute work from the list */
|
||||||
|
|
||||||
(void)dq_rem((struct dq_entry_s *) & (work->dq), &(wqueue->q));
|
(void)dq_rem((dq_entry_t *)&work->dq, &wqueue->q);
|
||||||
//PX4_INFO("Dequeued work=%p", work);
|
//PX4_INFO("Dequeued work=%p", work);
|
||||||
|
|
||||||
/* Extract the work description from the entry (in case the work
|
/* Extract the work description from the entry (in case the work
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ void hrt_work_cancel(struct work_s *work)
|
|||||||
* mark as availalbe (i.e., the worker field is nullified).
|
* mark as availalbe (i.e., the worker field is nullified).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
dq_rem((dq_entry_t *)work, &wqueue->q);
|
dq_rem(&work->dq, &wqueue->q);
|
||||||
work->worker = NULL;
|
work->worker = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -95,7 +95,8 @@ hrt_abstime hrt_absolute_time_offset()
|
|||||||
|
|
||||||
static void hrt_lock()
|
static void hrt_lock()
|
||||||
{
|
{
|
||||||
px4_sem_wait(&_hrt_lock);
|
// loop as the wait may be interrupted by a signal
|
||||||
|
do {} while (px4_sem_wait(&_hrt_lock) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hrt_unlock()
|
static void hrt_unlock()
|
||||||
@@ -333,7 +334,7 @@ hrt_call_reschedule()
|
|||||||
// Remove the existing expiry and update with the new expiry
|
// Remove the existing expiry and update with the new expiry
|
||||||
hrt_work_cancel(&_hrt_work);
|
hrt_work_cancel(&_hrt_work);
|
||||||
|
|
||||||
hrt_work_queue(&_hrt_work, (worker_t)&hrt_tim_isr, nullptr, delay);
|
hrt_work_queue(&_hrt_work, &hrt_tim_isr, nullptr, delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
Reference in New Issue
Block a user