1 /* 2 * Copyright (c) 2006-2018, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2018/06/26 Bernard Fix the wait queue issue when wakeup a soon 9 * to blocked thread. 10 */ 11 12 #ifndef WAITQUEUE_H__ 13 #define WAITQUEUE_H__ 14 15 #include <rtthread.h> 16 17 #define RT_WQ_FLAG_CLEAN 0x00 18 #define RT_WQ_FLAG_WAKEUP 0x01 19 20 struct rt_wqueue_node; 21 typedef int (*rt_wqueue_func_t)(struct rt_wqueue_node *wait, void *key); 22 23 struct rt_wqueue_node 24 { 25 rt_thread_t polling_thread; 26 rt_list_t list; 27 28 rt_wqueue_func_t wakeup; 29 rt_uint32_t key; 30 }; 31 typedef struct rt_wqueue_node rt_wqueue_node_t; 32 33 int __wqueue_default_wake(struct rt_wqueue_node *wait, void *key); 34 35 rt_inline void rt_wqueue_init(rt_wqueue_t *queue) 36 { 37 RT_ASSERT(queue != RT_NULL); 38 39 queue->flag = RT_WQ_FLAG_CLEAN; 40 rt_list_init(&(queue->waiting_list)); 41 } 42 43 void rt_wqueue_add(rt_wqueue_t *queue, struct rt_wqueue_node *node); 44 void rt_wqueue_remove(struct rt_wqueue_node *node); 45 int rt_wqueue_wait(rt_wqueue_t *queue, int condition, int timeout); 46 void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key); 47 48 #define DEFINE_WAIT_FUNC(name, function) \ 49 struct rt_wqueue_node name = { \ 50 rt_current_thread, \ 51 RT_LIST_OBJECT_INIT(((name).list)), \ 52 \ 53 function, \ 54 0 \ 55 } 56 57 #define DEFINE_WAIT(name) DEFINE_WAIT_FUNC(name, __wqueue_default_wake) 58 59 #endif 60