blob: 499d630e9d61ccf1af5a7b05581dcfb69b824cff [file] [log] [blame]
Anas Nashifcb888e62016-12-18 09:42:55 -05001/* wait queue for multiple threads on kernel objects */
Benjamin Walsh456c6da2016-09-02 18:55:39 -04002
3/*
4 * Copyright (c) 2015 Wind River Systems, Inc.
5 *
David B. Kinderac74d8b2017-01-18 17:01:01 -08006 * SPDX-License-Identifier: Apache-2.0
Benjamin Walsh456c6da2016-09-02 18:55:39 -04007 */
8
Flavio Ceolina7fffa92018-09-13 15:06:35 -07009#ifndef ZEPHYR_KERNEL_INCLUDE_WAIT_Q_H_
10#define ZEPHYR_KERNEL_INCLUDE_WAIT_Q_H_
Benjamin Walsh456c6da2016-09-02 18:55:39 -040011
Benjamin Walshf6ca7de2016-11-08 10:36:50 -050012#include <kernel_structs.h>
Anas Nashifee9dd1a2019-06-26 10:33:41 -040013#include <sys/dlist.h>
Anas Nashif18592442019-06-26 10:33:50 -040014#include <sys/rb.h>
Andy Ross1acd8c22018-05-03 14:51:49 -070015#include <sched_priq.h>
Andy Ross2ae8f502018-09-26 12:48:15 -070016#include <timeout_q.h>
Benjamin Walsh456c6da2016-09-02 18:55:39 -040017
18#ifdef __cplusplus
19extern "C" {
20#endif
21
Andy Ross225c74b2018-06-27 11:20:50 -070022#ifdef CONFIG_WAITQ_SCALABLE
Andy Ross1acd8c22018-05-03 14:51:49 -070023
Andy Rossccf3bf72018-05-10 11:10:34 -070024#define _WAIT_Q_FOR_EACH(wq, thread_ptr) \
Andy Ross1acd8c22018-05-03 14:51:49 -070025 RB_FOR_EACH_CONTAINER(&(wq)->waitq.tree, thread_ptr, base.qnode_rb)
26
Patrik Flykt4344e272019-03-08 14:19:05 -070027static inline void z_waitq_init(_wait_q_t *w)
Andy Ross1acd8c22018-05-03 14:51:49 -070028{
29 w->waitq = (struct _priq_rb) {
30 .tree = {
Patrik Flykt4344e272019-03-08 14:19:05 -070031 .lessthan_fn = z_priq_rb_lessthan
Andy Ross1acd8c22018-05-03 14:51:49 -070032 }
33 };
34}
35
Patrik Flykt4344e272019-03-08 14:19:05 -070036static inline struct k_thread *z_waitq_head(_wait_q_t *w)
Andy Ross1acd8c22018-05-03 14:51:49 -070037{
Benoit Leforestier9915b4e2019-04-25 14:46:55 +020038 return (struct k_thread *)rb_get_min(&w->waitq.tree);
Andy Ross1acd8c22018-05-03 14:51:49 -070039}
40
Andy Ross225c74b2018-06-27 11:20:50 -070041#else /* !CONFIG_WAITQ_SCALABLE: */
Andy Ross1acd8c22018-05-03 14:51:49 -070042
43#define _WAIT_Q_FOR_EACH(wq, thread_ptr) \
44 SYS_DLIST_FOR_EACH_CONTAINER(&((wq)->waitq), thread_ptr, \
45 base.qnode_dlist)
Andy Rossccf3bf72018-05-10 11:10:34 -070046
Patrik Flykt4344e272019-03-08 14:19:05 -070047static inline void z_waitq_init(_wait_q_t *w)
Andy Rossccf3bf72018-05-10 11:10:34 -070048{
49 sys_dlist_init(&w->waitq);
50}
51
Patrik Flykt4344e272019-03-08 14:19:05 -070052static inline struct k_thread *z_waitq_head(_wait_q_t *w)
Andy Rossccf3bf72018-05-10 11:10:34 -070053{
Benoit Leforestier9915b4e2019-04-25 14:46:55 +020054 return (struct k_thread *)sys_dlist_peek_head(&w->waitq);
Andy Rossccf3bf72018-05-10 11:10:34 -070055}
Benjamin Walshfcdb0fd2017-01-28 16:56:18 -050056
Andy Ross225c74b2018-06-27 11:20:50 -070057#endif /* !CONFIG_WAITQ_SCALABLE */
Andy Ross1acd8c22018-05-03 14:51:49 -070058
Benjamin Walsh456c6da2016-09-02 18:55:39 -040059#ifdef __cplusplus
60}
61#endif
62
Flavio Ceolina7fffa92018-09-13 15:06:35 -070063#endif /* ZEPHYR_KERNEL_INCLUDE_WAIT_Q_H_ */