XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_task_pool.c
浏览该文件的文档.
1
12/* ==================== [Includes] ========================================== */
13
15
16#if XF_TASK_POOL_IS_ENABLE
17
18#include "xf_task_pool.h"
19#include "../kernel/xf_task_base.h"
20#include "../task/xf_task_default.h"
21#include "../task/xf_ttask.h"
22
23/* ==================== [Defines] =========================================== */
24
25#define TAG "task_pool"
26
27/* ==================== [Typedefs] ========================================== */
28
34
40
41/* ==================== [Static Prototypes] ================================= */
42
44static void xf_task_delete_(xf_task_t task);
45
46/* ==================== [Static Variables] ================================== */
47
48/* ==================== [Macros] ============================================ */
49
50/* ==================== [Global Functions] ================================== */
51
53 void *config)
54{
55 XF_ASSERT(max_works, NULL, TAG, "max_works must not be 0");
56 XF_ASSERT(manager, NULL, TAG, "manager must not be NULL");
57 XF_ASSERT(type < _XF_TASK_TYPE_MAX, NULL, TAG, "manager must less than %d", _XF_TASK_TYPE_MAX);
58 XF_ASSERT(config, NULL, TAG, "config must not be NULL");
59
61 sizeof(xf_pool_task_t) * max_works);
62 if (pool == NULL) {
63 XF_LOGE(TAG, "memory alloc failed!");
64 return NULL;
65 }
66
67 pool->max_works = max_works;
68 xf_list_init(&pool->pool_list);
69 xf_list_init(&pool->used_list);
70
71 xf_pool_task_t *pool_task = (xf_pool_task_t *)((uint8_t *)pool + sizeof(xf_task_pool_handle_t));
72
73 for (size_t i = 0; i < max_works; i++) {
74 pool_task[i].task = xf_task_create_with_manager(manager, type, xf_task_pool_default_task, NULL, 0, config);
75 xf_task_base_t *task_base = (xf_task_base_t *)pool_task[i].task;
76 task_base->user_data = &pool_task[i];
77 task_base->delete = xf_task_delete_;
78 pool_task[i].pool = pool;
79 xf_task_suspend(pool_task[i].task);
80 xf_list_init(&pool_task[i].node);
81 xf_list_add_tail(&pool_task[i].node, &pool->pool_list);
82 }
83
84 return pool;
85}
86
88{
89 XF_ASSERT(pool, XF_ERR_INVALID_ARG, TAG, "pool must not be NULL");
90 xf_task_pool_handle_t *pool_handle = (xf_task_pool_handle_t *)pool;
91
92 xf_pool_task_t *task_pool;
93 xf_list_for_each_entry(task_pool, &pool_handle->pool_list, xf_pool_task_t, node) {
94 xf_task_base_t *handle = (xf_task_base_t *)task_pool->task;
95 handle->delete = xf_task_destructor;
96 xf_task_delete(task_pool->task);
97 }
98 xf_list_for_each_entry(task_pool, &pool_handle->used_list, xf_pool_task_t, node) {
99 xf_task_base_t *handle = (xf_task_base_t *)task_pool->task;
100 handle->delete = xf_task_destructor;
101 xf_task_delete(task_pool->task);
102 }
103 xf_free(pool);
104
105 return XF_OK;
106}
107
108xf_task_t xf_task_init_from_pool(xf_task_pool_t pool, xf_task_func_t func, void *func_arg, uint16_t priority)
109{
110 XF_ASSERT(pool, NULL, TAG, "pool must not be NULL");
111 XF_ASSERT(func, NULL, TAG, "func must not be NULL");
112 XF_ASSERT(priority < XF_TASK_PRIORITY_LEVELS, NULL, TAG, "priority must less than %d", XF_TASK_PRIORITY_LEVELS);
113
114 xf_task_pool_handle_t *pool_handle = (xf_task_pool_handle_t *)pool;
115
116 xf_pool_task_t *pool_task = xf_list_first_entry(&pool_handle->pool_list, xf_pool_task_t, node);
117
118 xf_list_del_init(&pool_task->node);
119 xf_list_add_tail(&pool_task->node, &pool_handle->used_list);
120
121 xf_task_reset(pool_task->task);
122 xf_task_base_t *handle = (xf_task_base_t *)pool_task->task;
123 handle->func = func;
124 handle->arg = func_arg;
125 handle->priority = priority;
126
127 return pool_task->task;
128}
129
130/* ==================== [Static Functions] ================================== */
131
136
138{
139 xf_task_base_t *task_base = (xf_task_base_t *)task;
140 xf_pool_task_t *pool_task = (xf_pool_task_t *)task_base->user_data;
142
143 // 此时已经出于删除态,
144 // 需要强行修改当前状态,不然后续的挂起操作无法生效
145 task_base->state = XF_TASK_STATE_READY;
147
148 xf_list_del_init(&pool_task->node);
149 xf_list_add_tail(&pool_task->node, &pool->pool_list);
150}
151
152#endif
xf_err_t xf_task_pool_delete(xf_task_pool_t pool)
删除任务池。
xf_task_pool_t xf_task_pool_create_with_manager(uint32_t max_works, xf_task_manager_t manager, xf_task_type_t type, void *config)
创建一个任务池。
xf_task_t xf_task_init_from_pool(xf_task_pool_t pool, xf_task_func_t func, void *func_arg, uint16_t priority)
初始化任务。
void * xf_task_pool_t
任务池句柄。
#define XF_ASSERT(condition, retval, tag, format,...)
xfusion 断言宏(条件 不成立 时则输出日志后返回)。
Definition xf_check.h:150
int32_t xf_err_t
整形错误类型。 错误码具体值见 xf_err_code_t.
Definition xf_err.h:69
@ XF_ERR_INVALID_ARG
Definition xf_err.h:46
@ XF_OK
Definition xf_err.h:43
static void xf_list_init(xf_list_t *list)
动态初始化链表.
Definition xf_list.h:97
static void xf_list_add_tail(xf_list_t *new_node, xf_list_t *head)
xf_list_add_tail - 在指定节点之前添加一个 new_node.
Definition xf_list.h:168
static void xf_list_del_init(xf_list_t *entry)
xf_list_del_init - 从链表中删除节点, 并重新初始化.
Definition xf_list.h:266
#define xf_list_first_entry(ptr, type, member)
xf_list_first_entry - 获取链表中的第一个元素.
Definition xf_list.h:617
#define xf_list_for_each_entry(pos, head, type, member)
list_for_each_entry - 迭代给定类型的链表。
Definition xf_list.h:732
#define xf_malloc(x)
Definition xf_stdlib.h:38
#define xf_free(x)
Definition xf_stdlib.h:39
xf_task_pool_handle_t * pool
task 的父对象,保存了 task 的公共属性。
xf_task_delete_t delete
xf_task_func_t func
双向链表结构体.
Definition xf_list.h:64
static void task(xf_task_t task)
Definition xf_main.c:45
#define XF_LOGE(tag, format,...)
void xf_task_destructor(xf_task_t task)
任务销毁。回收任务资源
xf_err_t xf_task_suspend(xf_task_t task)
任务进入挂起。挂起态的任务不会参与调度。
xf_task_t xf_task_create_with_manager(xf_task_manager_t manager, xf_task_type_t type, xf_task_func_t func, void *func_arg, uint16_t priority, void *config)
在指定任务管理器下创建任务。
void xf_task_reset(xf_task_t task)
任务重置。将任务的一些参数进行重置。
void xf_task_delete(xf_task_t task)
任务删除函数。将任务加入销毁队列,并设置任务为删除态。
void(* xf_task_func_t)(xf_task_t task)
任务调用函数原型。
@ XF_TASK_STATE_READY
enum _xf_task_type_t xf_task_type_t
任务类型,通过注册表 xf_task_reg.inc 生成相关的内容。
@ _XF_TASK_TYPE_MAX
#define XF_TASK_PRIORITY_LEVELS
配置任务最高优先级,1 ~ 1024 之间。
void * xf_task_manager_t
任务管理器句柄。
void * xf_task_t
任务句柄。
static void xf_task_delete_(xf_task_t task)
struct _xf_task_pool_handle_t xf_task_pool_handle_t
struct _xf_pool_task_t xf_pool_task_t
static void xf_task_pool_default_task(xf_task_t task)
#define TAG
任务池。
xf_task_utils 配置。
#define UNUSED(_x)