123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- #ifndef ZEPHYR_INCLUDE_SYS_P4WQ_H_
- #define ZEPHYR_INCLUDE_SYS_P4WQ_H_
- #include <kernel.h>
- struct k_p4wq_work;
- typedef void (*k_p4wq_handler_t)(struct k_p4wq_work *work);
- struct k_p4wq_work {
-
- int32_t priority;
- int32_t deadline;
- k_p4wq_handler_t handler;
- bool sync;
- struct k_sem done_sem;
-
- union {
- struct rbnode rbnode;
- sys_dlist_t dlnode;
- };
- struct k_thread *thread;
- struct k_p4wq *queue;
- };
- #define K_P4WQ_QUEUE_PER_THREAD BIT(0)
- #define K_P4WQ_DELAYED_START BIT(1)
- #define K_P4WQ_USER_CPU_MASK BIT(2)
- struct k_p4wq {
- struct k_spinlock lock;
-
- _wait_q_t waitq;
-
- struct rbtree queue;
-
- sys_dlist_t active;
-
- uint32_t flags;
- };
- struct k_p4wq_initparam {
- uint32_t num;
- uintptr_t stack_size;
- struct k_p4wq *queue;
- struct k_thread *threads;
- struct z_thread_stack_element *stacks;
- uint32_t flags;
- };
- #define K_P4WQ_DEFINE(name, n_threads, stack_sz) \
- static K_THREAD_STACK_ARRAY_DEFINE(_p4stacks_##name, \
- n_threads, stack_sz); \
- static struct k_thread _p4threads_##name[n_threads]; \
- static struct k_p4wq name; \
- static const STRUCT_SECTION_ITERABLE(k_p4wq_initparam, \
- _init_##name) = { \
- .num = n_threads, \
- .stack_size = stack_sz, \
- .threads = _p4threads_##name, \
- .stacks = &(_p4stacks_##name[0][0]), \
- .queue = &name, \
- .flags = 0, \
- }
- #define K_P4WQ_ARRAY_DEFINE(name, n_threads, stack_sz, flg) \
- static K_THREAD_STACK_ARRAY_DEFINE(_p4stacks_##name, \
- n_threads, stack_sz); \
- static struct k_thread _p4threads_##name[n_threads]; \
- static struct k_p4wq name[n_threads]; \
- static const STRUCT_SECTION_ITERABLE(k_p4wq_initparam, \
- _init_##name) = { \
- .num = n_threads, \
- .stack_size = stack_sz, \
- .threads = _p4threads_##name, \
- .stacks = &(_p4stacks_##name[0][0]), \
- .queue = name, \
- .flags = K_P4WQ_QUEUE_PER_THREAD | flg, \
- }
- void k_p4wq_init(struct k_p4wq *queue);
- void k_p4wq_add_thread(struct k_p4wq *queue, struct k_thread *thread,
- k_thread_stack_t *stack,
- size_t stack_size);
- void k_p4wq_submit(struct k_p4wq *queue, struct k_p4wq_work *item);
- bool k_p4wq_cancel(struct k_p4wq *queue, struct k_p4wq_work *item);
- int k_p4wq_wait(struct k_p4wq_work *work, k_timeout_t timeout);
- void k_p4wq_enable_static_thread(struct k_p4wq *queue, struct k_thread *thread,
- uint32_t cpu_mask);
- #endif
|