diff options
author | patacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679> | 2012-09-04 00:54:09 +0000 |
---|---|---|
committer | patacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679> | 2012-09-04 00:54:09 +0000 |
commit | d593a95d5adc05bbe11cc0b6d84132be2bbc70e5 (patch) | |
tree | 7bfc2aaf9a03320f24991b54a67a1db24e05f100 /nuttx/sched/work_queue.c | |
parent | 612735d392e7eab30237e67e5b0c55d2ea24cdcc (diff) | |
download | px4-firmware-d593a95d5adc05bbe11cc0b6d84132be2bbc70e5.tar.gz px4-firmware-d593a95d5adc05bbe11cc0b6d84132be2bbc70e5.tar.bz2 px4-firmware-d593a95d5adc05bbe11cc0b6d84132be2bbc70e5.zip |
Add support for multiple work queues
git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@5081 7fd9a85b-ad96-42d3-883c-3090e2eb8679
Diffstat (limited to 'nuttx/sched/work_queue.c')
-rw-r--r-- | nuttx/sched/work_queue.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/nuttx/sched/work_queue.c b/nuttx/sched/work_queue.c index beeac168d..075f08a4d 100644 --- a/nuttx/sched/work_queue.c +++ b/nuttx/sched/work_queue.c @@ -76,6 +76,7 @@ /**************************************************************************** * Public Functions ****************************************************************************/ + /**************************************************************************** * Name: work_queue * @@ -91,6 +92,7 @@ * and remove it from the work queue. * * Input parameters: + * qid - The work queue ID (index) * work - The work structure to queue * worker - The worker callback to be invoked. The callback will invoked * on the worker thread of execution. @@ -104,11 +106,13 @@ * ****************************************************************************/ -int work_queue(struct work_s *work, worker_t worker, FAR void *arg, uint32_t delay) +int work_queue(int qid, FAR struct work_s *work, worker_t worker, + FAR void *arg, uint32_t delay) { + FAR struct wqueue_s *wqueue = &g_work[qid]; irqstate_t flags; - DEBUGASSERT(work != NULL); + DEBUGASSERT(work != NULL && (unsigned)qid < NWORKERS); /* First, initialize the work structure */ @@ -123,8 +127,10 @@ int work_queue(struct work_s *work, worker_t worker, FAR void *arg, uint32_t del flags = irqsave(); work->qtime = clock_systimer(); /* Time work queued */ - dq_addlast((FAR dq_entry_t *)work, &g_work); - work_signal(); /* Wake up the worker thread */ + + dq_addlast((FAR dq_entry_t *)work, &wqueue->q); + kill(wqueue->pid, SIGWORK); /* Wake up the worker thread */ + irqrestore(flags); return OK; } |