Lines Matching refs:queue

190 static void queue_flusher_locked(struct k_work_q *queue,  in queue_flusher_locked()  argument
197 sys_slist_insert(&queue->pending, &work->node, in queue_flusher_locked()
200 sys_slist_prepend(&queue->pending, &flusher->work.node); in queue_flusher_locked()
211 static inline void queue_remove_locked(struct k_work_q *queue, in queue_remove_locked() argument
215 (void)sys_slist_find_and_remove(&queue->pending, &work->node); in queue_remove_locked()
230 static inline bool notify_queue_locked(struct k_work_q *queue) in notify_queue_locked() argument
234 if (queue != NULL) { in notify_queue_locked()
235 rv = z_sched_wake(&queue->notifyq, 0, NULL); in notify_queue_locked()
260 static inline int queue_submit_locked(struct k_work_q *queue, in queue_submit_locked() argument
263 if (queue == NULL) { in queue_submit_locked()
268 bool chained = (_current == queue->thread_id) && !k_is_in_isr(); in queue_submit_locked()
269 bool draining = flag_test(&queue->flags, K_WORK_QUEUE_DRAIN_BIT); in queue_submit_locked()
270 bool plugged = flag_test(&queue->flags, K_WORK_QUEUE_PLUGGED_BIT); in queue_submit_locked()
279 if (!flag_test(&queue->flags, K_WORK_QUEUE_STARTED_BIT)) { in queue_submit_locked()
286 sys_slist_append(&queue->pending, &work->node); in queue_submit_locked()
288 (void)notify_queue_locked(queue); in queue_submit_locked()
335 *queuep = work->queue; in submit_to_queue_locked()
343 __ASSERT_NO_MSG(work->queue != NULL); in submit_to_queue_locked()
344 *queuep = work->queue; in submit_to_queue_locked()
354 work->queue = *queuep; in submit_to_queue_locked()
378 int z_work_submit_to_queue(struct k_work_q *queue, in z_work_submit_to_queue() argument
386 int ret = submit_to_queue_locked(work, &queue); in z_work_submit_to_queue()
393 int k_work_submit_to_queue(struct k_work_q *queue, in k_work_submit_to_queue() argument
396 SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_work, submit_to_queue, queue, work); in k_work_submit_to_queue()
398 int ret = z_work_submit_to_queue(queue, work); in k_work_submit_to_queue()
409 SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work, submit_to_queue, queue, work, ret); in k_work_submit_to_queue()
447 struct k_work_q *queue = work->queue; in work_flush_locked() local
449 __ASSERT_NO_MSG(queue != NULL); in work_flush_locked()
451 queue_flusher_locked(queue, work, flusher); in work_flush_locked()
452 notify_queue_locked(queue); in work_flush_locked()
506 queue_remove_locked(work->queue, work); in cancel_async_locked()
608 struct k_work_q *queue = CONTAINER_OF(record, struct k_work_q, work_timeout_record); in work_timeout_handler() local
615 work = queue->work; in work_timeout_handler()
619 name = k_thread_name_get(queue->thread_id); in work_timeout_handler()
626 queue, space, name, work, handler); in work_timeout_handler()
628 k_thread_abort(queue->thread_id); in work_timeout_handler()
631 static void work_timeout_start_locked(struct k_work_q *queue, struct k_work *work) in work_timeout_start_locked() argument
633 if (K_TIMEOUT_EQ(queue->work_timeout, K_FOREVER)) { in work_timeout_start_locked()
637 queue->work = work; in work_timeout_start_locked()
638 z_add_timeout(&queue->work_timeout_record, work_timeout_handler, queue->work_timeout); in work_timeout_start_locked()
641 static void work_timeout_stop_locked(struct k_work_q *queue) in work_timeout_stop_locked() argument
643 if (K_TIMEOUT_EQ(queue->work_timeout, K_FOREVER)) { in work_timeout_stop_locked()
647 z_abort_timeout(&queue->work_timeout_record); in work_timeout_stop_locked()
660 struct k_work_q *queue = (struct k_work_q *)workq_ptr; in work_queue_main() local
670 node = sys_slist_get(&queue->pending); in work_queue_main()
675 flag_set(&queue->flags, K_WORK_QUEUE_BUSY_BIT); in work_queue_main()
693 } else if (flag_test_and_clear(&queue->flags, in work_queue_main()
704 (void)z_sched_wake_all(&queue->drainq, 1, NULL); in work_queue_main()
705 } else if (flag_test(&queue->flags, K_WORK_QUEUE_STOP_BIT)) { in work_queue_main()
708 flags_set(&queue->flags, 0); in work_queue_main()
725 (void)z_sched_wait(&lock, key, &queue->notifyq, in work_queue_main()
731 work_timeout_start_locked(queue, work); in work_queue_main()
747 work_timeout_stop_locked(queue); in work_queue_main()
758 flag_clear(&queue->flags, K_WORK_QUEUE_BUSY_BIT); in work_queue_main()
759 yield = !flag_test(&queue->flags, K_WORK_QUEUE_NO_YIELD_BIT); in work_queue_main()
771 void k_work_queue_init(struct k_work_q *queue) in k_work_queue_init() argument
773 __ASSERT_NO_MSG(queue != NULL); in k_work_queue_init()
775 *queue = (struct k_work_q) { in k_work_queue_init()
779 SYS_PORT_TRACING_OBJ_INIT(k_work_queue, queue); in k_work_queue_init()
782 void k_work_queue_run(struct k_work_q *queue, const struct k_work_queue_config *cfg) in k_work_queue_run() argument
784 __ASSERT_NO_MSG(!flag_test(&queue->flags, K_WORK_QUEUE_STARTED_BIT)); in k_work_queue_run()
798 queue->work_timeout = K_MSEC(cfg->work_timeout_ms); in k_work_queue_run()
800 queue->work_timeout = K_FOREVER; in k_work_queue_run()
804 sys_slist_init(&queue->pending); in k_work_queue_run()
805 z_waitq_init(&queue->notifyq); in k_work_queue_run()
806 z_waitq_init(&queue->drainq); in k_work_queue_run()
807 queue->thread_id = _current; in k_work_queue_run()
808 flags_set(&queue->flags, flags); in k_work_queue_run()
809 work_queue_main(queue, NULL, NULL); in k_work_queue_run()
812 void k_work_queue_start(struct k_work_q *queue, in k_work_queue_start() argument
818 __ASSERT_NO_MSG(queue); in k_work_queue_start()
820 __ASSERT_NO_MSG(!flag_test(&queue->flags, K_WORK_QUEUE_STARTED_BIT)); in k_work_queue_start()
824 SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_work_queue, start, queue); in k_work_queue_start()
826 sys_slist_init(&queue->pending); in k_work_queue_start()
827 z_waitq_init(&queue->notifyq); in k_work_queue_start()
828 z_waitq_init(&queue->drainq); in k_work_queue_start()
838 flags_set(&queue->flags, flags); in k_work_queue_start()
840 (void)k_thread_create(&queue->thread, stack, stack_size, in k_work_queue_start()
841 work_queue_main, queue, NULL, NULL, in k_work_queue_start()
845 k_thread_name_set(&queue->thread, cfg->name); in k_work_queue_start()
849 queue->thread.base.user_options |= K_ESSENTIAL; in k_work_queue_start()
854 queue->work_timeout = K_MSEC(cfg->work_timeout_ms); in k_work_queue_start()
856 queue->work_timeout = K_FOREVER; in k_work_queue_start()
860 k_thread_start(&queue->thread); in k_work_queue_start()
861 queue->thread_id = &queue->thread; in k_work_queue_start()
863 SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, start, queue); in k_work_queue_start()
866 int k_work_queue_drain(struct k_work_q *queue, in k_work_queue_drain() argument
869 __ASSERT_NO_MSG(queue); in k_work_queue_drain()
872 SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_work_queue, drain, queue); in k_work_queue_drain()
877 if (((flags_get(&queue->flags) in k_work_queue_drain()
880 || !sys_slist_is_empty(&queue->pending)) { in k_work_queue_drain()
881 flag_set(&queue->flags, K_WORK_QUEUE_DRAIN_BIT); in k_work_queue_drain()
883 flag_set(&queue->flags, K_WORK_QUEUE_PLUGGED_BIT); in k_work_queue_drain()
886 notify_queue_locked(queue); in k_work_queue_drain()
887 ret = z_sched_wait(&lock, key, &queue->drainq, in k_work_queue_drain()
893 SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, drain, queue, ret); in k_work_queue_drain()
898 int k_work_queue_unplug(struct k_work_q *queue) in k_work_queue_unplug() argument
900 __ASSERT_NO_MSG(queue); in k_work_queue_unplug()
902 SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_work_queue, unplug, queue); in k_work_queue_unplug()
907 if (flag_test_and_clear(&queue->flags, K_WORK_QUEUE_PLUGGED_BIT)) { in k_work_queue_unplug()
913 SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, unplug, queue, ret); in k_work_queue_unplug()
918 int k_work_queue_stop(struct k_work_q *queue, k_timeout_t timeout) in k_work_queue_stop() argument
920 __ASSERT_NO_MSG(queue); in k_work_queue_stop()
922 SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_work_queue, stop, queue, timeout); in k_work_queue_stop()
925 if (!flag_test(&queue->flags, K_WORK_QUEUE_STARTED_BIT)) { in k_work_queue_stop()
927 SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, -EALREADY); in k_work_queue_stop()
931 if (!flag_test(&queue->flags, K_WORK_QUEUE_PLUGGED_BIT)) { in k_work_queue_stop()
933 SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, -EBUSY); in k_work_queue_stop()
937 flag_set(&queue->flags, K_WORK_QUEUE_STOP_BIT); in k_work_queue_stop()
938 notify_queue_locked(queue); in k_work_queue_stop()
940 SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_work_queue, stop, queue, timeout); in k_work_queue_stop()
941 if (k_thread_join(queue->thread_id, timeout)) { in k_work_queue_stop()
943 flag_clear(&queue->flags, K_WORK_QUEUE_STOP_BIT); in k_work_queue_stop()
945 SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, -ETIMEDOUT); in k_work_queue_stop()
949 SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, 0); in k_work_queue_stop()
967 struct k_work_q *queue = NULL; in work_timeout() local
977 queue = dw->queue; in work_timeout()
978 (void)submit_to_queue_locked(wp, &queue); in work_timeout()
1052 dwork->queue = *queuep; in schedule_for_queue_locked()
1107 int k_work_schedule_for_queue(struct k_work_q *queue, struct k_work_delayable *dwork, in k_work_schedule_for_queue() argument
1110 __ASSERT_NO_MSG(queue != NULL); in k_work_schedule_for_queue()
1113 SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_work, schedule_for_queue, queue, dwork, delay); in k_work_schedule_for_queue()
1121 ret = schedule_for_queue_locked(&queue, dwork, delay); in k_work_schedule_for_queue()
1126 SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work, schedule_for_queue, queue, dwork, delay, ret); in k_work_schedule_for_queue()
1142 int k_work_reschedule_for_queue(struct k_work_q *queue, struct k_work_delayable *dwork, in k_work_reschedule_for_queue() argument
1145 __ASSERT_NO_MSG(queue != NULL); in k_work_reschedule_for_queue()
1148 SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_work, reschedule_for_queue, queue, dwork, delay); in k_work_reschedule_for_queue()
1157 ret = schedule_for_queue_locked(&queue, dwork, delay); in k_work_reschedule_for_queue()
1161 SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work, reschedule_for_queue, queue, dwork, delay, ret); in k_work_reschedule_for_queue()
1254 struct k_work_q *queue = dwork->queue; in k_work_flush_delayable() local
1256 (void)submit_to_queue_locked(work, &queue); in k_work_flush_delayable()