summaryrefslogtreecommitdiff
path: root/components/drivers/include/ipc/waitqueue.h
diff options
context:
space:
mode:
authorbernard <[email protected]>2017-10-15 22:56:46 +0800
committerbernard <[email protected]>2017-10-15 22:56:46 +0800
commitd7087fdd3b998192afb03b34fd8034071d06bde7 (patch)
tree6a99d97408c4b3bc708b3a0601bff80907d8beac /components/drivers/include/ipc/waitqueue.h
parent0f5a68a55e2a3c44f1e85029d22de6180ad30390 (diff)
[DeviceDrivers] change cmd type.
1. Change 'rt_uint8_t' type of cmd to 'int'; 2. Add waitqueue; 3. Split device ipc header files;
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