TuyaOS
工作队列

TuyaOS 提供通用的异步任务调度机制,将工作任务发送到指定的workqueueworkqueue会串行的执行队列里的工作任务。

TuyaOS 自身也通过workqueue实现了tal_workq工作队列服务,一般需求tal_workq工作队列服务就可以满足了;一些开发者复杂的需求,资源丰富的平台可以通过自行创建、管理独立的workqueue

接口描述

创建工作队列

OPERATE_RET tal_workqueue_create(CONST UINT16_T queue_len, THREAD_CFG_T *thread_cfg, WORKQUEUE_HANDLE *handle);
thread parameters
Definition: tal_thread.h:73
OPERATE_RET tal_workqueue_create(CONST UINT16_T queue_len, THREAD_CFG_T *thread_cfg, WORKQUEUE_HANDLE *handle)
create and initialize a workqueue which runs in thread context

创建一个workqueue,提供workqueue的最大成员个数,以及workqueue的线程配置,返回workqueuehandle

添加任务到工作队列

OPERATE_RET tal_workqueue_schedule(WORKQUEUE_HANDLE handle, WORKQUEUE_CB cb, VOID_T *data);
OPERATE_RET tal_workqueue_schedule(WORKQUEUE_HANDLE handle, WORKQUEUE_CB cb, VOID_T *data)
put work task in workqueue

添加一个任务到workqueue中。提供workqueue的回调函数以及处理参数。workqueue会将任务放在尾部,并按照FIFO的顺序执行。

注意:任务是一次性的,异步处理的,所以参数data需要使用Malloc申请堆内存,并在cb中释放内存,避免内存泄露。

添加紧急任务到工作队列

OPERATE_RET tal_workqueue_schedule_instant(WORKQUEUE_HANDLE handle, WORKQUEUE_CB cb, VOID_T *data);
OPERATE_RET tal_workqueue_schedule_instant(WORKQUEUE_HANDLE handle, WORKQUEUE_CB cb, VOID_T *data)
put work task in workqueue, instant will be dequeued first

添加一个紧急任务到workqueue中。提供workqueue的回调函数以及处理参数。workqueue会将紧急任务放在头部部,立即执行。

注意:任务是一次性的,异步处理的,所以参数data需要使用Malloc申请堆内存,并在cb中释放内存,避免内存泄露。

获取队列成员数量

UINT16_T tal_workqueue_get_num(WORKQUEUE_HANDLE handle);
UINT16_T tal_workqueue_get_num(WORKQUEUE_HANDLE handle)
get the workqueue item number

获取当前workqueue的剩余任务数量。

遍历队列并执行响应的任务

OPERATE_RET tal_workqueue_traverse(WORKQUEUE_HANDLE handle, WORKQUEUE_TRAVERSE_CB cb, VOID_T *ctx);
OPERATE_RET tal_workqueue_traverse(WORKQUEUE_HANDLE handle, WORKQUEUE_TRAVERSE_CB cb, VOID_T *ctx)
traverse the queue with specific callback

遍历workqueue中的所有成员,并且针对每个成员执行cbctxcb执行的外部入参。

删除队列中的任务

OPERATE_RET tal_workqueue_cancel(WORKQUEUE_HANDLE handle, WORKQUEUE_CB cb, VOID_T *data);
OPERATE_RET tal_workqueue_cancel(WORKQUEUE_HANDLE handle, WORKQUEUE_CB cb, VOID_T *data)
cancel work task in workqueue

删除一个特定的任务,必须满足cbdata完全一致,如果删除成功,需要自行释放data(因为datacb执行的时候释放,删除成功意味着cb没有执行)。

释放工作队列

OPERATE_RET tal_workqueue_release(WORKQUEUE_HANDLE handle);
OPERATE_RET tal_workqueue_release(WORKQUEUE_HANDLE handle)
release the workqueue

释放workqueue,会自行清空当前workqueue中的所有任务。

示例代码

#define TASK_WORKQUEUE_PRIORITY THREAD_PRIO_1
#define TASK_WORKQUEUE_SIZE 1024
#define WORKQUEUE_WORKQUEUE_LEN 2
VOID __sample_work_cb(VOID *data)
{
PR_DEBUG("work is here %p", data);
}
STATIC THREAD_CFG_T sg_task = {
.priority = TASK_WORKQUEUE_PRIORITY,
.stackDepth = TASK_WORKQUEUE_SIZE,
.thrdname = "workqueue"
};
STATIC WORKQUEUE_HANDLE sg_workqueue;
OPERATE_RET sample_workqueue_test()
{
OPERATE_RET rt = OPRT_OK;
// 创建workqueue
rt = tal_workqueue_create(WORKQUEUE_WORKQUEUE_LEN, &sg_task, &sg_workqueue);
EXPECT_EQ(rt, OPRT_OK);
// 添加待执行任务
rt = tal_workqueue_schedule(sg_workqueue, __sample_work_cb, NULL);
EXPECT_EQ(rt, OPRT_OK);
// 删除workqueue
rt = tal_workqueue_release(sg_workqueue);
EXPECT_EQ(rt, OPRT_OK);
return OPRT_OK;
}