summaryrefslogtreecommitdiff
path: root/components/drivers/include/ipc/waitqueue.h
diff options
context:
space:
mode:
Diffstat (limited to 'components/drivers/include/ipc/waitqueue.h')
-rw-r--r--components/drivers/include/ipc/waitqueue.h39
1 files changed, 39 insertions, 0 deletions
diff --git a/components/drivers/include/ipc/waitqueue.h b/components/drivers/include/ipc/waitqueue.h
new file mode 100644
index 0000000000..1746d0f1cd
--- /dev/null
+++ b/components/drivers/include/ipc/waitqueue.h
@@ -0,0 +1,39 @@
+#ifndef WAITQUEUE_H__
+#define WAITQUEUE_H__
+
+#include <rtthread.h>
+
+struct rt_wqueue_node;
+
+typedef rt_list_t rt_wqueue_t;
+typedef int (*rt_wqueue_func_t)(struct rt_wqueue_node *wait, void *key);
+
+struct rt_wqueue_node
+{
+ rt_thread_t polling_thread;
+ rt_list_t list;
+
+ rt_wqueue_func_t wakeup;
+ rt_uint32_t key;
+};
+typedef struct rt_wqueue_node rt_wqueue_node_t;
+
+int __wqueue_default_wake(struct rt_wqueue_node *wait, void *key);
+
+void rt_wqueue_add(rt_wqueue_t *queue, struct rt_wqueue_node *node);
+void rt_wqueue_remove(struct rt_wqueue_node *node);
+int rt_wqueue_wait(rt_wqueue_t *queue, int condition, int timeout);
+void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key);
+
+#define DEFINE_WAIT_FUNC(name, function) \
+ struct rt_wqueue_node name = { \
+ rt_current_thread, \
+ RT_LIST_OBJECT_INIT(((name).list)), \
+ \
+ function, \
+ 0 \
+ }
+
+#define DEFINE_WAIT(name) DEFINE_WAIT_FUNC(name, __wqueue_default_wake)
+
+#endif