Wait
Wait 提供 OSAL(Operating System Abstraction Layer)的等待队列机制,支持线程在指定条件满足前阻塞睡眠、超时自动唤醒以及主动唤醒等待队列上的线程,用于线程间同步与事件等待。
模块公共头文件
接口清单
| 接口名称 | 功能简述 |
|---|---|
| osal_wait_init | 初始化一个等待队列 |
| osal_wait_interruptible | 阻塞睡眠直到条件为真或被信号打断 |
| osal_wait_uninterruptible | 阻塞睡眠(不可中断)直到条件为真 |
| osal_wait_timeout_interruptible | 阻塞睡眠直到条件为真、超时或被信号打断 |
| osal_wait_timeout_uninterruptible | 阻塞睡眠(不可中断)直到条件为真或超时 |
| osal_wait_wakeup | 唤醒阻塞在等待队列上的线程 |
| osal_wait_wakeup_interruptible | 唤醒阻塞在等待队列上的可中断等待线程 |
| osal_wait_destroy | 销毁等待队列并释放其占用的资源 |
Functions
osal_wait_init
声明头文件
功能说明
- 初始化一个等待队列,使其进入可用状态。
- 成功初始化后该等待队列可用于阻塞等待、唤醒与销毁操作。
- 支持 linux、LiteOS、FreeRTOS 系统。
前置条件
- 调用时序约束:wait 指向的 osal_wait 结构体须由调用方预先分配,且 wait->wait 必须为 NULL(未重复初始化)。
- 上下文限制:成功初始化后方可调用等待、唤醒与销毁接口。
入参
| 名称 | 参数类型 | 说明 | 约束取值范围 |
|---|---|---|---|
| wait | osal_wait * | 待初始化的等待队列句柄 | 不为 NULL 且 wait->wait 为 NULL |
返回值
返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 执行成功(OSAL_SUCCESS) | 等待队列初始化成功 |
| -1 | 执行失败(OSAL_FAILURE) | wait 为 NULL、wait->wait 非空(已初始化)或底层资源分配失败 |
参考案例
src/middleware/utils/hcc/comm/hcc.c
osal_wait_interruptible
声明头文件
功能说明
- 阻塞当前线程睡眠,直到条件函数返回真或收到信号。
- 每次等待队列被唤醒时检查条件函数的返回值。
- 在 LiteOS 上等价于 osal_wait_uninterruptible(不支持可中断等待)。
- 支持 linux、LiteOS 系统。
前置条件
- 调用时序约束:当前接口必须在 osal_wait_init 成功返回后调用。
- 上下文限制:当前接口会阻塞当前线程,禁止在中断上下文调用。
入参
| 名称 | 参数类型 | 说明 | 约束取值范围 |
|---|---|---|---|
| wait | osal_wait * | 等待的等待队列句柄 | 不为 NULL 且 wait->wait 已初始化 |
| func | osal_wait_condition_func | 条件判断回调函数,每次唤醒时调用;为 NULL 时按永真条件等待 | 为 NULL 或指向有效的条件判断函数 |
| param | const void * | 传递给条件判断回调函数的参数 | - |
返回值
返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 执行成功(OSAL_SUCCESS) | 条件满足或被唤醒 |
| -1 | 执行失败(OSAL_FAILURE) | wait 为 NULL 或 wait->wait 为 NULL |
| -512 | 被信号中断(-OSAL_ERESTARTSYS) | Linux 下被信号打断;LiteOS 不产生该返回值 |
参考案例
src/middleware/utils/hcc/comm/hcc.c
osal_wait_uninterruptible
声明头文件
功能说明
- 阻塞当前线程睡眠(不可中断),直到条件函数返回真。
- 每次等待队列被唤醒时检查条件函数的返回值。
- 支持 linux、LiteOS、FreeRTOS 系统。
前置条件
- 调用时序约束:当前接口必须在 osal_wait_init 成功返回后调用。
- 上下文限制:当前接口会阻塞当前线程,禁止在中断上下文调用。
入参
| 名称 | 参数类型 | 说明 | 约束取值范围 |
|---|---|---|---|
| wait | osal_wait * | 等待的等待队列句柄 | 不为 NULL 且 wait->wait 已初始化 |
| func | osal_wait_condition_func | 条件判断回调函数,每次唤醒时调用;为 NULL 时按永真条件等待 | 为 NULL 或指向有效的条件判断函数 |
| param | const void * | 传递给条件判断回调函数的参数 | - |
返回值
返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 执行成功(OSAL_SUCCESS) | 条件满足或被唤醒 |
| -1 | 执行失败(OSAL_FAILURE) | wait 为 NULL 或 wait->wait 为 NULL |
osal_wait_timeout_interruptible
int osal_wait_timeout_interruptible(osal_wait *wait, osal_wait_condition_func func, const void *param, unsigned long ms)
声明头文件
功能说明
- 阻塞当前线程睡眠,直到条件函数返回真、超时或收到信号。
- 超时时间以毫秒为单位。
- 支持 linux、LiteOS、FreeRTOS 系统。
前置条件
- 调用时序约束:当前接口必须在 osal_wait_init 成功返回后调用。
- 上下文限制:当前接口会阻塞当前线程,禁止在中断上下文调用。
入参
| 名称 | 参数类型 | 说明 | 约束取值范围 |
|---|---|---|---|
| wait | osal_wait * | 等待的等待队列句柄 | 不为 NULL 且 wait->wait 已初始化 |
| func | osal_wait_condition_func | 条件判断回调函数,每次唤醒时调用;为 NULL 时按永真条件等待并默认返回超时 | 为 NULL 或指向有效的条件判断函数 |
| param | const void * | 传递给条件判断回调函数的参数 | - |
| ms | unsigned long | 超时时间,单位 ms | 0 ~ 0xFFFFFFFF;OSAL_WAIT_FOREVER:0xFFFFFFFF 表示永久等待 |
返回值
返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 超时且条件未满足 | 超时结束后条件仍为假 |
| 大于 0 | 条件已满足,返回剩余时间 | 条件在超时前满足,返回剩余 tick 数(Linux 为 jiffies);LiteOS 下条件在超时点为真时返回 1 |
| -1 | 参数无效(OSAL_FAILURE) | wait 为 NULL 或 wait->wait 为 NULL |
| -512 | 被信号中断(-OSAL_ERESTARTSYS) | Linux 下被信号打断 |
参考案例
src/middleware/utils/hcc/comm/hcc_flow_ctrl.c
osal_wait_timeout_uninterruptible
int osal_wait_timeout_uninterruptible(osal_wait *wait, osal_wait_condition_func func, const void *param, unsigned long ms)
声明头文件
功能说明
- 阻塞当前线程睡眠(不可中断),直到条件函数返回真或超时。
- 超时时间以毫秒为单位。
- 支持 linux、LiteOS 系统。
前置条件
- 调用时序约束:当前接口必须在 osal_wait_init 成功返回后调用。
- 上下文限制:当前接口会阻塞当前线程,禁止在中断上下文调用。
入参
| 名称 | 参数类型 | 说明 | 约束取值范围 |
|---|---|---|---|
| wait | osal_wait * | 等待的等待队列句柄 | 不为 NULL 且 wait->wait 已初始化 |
| func | osal_wait_condition_func | 条件判断回调函数,每次唤醒时调用;为 NULL 时按永真条件等待 | 为 NULL 或指向有效的条件判断函数 |
| param | const void * | 传递给条件判断回调函数的参数 | - |
| ms | unsigned long | 超时时间,单位 ms | 0 ~ 0xFFFFFFFF;OSAL_WAIT_FOREVER:0xFFFFFFFF 表示永久等待 |
返回值
返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 超时且条件未满足 | 超时结束后条件仍为假 |
| 大于 0 | 条件已满足,返回剩余时间 | 条件在超时前满足,返回剩余 tick 数(Linux 为 jiffies) |
| -1 | 参数无效(OSAL_FAILURE) | wait 为 NULL 或 wait->wait 为 NULL |
osal_wait_wakeup
声明头文件
功能说明
- 唤醒阻塞在指定等待队列上的所有线程。
- 与等待接口(如 osal_wait_uninterruptible)配对使用。
- 支持 linux、LiteOS、FreeRTOS 系统。
前置条件
- 调用时序约束:当前接口必须在 osal_wait_init 成功返回后调用。
- 依赖关系:改变等待条件后须调用本接口唤醒等待队列上的线程。
入参
| 名称 | 参数类型 | 说明 | 约束取值范围 |
|---|---|---|---|
| wait | osal_wait * | 待唤醒的等待队列句柄 | 不为 NULL 且 wait->wait 已初始化 |
参考案例
src/middleware/utils/hcc/comm/hcc.c
osal_wait_wakeup_interruptible
声明头文件
功能说明
- 唤醒阻塞在指定等待队列上的可中断等待线程。
- 与 osal_wait_interruptible 配对使用。
- 在 LiteOS 上等价于 osal_wait_wakeup。
- 支持 linux、LiteOS 系统。
前置条件
- 调用时序约束:当前接口必须在 osal_wait_init 成功返回后调用。
- 依赖关系:改变等待条件后须调用本接口唤醒等待队列上的线程。
入参
| 名称 | 参数类型 | 说明 | 约束取值范围 |
|---|---|---|---|
| wait | osal_wait * | 待唤醒的等待队列句柄 | 不为 NULL 且 wait->wait 已初始化 |
osal_wait_destroy
声明头文件
功能说明
- 销毁等待队列并释放其占用的资源。
- 销毁后 wait->wait 被置空,等待队列不可再使用。
- 支持 linux、LiteOS、FreeRTOS 系统。
前置条件
- 调用时序约束:当前接口必须在 osal_wait_init 成功返回后调用。
- 依赖关系:销毁后等待队列不可再使用,调用方应确保无其他线程正在该队列上等待。
入参
| 名称 | 参数类型 | 说明 | 约束取值范围 |
|---|---|---|---|
| wait | osal_wait * | 待销毁的等待队列句柄 | 不为 NULL 且 wait->wait 已初始化 |
参考案例
src/middleware/utils/hcc/comm/hcc.c
Type definitions
osal_wait_condition_func
使用说明
等待队列条件判断回调函数指针类型,在 osal_wait_interruptible、osal_wait_uninterruptible、osal_wait_timeout_interruptible、osal_wait_timeout_uninterruptible 等待接口中每次唤醒时被调用以判定等待条件是否满足。
回调说明:
- 调用时机:等待队列每次被唤醒时调用。
- 参数 param:由等待接口的 param 入参透传而来,用于条件判定的上下文数据。
- 返回值处理:返回非零值表示条件满足(结束等待),返回 0 表示条件未满足(继续等待);返回值按布尔类型使用。
Structures
osal_wait
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| wait | void * | 等待队列底层句柄;由 osal_wait_init 写入,调用方不应直接访问或修改 |