Work queues: Logic that sets the queued indication and the logic that does the actual queuing must be atomic

This commit is contained in:
Gregory Nutt
2015-09-30 11:04:29 -06:00
parent e35737ca88
commit 4cd57e1e4e
6 changed files with 26 additions and 21 deletions
+10 -10
View File
@@ -107,20 +107,20 @@ static void work_qqueue(FAR struct kwork_wqueue_s *wqueue,
{
irqstate_t flags;
DEBUGASSERT(work != NULL);
DEBUGASSERT(work != NULL && worker != NULL);
/* First, initialize the work structure */
work->worker = worker; /* Work callback */
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.
/* First, initialize the work structure. This must be done with interrupts
* disabled. This permits this function to be called from with task logic
* or interrupt handlers.
*/
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 */
dq_addlast((FAR dq_entry_t *)work, &wqueue->q);