Work queues: Logic that sets the queued indication and the logic that does the actual queuing must be atomic
This commit is contained in:
parent
e35737ca88
commit
4cd57e1e4e
@ -10996,4 +10996,7 @@
|
|||||||
board from Lok Tep (2015-09-29).
|
board from Lok Tep (2015-09-29).
|
||||||
* configs/nucleo-f303re: Add SSD1351 SPI 4-wire interface. From Paul
|
* configs/nucleo-f303re: Add SSD1351 SPI 4-wire interface. From Paul
|
||||||
Alexander Patience (2015-09-29).
|
Alexander Patience (2015-09-29).
|
||||||
|
* arch/arm/src/armv7-m/up_schedulesigaction.c: Fix logic that determines
|
||||||
|
if there is a pending signal action before scheduling the next signal
|
||||||
|
action. Both the test and the scheduling action need to be atomic
|
||||||
|
(2015-09-30).
|
||||||
|
2
arch
2
arch
@ -1 +1 @@
|
|||||||
Subproject commit 69721cb3742b2cb6f399c966b56da00ae3e9cb05
|
Subproject commit 22e48d4266c8c6a8d31aefabe375dcb78173975b
|
2
configs
2
configs
@ -1 +1 @@
|
|||||||
Subproject commit 5a319c2e71ccc64e4cb3ebdc6fecc535f544e260
|
Subproject commit e2bff41896393f786062d37bf12b09ec89028921
|
@ -107,16 +107,16 @@ static int work_qqueue(FAR struct usr_wqueue_s *wqueue,
|
|||||||
{
|
{
|
||||||
DEBUGASSERT(work != NULL);
|
DEBUGASSERT(work != NULL);
|
||||||
|
|
||||||
/* First, initialize the work structure */
|
|
||||||
|
|
||||||
work->worker = worker; /* Work callback */
|
|
||||||
work->arg = arg; /* Callback argument */
|
|
||||||
work->delay = delay; /* Delay until work performed */
|
|
||||||
|
|
||||||
/* Get exclusive access to the work queue */
|
/* Get exclusive access to the work queue */
|
||||||
|
|
||||||
while (work_lock() < 0);
|
while (work_lock() < 0);
|
||||||
|
|
||||||
|
/* Initialize the work structure */
|
||||||
|
|
||||||
|
work->worker = worker; /* Work callback. non-NULL means queued */
|
||||||
|
work->arg = arg; /* Callback argument */
|
||||||
|
work->delay = delay; /* Delay until work performed */
|
||||||
|
|
||||||
/* Now, time-tag that entry and put it in the work queue. */
|
/* Now, time-tag that entry and put it in the work queue. */
|
||||||
|
|
||||||
work->qtime = clock_systimer(); /* Time work queued */
|
work->qtime = clock_systimer(); /* Time work queued */
|
||||||
|
@ -109,8 +109,10 @@ static int work_qcancel(FAR struct kwork_wqueue_s *wqueue,
|
|||||||
{
|
{
|
||||||
/* A little test of the integrity of the work queue */
|
/* A little test of the integrity of the work queue */
|
||||||
|
|
||||||
DEBUGASSERT(work->dq.flink || (FAR dq_entry_t *)work == wqueue->q.tail);
|
DEBUGASSERT(work->dq.flink != NULL ||
|
||||||
DEBUGASSERT(work->dq.blink || (FAR dq_entry_t *)work == wqueue->q.head);
|
(FAR dq_entry_t *)work == wqueue->q.tail);
|
||||||
|
DEBUGASSERT(work->dq.blink != NULL ||
|
||||||
|
(FAR dq_entry_t *)work == wqueue->q.head);
|
||||||
|
|
||||||
/* Remove the entry from the work queue and make sure that it is
|
/* Remove the entry from the work queue and make sure that it is
|
||||||
* mark as available (i.e., the worker field is nullified).
|
* mark as available (i.e., the worker field is nullified).
|
||||||
|
@ -107,20 +107,20 @@ static void work_qqueue(FAR struct kwork_wqueue_s *wqueue,
|
|||||||
{
|
{
|
||||||
irqstate_t flags;
|
irqstate_t flags;
|
||||||
|
|
||||||
DEBUGASSERT(work != NULL);
|
DEBUGASSERT(work != NULL && worker != NULL);
|
||||||
|
|
||||||
/* First, initialize the work structure */
|
/* First, initialize the work structure. This must be done with interrupts
|
||||||
|
* disabled. This permits this function to be called from with task logic
|
||||||
work->worker = worker; /* Work callback */
|
* or interrupt handlers.
|
||||||
work->arg = arg; /* Callback argument */
|
|
||||||
work->delay = delay; /* Delay until work performed */
|
|
||||||
|
|
||||||
/* Now, time-tag that entry and put it in the work queue. This must be
|
|
||||||
* done with interrupts disabled. This permits this function to be called
|
|
||||||
* from with task logic or interrupt handlers.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
flags = irqsave();
|
flags = irqsave();
|
||||||
|
work->worker = worker; /* Work callback. non-NULL means queued */
|
||||||
|
work->arg = arg; /* Callback argument */
|
||||||
|
work->delay = delay; /* Delay until work performed */
|
||||||
|
|
||||||
|
/* Now, time-tag that entry and put it in the work queue */
|
||||||
|
|
||||||
work->qtime = clock_systimer(); /* Time work queued */
|
work->qtime = clock_systimer(); /* Time work queued */
|
||||||
|
|
||||||
dq_addlast((FAR dq_entry_t *)work, &wqueue->q);
|
dq_addlast((FAR dq_entry_t *)work, &wqueue->q);
|
||||||
|
Loading…
Reference in New Issue
Block a user