summaryrefslogtreecommitdiff
path: root/components/drivers/include/ipc/workqueue.h
diff options
context:
space:
mode:
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
+