Lines Matching full:queue
16 rt_inline rt_err_t _workqueue_work_completion(struct rt_workqueue *queue) in _workqueue_work_completion() argument
24 result = rt_sem_trytake(&(queue->sem)); in _workqueue_work_completion()
28 rt_sem_release(&(queue->sem)); in _workqueue_work_completion()
51 struct rt_workqueue* queue; in _workqueue_thread_entry() local
53 queue = (struct rt_workqueue*) parameter; in _workqueue_thread_entry()
54 RT_ASSERT(queue != RT_NULL); in _workqueue_thread_entry()
58 if (rt_list_isempty(&(queue->work_list))) in _workqueue_thread_entry()
67 work = rt_list_entry(queue->work_list.next, struct rt_work, list); in _workqueue_thread_entry()
69 queue->work_current = work; in _workqueue_thread_entry()
76 queue->work_current = RT_NULL; in _workqueue_thread_entry()
80 _workqueue_work_completion(queue); in _workqueue_thread_entry()
86 struct rt_workqueue *queue = RT_NULL; in rt_workqueue_create() local
88 queue = (struct rt_workqueue*)RT_KERNEL_MALLOC(sizeof(struct rt_workqueue)); in rt_workqueue_create()
89 if (queue != RT_NULL) in rt_workqueue_create()
92 rt_list_init(&(queue->work_list)); in rt_workqueue_create()
93 queue->work_current = RT_NULL; in rt_workqueue_create()
94 rt_sem_init(&(queue->sem), "wqueue", 0, RT_IPC_FLAG_FIFO); in rt_workqueue_create()
97 …queue->work_thread = rt_thread_create(name, _workqueue_thread_entry, queue, stack_size, priority, … in rt_workqueue_create()
98 if (queue->work_thread == RT_NULL) in rt_workqueue_create()
100 RT_KERNEL_FREE(queue); in rt_workqueue_create()
104 rt_thread_startup(queue->work_thread); in rt_workqueue_create()
107 return queue; in rt_workqueue_create()
110 rt_err_t rt_workqueue_destroy(struct rt_workqueue* queue) in rt_workqueue_destroy() argument
112 RT_ASSERT(queue != RT_NULL); in rt_workqueue_destroy()
114 rt_thread_delete(queue->work_thread); in rt_workqueue_destroy()
115 RT_KERNEL_FREE(queue); in rt_workqueue_destroy()
120 rt_err_t rt_workqueue_dowork(struct rt_workqueue* queue, struct rt_work* work) in rt_workqueue_dowork() argument
123 RT_ASSERT(queue != RT_NULL); in rt_workqueue_dowork()
127 if (queue->work_current == work) in rt_workqueue_dowork()
136 rt_list_insert_after(queue->work_list.prev, &(work->list)); in rt_workqueue_dowork()
138 if (queue->work_current == RT_NULL) in rt_workqueue_dowork()
142 rt_thread_resume(queue->work_thread); in rt_workqueue_dowork()
150 rt_err_t rt_workqueue_critical_work(struct rt_workqueue* queue, struct rt_work* work) in rt_workqueue_critical_work() argument
153 RT_ASSERT(queue != RT_NULL); in rt_workqueue_critical_work()
157 if (queue->work_current == work) in rt_workqueue_critical_work()
166 rt_list_insert_after(queue->work_list.prev, &(work->list)); in rt_workqueue_critical_work()
167 if (queue->work_current == RT_NULL) in rt_workqueue_critical_work()
171 rt_thread_resume(queue->work_thread); in rt_workqueue_critical_work()
179 rt_err_t rt_workqueue_cancel_work(struct rt_workqueue* queue, struct rt_work* work) in rt_workqueue_cancel_work() argument
183 RT_ASSERT(queue != RT_NULL); in rt_workqueue_cancel_work()
187 if (queue->work_current == work) in rt_workqueue_cancel_work()
198 rt_err_t rt_workqueue_cancel_work_sync(struct rt_workqueue* queue, struct rt_work* work) in rt_workqueue_cancel_work_sync() argument
202 RT_ASSERT(queue != RT_NULL); in rt_workqueue_cancel_work_sync()
206 if (queue->work_current == work) /* it's current work in the queue */ in rt_workqueue_cancel_work_sync()
209 rt_sem_take(&(queue->sem), RT_WAITING_FOREVER); in rt_workqueue_cancel_work_sync()
220 rt_err_t rt_workqueue_cancel_all_work(struct rt_workqueue* queue) in rt_workqueue_cancel_all_work() argument
223 RT_ASSERT(queue != RT_NULL); in rt_workqueue_cancel_all_work()
226 for (node = queue->work_list.next; node != &(queue->work_list); node = next) in rt_workqueue_cancel_all_work()