45#define FNONBLOCK O_NONBLOCK
48#define MAX_MQ_FD CONFIG_NQUEUE_DESCRIPTORS
54STATIC pthread_mutex_t
g_mqueueMutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
65 if (strlen(mqName) == 0) {
70 if (strlen(mqName) > (PATH_MAX - 1)) {
80 if (queueCB == NULL) {
82 return LOS_ERRNO_QUEUE_READ_PTR_NULL;
84 tmpQueueCB = GET_QUEUE_HANDLE(queueID);
85 if ((GET_QUEUE_INDEX(queueID) >= LOSCFG_BASE_IPC_QUEUE_LIMIT) || (tmpQueueCB->
queueID != queueID)) {
86 return LOS_ERRNO_QUEUE_INVALID;
88 *queueCB = tmpQueueCB;
96 UINT32 mylen = strlen(name);
98 for (index = 0; index < LOSCFG_BASE_IPC_QUEUE_LIMIT; index++) {
114 if (mqueueCB->
mq_name != NULL) {
119 mqueueCB->
mqcb = NULL;
130 case LOS_ERRNO_QUEUE_NOT_FOUND:
131 case LOS_ERRNO_QUEUE_NOT_CREATE:
132 case LOS_ERRNO_QUEUE_IN_TSKUSE:
133 case LOS_ERRNO_QUEUE_IN_TSKWRITE:
146 nameLen = strlen(mqName);
148 if (mqueueCB->
mq_name == NULL) {
153 if (strncpy_s(mqueueCB->
mq_name, (nameLen + 1), mqName, nameLen) != EOK) {
159 mqueueCB->
mq_name[nameLen] =
'\0';
165 struct mqarray *mqueueCB = NULL;
175 mqueueCB->
mq_id = mqueueID;
178 if (mqueueCB == NULL) {
196 mqueueCB->
mqcb = NULL;
214 if ((mqueueCB != NULL) && (mqueueCB->
mq_name != NULL)) {
232 if (privateMqPersonal == NULL) {
241 privateMqPersonal->
mq_flags = openFlag;
242 privateMqPersonal->
mq_status = MQ_USE_MAGIC;
245 return privateMqPersonal;
253 struct mqarray *mqueueCB = NULL;
257 if (mqueueCB == NULL || mqueueCB->
mq_personal == NULL) {
267 if (tmp->
mq_next == privateMqPersonal) {
281 (VOID)
LOS_MemFree(OS_SYS_MEM_ADDR, privateMqPersonal);
293 INT32 id = sysFd - MQUEUE_FD_OFFSET;
296 if ((
id < 0) || (
id >= MAX_MQ_FD)) {
315 for (i = 0; i < maxfdp; i++) {
317 if (fdset && !(FD_ISSET(i + MQUEUE_FD_OFFSET, fdset))) {
318 FD_SET(i + MQUEUE_FD_OFFSET, fdset);
321 return i + MQUEUE_FD_OFFSET;
332 if (fdset && FD_ISSET(sysFd, fdset)) {
333 FD_CLR(sysFd, fdset);
341 struct mqarray *mqueueCB = NULL;
347 if (privateMqPersonal == NULL) {
351 if (mqueueCB == NULL) {
363 struct mqarray *mqueueCB = NULL;
365 if (mqueueCB == NULL) {
383 struct mqarray *mqueueCB = NULL;
390 if (mqueueCB == NULL) {
397 SCHEDULER_LOCK(intSave);
401 SCHEDULER_UNLOCK(intSave);
404 if (mode & S_IRUSR) {
407 if (mode & S_IWUSR) {
410 if (mode & S_IRGRP) {
413 if (mode & S_IWGRP) {
416 if (mode & S_IROTH) {
419 if (mode & S_IWOTH) {
432 if (mqueueCB == NULL) {
438 SCHEDULER_LOCK(intSave);
442 SCHEDULER_UNLOCK(intSave);
453 }
else if (
egid == mqueueCB->
egid) {
488 struct mqarray *mqueueCB = NULL;
491 struct mq_attr defaultAttr = { 0, MQ_MAX_MSG_NUM, MQ_MAX_MSG_LEN, 0 };
495 unsigned int mode = 0;
504 if (mqueueCB != NULL) {
511 va_start(ap, openFlag);
512 mode = va_arg(ap,
unsigned int);
513 attr = va_arg(ap,
struct mq_attr *);
519 privateMqPersonal =
DoMqueueCreate(&defaultAttr, mqName, openFlag, mode);
559 if (privateMqPersonal == NULL) {
563 if (privateMqPersonal->
mq_status != MQ_USE_MAGIC) {
586 struct mqarray *mqueueCB = NULL;
590 if (privateMqPersonal == NULL) {
594 if (mqAttr == NULL) {
600 if (privateMqPersonal->
mq_status != MQ_USE_MAGIC) {
620 if (privateMqPersonal == NULL) {
624 if (mqSetAttr == NULL) {
630 if (privateMqPersonal->
mq_status != MQ_USE_MAGIC) {
636 if (mqOldAttr != NULL) {
659 struct mqarray *mqueueCB = NULL;
667 if (mqueueCB == NULL) {
689 *ticks = LOS_NO_WAIT;
693 if (absTimeout == NULL) {
694 *ticks = LOS_WAIT_FOREVER;
713 if ((msg == NULL) || (msgLen == 0)) {
736 info.si_code = SI_MESGQ;
749#define OS_MQ_GOTO_ERROUT_UNLOCK_IF(expr, errcode) \
752 goto ERROUT_UNLOCK; \
754#define OS_MQ_GOTO_ERROUT_IF(expr, errcode) \
760 const struct timespec *absTimeout)
764 struct mqarray *mqueueCB = NULL;
767 OS_MQ_GOTO_ERROUT_IF(!
MqParamCheck(personal, msg, msgLen), errno);
768 OS_MQ_GOTO_ERROUT_IF(msgPrio > (MQ_PRIO_MAX - 1), EINVAL);
773 OS_MQ_GOTO_ERROUT_UNLOCK_IF(privateMqPersonal == NULL || privateMqPersonal->
mq_status != MQ_USE_MAGIC, EBADF);
776 OS_MQ_GOTO_ERROUT_UNLOCK_IF(msgLen > (
size_t)(mqueueCB->
mqcb->
queueSize -
sizeof(
UINT32)), EMSGSIZE);
782 OS_MQ_GOTO_ERROUT_UNLOCK_IF(
ConvertTimeout(privateMqPersonal->
mq_flags, absTimeout, &absTicks) == -1, errno);
783 mqueueID = mqueueCB->
mq_id;
802 const struct timespec *absTimeout)
807 struct mqarray *mqueueCB = NULL;
814 if (msgPrio != NULL) {
820 if (privateMqPersonal == NULL || privateMqPersonal->
mq_status != MQ_USE_MAGIC) {
841 mqueueID = mqueueCB->
mq_id;
858int mq_send(
mqd_t personal,
const char *msg_ptr,
size_t msg_len,
unsigned int msg_prio)
860 return mq_timedsend(personal, msg_ptr, msg_len, msg_prio, NULL);
876 if (sigev->sigev_notify != SIGEV_NONE && sigev->sigev_notify != SIGEV_SIGNAL) {
880 if (sigev->sigev_notify == SIGEV_SIGNAL && !
GOOD_SIGNO(sigev->sigev_signo)) {
893 struct mqarray *mqueueCB = NULL;
903 if (privateMqPersonal == NULL) {
907 if (privateMqPersonal->
mq_status != MQ_USE_MAGIC) {
923 switch (sigev->sigev_notify) {
LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
Identify whether a specified doubly linked list is empty. | 判断链表是否为空
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
LITE_OS_SEC_TEXT UINT32 LOS_QueueReadCopy(UINT32 queueID, VOID *bufferAddr, UINT32 *bufferSize, UINT32 timeout)
接口函数定时读取消息队列
LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueCreate(CHAR *queueName, UINT16 len, UINT32 *queueID, UINT32 flags, UINT16 maxMsgSize)
创建一个队列,根据用户传入队列长度和消息节点大小来开辟相应的内存空间以供该队列使用,参数queueID带走队列ID
LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueDelete(UINT32 queueID)
Delete a queue.
LITE_OS_SEC_TEXT UINT32 LOS_QueueWriteCopy(UINT32 queueID, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeout)
接口函数 从队列尾部开始写
int mq_getsetattr(mqd_t mqd, const struct mq_attr *new, struct mq_attr *old)
int mq_send(mqd_t personal, const char *msg_ptr, size_t msg_len, unsigned int msg_prio)
mqd_t mq_open(const char *mqName, int openFlag,...)
int mq_close(mqd_t personal)
ssize_t mq_receive(mqd_t personal, char *msg_ptr, size_t msg_len, unsigned int *msg_prio)
int mq_timedsend(mqd_t personal, const char *msg, size_t msgLen, unsigned int msgPrio, const struct timespec *absTimeout)
int mq_unlink(const char *mqName)
ssize_t mq_timedreceive(mqd_t personal, char *msg, size_t msgLen, unsigned int *msgPrio, const struct timespec *absTimeout)
LITE_OS_SEC_TEXT UINT32 LOS_GetCurrProcessID(VOID)
获取当前进程的进程ID
STATIC INLINE User * OsCurrUserGet(VOID)
int OsDispatch(pid_t pid, siginfo_t *info, int permission)
信号分发,发送信号权限/进程组过滤.
static int GOOD_SIGNO(unsigned int sig)
信号ID是否有效
int map_errno(UINT32 err)
int OsMqSetAttr(mqd_t personal, const struct mq_attr *mqSetAttr, struct mq_attr *mqOldAttr)
int OsMqGetAttr(mqd_t personal, struct mq_attr *mqAttr)
void MqueueRefer(int sysFd)
STATIC INLINE UINT32 GetMqueueCBByID(UINT32 queueID, LosQueueCB **queueCB)
STATIC struct mqpersonal * DoMqueueCreate(const struct mq_attr *attr, const CHAR *mqName, INT32 openFlag, UINT32 mode)
STATIC INLINE BOOL MqNotifyParamCheck(mqd_t personal, const struct sigevent *sigev)
STATIC INT32 GetPermissionOfVisitor(struct mqarray *mqueueCB)
STATIC struct mqpersonal * g_mqPrivBuf[MAX_MQ_FD]
STATIC fd_set g_queueFdSet
STATIC struct mqarray g_queueTable[LOSCFG_BASE_IPC_QUEUE_LIMIT]
STATIC struct mqpersonal * DoMqueueOpen(struct mqarray *mqueueCB, INT32 openFlag)
STATIC INT32 MqAllocSysFd(int maxfdp, struct mqpersonal *privateMqPersonal)
STATIC INLINE INT32 MqNameCheck(const CHAR *mqName)
STATIC INT32 DoMqueueDelete(struct mqarray *mqueueCB)
STATIC pthread_mutex_t g_mqueueMutex
STATIC int SaveMqueueName(const CHAR *mqName, struct mqarray *mqueueCB)
STATIC VOID MqFreeSysFd(mqd_t personal)
STATIC struct mqpersonal * MqGetPrivDataBuff(mqd_t personal)
STATIC INT32 MqueueModeAnalysisSet(struct mqpersonal *privateMqPersonal)
STATIC INT32 DoMqueueClose(struct mqpersonal *privateMqPersonal)
STATIC INT32 ConvertTimeout(long flags, const struct timespec *absTimeout, UINT64 *ticks)
STATIC INT32 GetMqueueAttr(struct mq_attr *defaultAttr, struct mq_attr *attr)
STATIC INLINE struct mqarray * GetMqueueCBByName(const CHAR *name)
static void MqSendNotify(struct mqarray *mqueueCB)
STATIC INLINE BOOL MqParamCheck(mqd_t personal, const char *msg, size_t msgLen)
int OsMqNotify(mqd_t personal, const struct sigevent *sigev)
STATIC INT32 MqTryClose(struct mqpersonal *privateMqPersonal)
int pthread_mutex_lock(pthread_mutex_t *mutex)
互斥锁加锁操作
int pthread_mutex_unlock(pthread_mutex_t *mutex)
解锁互斥锁
UINT16 readWriteableCnt[OS_QUEUE_N_RW]
LOS_DL_LIST readWriteList[OS_QUEUE_N_RW]
struct mqpersonal * mq_personal
struct mqnotify mq_notify
struct mqarray * mq_posixdes
struct mqpersonal * mq_next
STATIC INLINE BOOL ValidTimeSpec(const struct timespec *tp)
STATIC INLINE UINT32 OsTimeSpec2Tick(const struct timespec *tp)
size_t LOS_ArchCopyFromUser(void *dst, const void *src, size_t len)