diff options
| author | bernard <[email protected]> | 2017-01-31 13:17:04 +0800 |
|---|---|---|
| committer | bernard <[email protected]> | 2017-01-31 13:17:04 +0800 |
| commit | b4757b950f154b839ef4072160df11828e631b9a (patch) | |
| tree | 7cdf48efc73cf952af576dfb9e5afcbddb917560 /components/drivers/src | |
| parent | 385792bb6870e3f86491be0ec6a100054ccaa75e (diff) | |
[DeviceDrivers] Add critical_work for wqueue.
Diffstat (limited to 'components/drivers/src')
| -rw-r--r-- | components/drivers/src/workqueue.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/components/drivers/src/workqueue.c b/components/drivers/src/workqueue.c index d9062e6cdb..f1aa8c3319 100644 --- a/components/drivers/src/workqueue.c +++ b/components/drivers/src/workqueue.c @@ -86,6 +86,28 @@ rt_err_t rt_workqueue_dowork(struct rt_workqueue* queue, struct rt_work* work) return RT_EOK; } +rt_err_t rt_workqueue_critical_work(struct rt_workqueue* queue, struct rt_work* work) +{ + RT_ASSERT(queue != RT_NULL); + RT_ASSERT(work != RT_NULL); + + rt_enter_critical(); + /* NOTE: the work MUST be initialized firstly */ + rt_list_remove(&(work->list)); + + rt_list_insert_after(queue->work_list.prev, &(work->list)); + if (queue->work_thread->stat != RT_THREAD_READY) + { + rt_exit_critical(); + /* resume work thread */ + rt_thread_resume(queue->work_thread); + rt_schedule(); + } + else rt_exit_critical(); + + return RT_EOK; +} + rt_err_t rt_workqueue_cancel_work(struct rt_workqueue* queue, struct rt_work* work) { RT_ASSERT(queue != RT_NULL); @@ -98,5 +120,21 @@ rt_err_t rt_workqueue_cancel_work(struct rt_workqueue* queue, struct rt_work* wo return RT_EOK; } +rt_err_t rt_workqueue_cancel_all_work(struct rt_workqueue* queue) +{ + struct rt_list_node *node, *next; + RT_ASSERT(queue != RT_NULL); + + rt_enter_critical(); + for (node = queue->work_list.next; node != &(queue->work_list); node = next) + { + next = node->next; + rt_list_remove(node); + } + rt_exit_critical(); + + return RT_EOK; +} + #endif |
