/* * Copyright (c) 2018 Intel Corporation * Copyright (c) 2016 Wind River Systems, Inc. * * SPDX-License-Identifier: Apache-2.0 */ #include #define WORKQUEUE_THREAD_NAME "workqueue" void z_work_q_main(void *work_q_ptr, void *p2, void *p3) { struct k_work_q *work_q = work_q_ptr; ARG_UNUSED(p2); ARG_UNUSED(p3); while (true) { struct k_work *work; k_work_handler_t handler; work = k_queue_get(&work_q->queue, K_FOREVER); if (work == NULL) { continue; } handler = work->handler; /* Reset pending state so it can be resubmitted by handler */ if (atomic_test_and_clear_bit(work->flags, K_WORK_STATE_PENDING)) { handler(work); } /* Make sure we don't hog up the CPU if the FIFO never (or * very rarely) gets empty. */ k_yield(); } } void k_work_q_user_start(struct k_work_q *work_q, k_thread_stack_t *stack, size_t stack_size, int prio) { k_queue_init(&work_q->queue); /* Created worker thread will inherit object permissions and memory * domain configuration of the caller */ k_thread_create(&work_q->thread, stack, stack_size, z_work_q_main, work_q, 0, 0, prio, K_USER | K_INHERIT_PERMS, K_FOREVER); k_object_access_grant(&work_q->queue, &work_q->thread); k_thread_name_set(&work_q->thread, WORKQUEUE_THREAD_NAME); k_thread_start(&work_q->thread); }