/****************************************************************************** ############################################################################### # Copyright (c) [2017-2020] [ICT/CAS] # # Licensed under the ORAN Software License v1.0 (License) # ############################################################################### ******************************************************************************/ #ifndef __VOS_QUE_H__ #define __VOS_QUE_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** 队列中无消息 */ #define VOS_NO_MSG 0 #define VOS_QUEUE_MSG_SIZE 4 /** 队列中有消息 */ #define VOS_HAVE_MSG (VOS_QUEUE_MSG_SIZE * sizeof(ULONG)) /** 队列类型,linux中只支持 VOS_MSG_Q_FIFO 和 VOS_MSG_Q_PRIORITY 类型 */ typedef enum { VOS_MSG_Q_FIFO = 0, ///< first in first out queue VOS_MSG_Q_PRIORITY = 1, ///< priority sorted queue VOS_MSG_Q_PIPE = 2, ///< pipe queue VOS_MSG_Q_ISOCK = 3, ///< ISOCK queue }VOS_msgq_type_t; /** 消息优先级 */ typedef enum { MSG_PRI_NORMAL = 0, ///< 普通优先级 MSG_PRI_URGENT = 1, ///< 高优先级 }VOS_msgq_pri_t; /** * 创建消息队列 * @param[in] lMaxMsgs 消息队列中最大消息数目 * @param[in] lOptions 选项,VOS_msgq_type_t 类型,linux中支持MSG_Q_FIFO和MSG_Q_PRIORITY * @return 成功返回队列ID,失败则返回 0 */ ULONG VOS_QueCreate(LONG lMaxMsgs, LONG lOptions); /** * 删除队列 * @param[in] msgQId 消息队列ID * @return 成功返回队列ID,失败则返回 0 */ LONG VOS_QueDelete(ULONG msgQId); /** * 向消息队列发消息 * @param[in] msgQId 消息队列ID * @param[in] aulMsg 发送的消息,含有VOS_QUEUE_MSG_SIZE个ULONG的数组 * @param[in] lMsec 当队列满时,发送任务等待的时间,单位是毫秒。 * VOS_WAIT_FOREVER 表示永久等待。VOS_WAIT_NO_WAIT 表示不等待。 * @param[in] lPriority 消息的优先级。分为MSG_PRI_NORMAL和MSG_PRI_URGENT两种。 * @return VOS_OK - 成功,其他 - 失败 * @note WINDOWS中存在Bug,队列满了后,不能等待,只能返回失败 */ LONG VOS_QueSend(ULONG msgQId, ULONG aulMsg[VOS_QUEUE_MSG_SIZE], LONG lMsec, LONG lPriority); /** * 从消息队列接受 * @param[in] msgQId 消息队列ID * @param[in] aulMsg 接收的消息,含有VOS_QUEUE_MSG_SIZE个ULONG的数组 * @param[in] lMsec 当队列满时,发送任务等待的时间,单位是毫秒。 * VOS_WAIT_FOREVER 表示永久等待。VOS_WAIT_NO_WAIT 表示不等待。 * @return 失败为VOS_ERROR;成功时如果消息队列中消息数为0 则返回VOS_NO_MSG, * 如果消息队列中消息数不为0 ,则返回VOS_HAVE_MSG。 * @note 一般任务的入口函数就阻塞在VOS_QueReceive。 */ LONG VOS_QueReceive(ULONG msgQId, ULONG aulMsg[VOS_QUEUE_MSG_SIZE], LONG lMsec); /** * 将队列和任务绑定,用于队列管理,一般创建完队列和任务后调用 * @param[in] hTask 任务句柄 * @param[in] ulQId 消息队列ID */ VOID VOS_QueBindTask(VOS_HANDLE hTask, ULONG ulQId); /** * 获得队列中消息的数目 * @param[in] msgQId 消息队列ID * @return 成功则返回消息队列中消息的数目,失败则VOS_ERROR。 */ LONG VOS_QueNum(ULONG msgQId); /** * 删除所有创建的消息队列 * @return 成功VOS_OK */ LONG VOS_QueClean(); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __VOS_QUE_H__ */