Lines Matching refs:queue

21 rt_inline rt_err_t _workqueue_work_completion(struct rt_workqueue *queue)  in _workqueue_work_completion()  argument
28 result = rt_sem_trytake(&(queue->sem)); in _workqueue_work_completion()
32 rt_sem_release(&(queue->sem)); in _workqueue_work_completion()
54 struct rt_workqueue *queue; in _workqueue_thread_entry() local
60 queue = (struct rt_workqueue *)parameter; in _workqueue_thread_entry()
61 RT_ASSERT(queue != RT_NULL); in _workqueue_thread_entry()
65 level = rt_spin_lock_irqsave(&(queue->spinlock)); in _workqueue_thread_entry()
70 while (!rt_list_isempty(&(queue->delayed_list))) in _workqueue_thread_entry()
72 work = rt_list_entry(queue->delayed_list.next, struct rt_work, list); in _workqueue_thread_entry()
76 rt_list_insert_after(queue->work_list.prev, &(work->list)); in _workqueue_thread_entry()
87 if (rt_list_isempty(&(queue->work_list))) in _workqueue_thread_entry()
89 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in _workqueue_thread_entry()
91 rt_completion_wait(&(queue->wakeup_completion), delay_tick); in _workqueue_thread_entry()
96 work = rt_list_entry(queue->work_list.next, struct rt_work, list); in _workqueue_thread_entry()
98 queue->work_current = work; in _workqueue_thread_entry()
103 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in _workqueue_thread_entry()
108 queue->work_current = RT_NULL; in _workqueue_thread_entry()
111 _workqueue_work_completion(queue); in _workqueue_thread_entry()
115 static rt_err_t _workqueue_submit_work(struct rt_workqueue *queue, in _workqueue_submit_work() argument
123 level = rt_spin_lock_irqsave(&(queue->spinlock)); in _workqueue_submit_work()
130 rt_list_insert_after(queue->work_list.prev, &(work->list)); in _workqueue_submit_work()
132 work->workqueue = queue; in _workqueue_submit_work()
134 rt_completion_done(&(queue->wakeup_completion)); in _workqueue_submit_work()
141 work->workqueue = queue; in _workqueue_submit_work()
144 list_tmp = &(queue->delayed_list); in _workqueue_submit_work()
157 rt_completion_done(&(queue->wakeup_completion)); in _workqueue_submit_work()
164 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in _workqueue_submit_work()
168 static rt_err_t _workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work) in _workqueue_cancel_work() argument
173 level = rt_spin_lock_irqsave(&(queue->spinlock)); in _workqueue_cancel_work()
176 err = queue->work_current != work ? RT_EOK : -RT_EBUSY; in _workqueue_cancel_work()
178 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in _workqueue_cancel_work()
219 struct rt_workqueue *queue = RT_NULL; in rt_workqueue_create() local
221 queue = (struct rt_workqueue *)RT_KERNEL_MALLOC(sizeof(struct rt_workqueue)); in rt_workqueue_create()
222 if (queue != RT_NULL) in rt_workqueue_create()
225 rt_list_init(&(queue->work_list)); in rt_workqueue_create()
226 rt_list_init(&(queue->delayed_list)); in rt_workqueue_create()
227 queue->work_current = RT_NULL; in rt_workqueue_create()
228 rt_sem_init(&(queue->sem), "wqueue", 0, RT_IPC_FLAG_FIFO); in rt_workqueue_create()
229 rt_completion_init(&(queue->wakeup_completion)); in rt_workqueue_create()
232queue->work_thread = rt_thread_create(name, _workqueue_thread_entry, queue, stack_size, priority, … in rt_workqueue_create()
233 if (queue->work_thread == RT_NULL) in rt_workqueue_create()
235 rt_sem_detach(&(queue->sem)); in rt_workqueue_create()
236 RT_KERNEL_FREE(queue); in rt_workqueue_create()
240 rt_spin_lock_init(&(queue->spinlock)); in rt_workqueue_create()
241 rt_thread_startup(queue->work_thread); in rt_workqueue_create()
244 return queue; in rt_workqueue_create()
254 rt_err_t rt_workqueue_destroy(struct rt_workqueue *queue) in rt_workqueue_destroy() argument
256 RT_ASSERT(queue != RT_NULL); in rt_workqueue_destroy()
258 rt_workqueue_cancel_all_work(queue); in rt_workqueue_destroy()
259 rt_thread_delete(queue->work_thread); in rt_workqueue_destroy()
260 rt_sem_detach(&(queue->sem)); in rt_workqueue_destroy()
261 RT_KERNEL_FREE(queue); in rt_workqueue_destroy()
275 rt_err_t rt_workqueue_dowork(struct rt_workqueue *queue, struct rt_work *work) in rt_workqueue_dowork() argument
277 RT_ASSERT(queue != RT_NULL); in rt_workqueue_dowork()
280 return _workqueue_submit_work(queue, work, 0); in rt_workqueue_dowork()
297 rt_err_t rt_workqueue_submit_work(struct rt_workqueue *queue, struct rt_work *work, rt_tick_t ticks) in rt_workqueue_submit_work() argument
299 RT_ASSERT(queue != RT_NULL); in rt_workqueue_submit_work()
303 return _workqueue_submit_work(queue, work, ticks); in rt_workqueue_submit_work()
315 rt_err_t rt_workqueue_urgent_work(struct rt_workqueue *queue, struct rt_work *work) in rt_workqueue_urgent_work() argument
319 RT_ASSERT(queue != RT_NULL); in rt_workqueue_urgent_work()
322 level = rt_spin_lock_irqsave(&(queue->spinlock)); in rt_workqueue_urgent_work()
325 rt_list_insert_after(&queue->work_list, &(work->list)); in rt_workqueue_urgent_work()
327 rt_completion_done(&(queue->wakeup_completion)); in rt_workqueue_urgent_work()
328 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in rt_workqueue_urgent_work()
343 rt_err_t rt_workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work) in rt_workqueue_cancel_work() argument
346 RT_ASSERT(queue != RT_NULL); in rt_workqueue_cancel_work()
348 return _workqueue_cancel_work(queue, work); in rt_workqueue_cancel_work()
360 rt_err_t rt_workqueue_cancel_work_sync(struct rt_workqueue *queue, struct rt_work *work) in rt_workqueue_cancel_work_sync() argument
362 RT_ASSERT(queue != RT_NULL); in rt_workqueue_cancel_work_sync()
365 if (queue->work_current == work) /* it's current work in the queue */ in rt_workqueue_cancel_work_sync()
368 rt_sem_take(&(queue->sem), RT_WAITING_FOREVER); in rt_workqueue_cancel_work_sync()
373 _workqueue_cancel_work(queue, work); in rt_workqueue_cancel_work_sync()
386 rt_err_t rt_workqueue_cancel_all_work(struct rt_workqueue *queue) in rt_workqueue_cancel_all_work() argument
390 RT_ASSERT(queue != RT_NULL); in rt_workqueue_cancel_all_work()
394 while (rt_list_isempty(&queue->work_list) == RT_FALSE) in rt_workqueue_cancel_all_work()
396 work = rt_list_first_entry(&queue->work_list, struct rt_work, list); in rt_workqueue_cancel_all_work()
397 _workqueue_cancel_work(queue, work); in rt_workqueue_cancel_all_work()
400 while (rt_list_isempty(&queue->delayed_list) == RT_FALSE) in rt_workqueue_cancel_all_work()
402 work = rt_list_first_entry(&queue->delayed_list, struct rt_work, list); in rt_workqueue_cancel_all_work()
403 _workqueue_cancel_work(queue, work); in rt_workqueue_cancel_all_work()