summaryrefslogtreecommitdiff
path: root/components/drivers/include/ipc/workqueue.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/workqueue.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/workqueue.h')
-rw-r--r--components/drivers/include/ipc/workqueue.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/components/drivers/include/ipc/workqueue.h b/components/drivers/include/ipc/workqueue.h
new file mode 100644
index 0000000000..36eb825dc9
--- /dev/null
+++ b/components/drivers/include/ipc/workqueue.h
@@ -0,0 +1,41 @@
+#ifndef WORKQUEUE_H__
+#define WORKQUEUE_H__
+
+#include <rtthread.h>
+
+/* workqueue implementation */
+struct rt_workqueue
+{
+ rt_list_t work_list;
+ struct rt_work *work_current; /* current work */
+ rt_thread_t work_thread;
+};
+
+struct rt_work
+{
+ rt_list_t list;
+
+ void (*work_func)(struct rt_work* work, void* work_data);
+ void *work_data;
+};
+
+#ifdef RT_USING_HEAP
+/**
+ * WorkQueue for DeviceDriver
+ */
+struct rt_workqueue *rt_workqueue_create(const char* name, rt_uint16_t stack_size, rt_uint8_t priority);
+rt_err_t rt_workqueue_destroy(struct rt_workqueue* queue);
+rt_err_t rt_workqueue_dowork(struct rt_workqueue* queue, struct rt_work* work);
+rt_err_t rt_workqueue_cancel_work(struct rt_workqueue* queue, struct rt_work* work);
+
+rt_inline void rt_work_init(struct rt_work* work, void (*work_func)(struct rt_work* work, void* work_data),
+ void* work_data)
+{
+ rt_list_init(&(work->list));
+ work->work_func = work_func;
+ work->work_data = work_data;
+}
+#endif
+
+#endif
+