TuyaOS
工作队列服务

工作队列服务是TuyaOS基于workqueue实现的,满足一般的异步任务处理需求的基础能力。TuyaOS 在自身初始化的时候,已经完成了工作队列服务的创建,不需要开发者进行额外的操作,可以直接进行任务处理。

接口描述

工作队列优先级

typedef enum {
WORKQ_SERVICE_E
TuyaOS provides developers with two workqueue service for convenience.
Definition: tal_workq_service.h:19
@ WORKQ_SYSTEM
Definition: tal_workq_service.h:23
@ WORKQ_HIGHTPRI
Definition: tal_workq_service.h:27

TuyaOS提供了两种工作队列,分别为:

  • WORKQ_SYSTEM:低优先级服务,允许进行阻塞任务。
  • WORKQ_HIGHTPRI:高优先级服务,不允许进行阻塞任务。

添加任务到工作队列服务

OPERATE_RET tal_workq_schedule(WORKQ_SERVICE_E service, WORKQUEUE_CB cb, VOID_T *data);
OPERATE_RET tal_workq_schedule(WORKQ_SERVICE_E service, WORKQUEUE_CB cb, VOID_T *data)
add work to work queue

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

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

添加紧急工作到工作队列

OPERATE_RET tal_workq_schedule_instant(WORKQ_SERVICE_E service, WORKQUEUE_CB cb, VOID_T *data);
OPERATE_RET tal_workq_schedule_instant(WORKQ_SERVICE_E service, WORKQUEUE_CB cb, VOID_T *data)
put work task in workqueue, instant will be dequeued first

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

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

获取队列成员数量

UINT16_T tal_workq_get_num(WORKQ_SERVICE_E service)
get current work number in work queue.

获取当前工作队列服务的剩余任务数量。

删除队列中的成员

OPERATE_RET tal_workq_cancel(WORKQ_SERVICE_E service, WORKQUEUE_CB cb, VOID_T *data);
OPERATE_RET tal_workq_cancel(WORKQ_SERVICE_E service, WORKQUEUE_CB cb, VOID_T *data)
cancel work task in workqueue

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

示例代码

VOID __sample_work_cb(VOID *data)
{
PR_DEBUG("work is here %p", data);
}
VOID __sample_instant_work_cb(VOID *data)
{
PR_DEBUG("instant work is here %p", data);
}
OPERATE_RET sample_workqueue_service_test()
{
OPERATE_RET rt = OPRT_OK;
// 添加待执行任务
rt = tal_workq_schedule(WORKQ_SYSTEM, __sample_work_cb, NULL);
EXPECT_EQ(rt, OPRT_OK);
// 添加待执行紧急任务
rt = tal_workq_schedule_instant(WORKQ_SYSTEM, __sample_instant_work_cb, NULL);
EXPECT_EQ(rt, OPRT_OK);
return OPRT_OK;
}