13d8536b4Sopenharmony_ci/* 23d8536b4Sopenharmony_ci * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. 33d8536b4Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. 43d8536b4Sopenharmony_ci * 53d8536b4Sopenharmony_ci * Redistribution and use in source and binary forms, with or without modification, 63d8536b4Sopenharmony_ci * are permitted provided that the following conditions are met: 73d8536b4Sopenharmony_ci * 83d8536b4Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright notice, this list of 93d8536b4Sopenharmony_ci * conditions and the following disclaimer. 103d8536b4Sopenharmony_ci * 113d8536b4Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright notice, this list 123d8536b4Sopenharmony_ci * of conditions and the following disclaimer in the documentation and/or other materials 133d8536b4Sopenharmony_ci * provided with the distribution. 143d8536b4Sopenharmony_ci * 153d8536b4Sopenharmony_ci * 3. Neither the name of the copyright holder nor the names of its contributors may be used 163d8536b4Sopenharmony_ci * to endorse or promote products derived from this software without specific prior written 173d8536b4Sopenharmony_ci * permission. 183d8536b4Sopenharmony_ci * 193d8536b4Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 203d8536b4Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 213d8536b4Sopenharmony_ci * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 223d8536b4Sopenharmony_ci * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 233d8536b4Sopenharmony_ci * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 243d8536b4Sopenharmony_ci * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 253d8536b4Sopenharmony_ci * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 263d8536b4Sopenharmony_ci * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 273d8536b4Sopenharmony_ci * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 283d8536b4Sopenharmony_ci * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 293d8536b4Sopenharmony_ci * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 303d8536b4Sopenharmony_ci */ 313d8536b4Sopenharmony_ci 323d8536b4Sopenharmony_ci#include "mqueue_impl.h" 333d8536b4Sopenharmony_ci#include "time_internal.h" 343d8536b4Sopenharmony_ci 353d8536b4Sopenharmony_ci/* GLOBALS */ 363d8536b4Sopenharmony_ciSTATIC struct mqarray g_queueTable[LOSCFG_BASE_IPC_QUEUE_LIMIT]; 373d8536b4Sopenharmony_ciSTATIC pthread_mutex_t g_mqueueMutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; 383d8536b4Sopenharmony_ci 393d8536b4Sopenharmony_ciint MapMqErrno(UINT32 err) 403d8536b4Sopenharmony_ci{ 413d8536b4Sopenharmony_ci if (err == LOS_OK) { 423d8536b4Sopenharmony_ci return ENOERR; 433d8536b4Sopenharmony_ci } 443d8536b4Sopenharmony_ci switch (err) { 453d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_INVALID: 463d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_WRITE_PTR_NULL: 473d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_WRITESIZE_ISZERO: 483d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_SIZE_TOO_BIG: 493d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_CREAT_PTR_NULL: 503d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_PARA_ISZERO: 513d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_WRITE_SIZE_TOO_BIG: 523d8536b4Sopenharmony_ci errno = EINVAL; 533d8536b4Sopenharmony_ci break; 543d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_ISFULL: 553d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_ISEMPTY: 563d8536b4Sopenharmony_ci errno = EAGAIN; 573d8536b4Sopenharmony_ci break; 583d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_CREATE_NO_MEMORY: 593d8536b4Sopenharmony_ci errno = ENOSPC; 603d8536b4Sopenharmony_ci break; 613d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_TIMEOUT: 623d8536b4Sopenharmony_ci errno = ETIMEDOUT; 633d8536b4Sopenharmony_ci break; 643d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_CB_UNAVAILABLE: 653d8536b4Sopenharmony_ci errno = ENFILE; 663d8536b4Sopenharmony_ci break; 673d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_READ_IN_INTERRUPT: 683d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_WRITE_IN_INTERRUPT: 693d8536b4Sopenharmony_ci errno = EINTR; 703d8536b4Sopenharmony_ci break; 713d8536b4Sopenharmony_ci default: 723d8536b4Sopenharmony_ci errno = EINVAL; 733d8536b4Sopenharmony_ci break; 743d8536b4Sopenharmony_ci } 753d8536b4Sopenharmony_ci return errno; 763d8536b4Sopenharmony_ci} 773d8536b4Sopenharmony_ci 783d8536b4Sopenharmony_ciSTATIC INLINE INT32 MqNameCheck(const CHAR *mqName) 793d8536b4Sopenharmony_ci{ 803d8536b4Sopenharmony_ci if (mqName == NULL) { 813d8536b4Sopenharmony_ci errno = EINVAL; 823d8536b4Sopenharmony_ci return -1; 833d8536b4Sopenharmony_ci } 843d8536b4Sopenharmony_ci 853d8536b4Sopenharmony_ci if (strlen(mqName) == 0) { 863d8536b4Sopenharmony_ci errno = EINVAL; 873d8536b4Sopenharmony_ci return -1; 883d8536b4Sopenharmony_ci } 893d8536b4Sopenharmony_ci 903d8536b4Sopenharmony_ci if (strlen(mqName) > (PATH_MAX - 1)) { 913d8536b4Sopenharmony_ci errno = ENAMETOOLONG; 923d8536b4Sopenharmony_ci return -1; 933d8536b4Sopenharmony_ci } 943d8536b4Sopenharmony_ci return 0; 953d8536b4Sopenharmony_ci} 963d8536b4Sopenharmony_ci 973d8536b4Sopenharmony_ciSTATIC INLINE UINT32 GetMqueueCBByID(UINT32 queueID, LosQueueCB **queueCB) 983d8536b4Sopenharmony_ci{ 993d8536b4Sopenharmony_ci LosQueueCB *tmpQueueCB = NULL; 1003d8536b4Sopenharmony_ci if (queueCB == NULL) { 1013d8536b4Sopenharmony_ci errno = EINVAL; 1023d8536b4Sopenharmony_ci return LOS_ERRNO_QUEUE_READ_PTR_NULL; 1033d8536b4Sopenharmony_ci } 1043d8536b4Sopenharmony_ci tmpQueueCB = GET_QUEUE_HANDLE(queueID); 1053d8536b4Sopenharmony_ci if ((GET_QUEUE_INDEX(queueID) >= LOSCFG_BASE_IPC_QUEUE_LIMIT) || (tmpQueueCB->queueID != queueID)) { 1063d8536b4Sopenharmony_ci return LOS_ERRNO_QUEUE_INVALID; 1073d8536b4Sopenharmony_ci } 1083d8536b4Sopenharmony_ci *queueCB = tmpQueueCB; 1093d8536b4Sopenharmony_ci 1103d8536b4Sopenharmony_ci return LOS_OK; 1113d8536b4Sopenharmony_ci} 1123d8536b4Sopenharmony_ci 1133d8536b4Sopenharmony_ciSTATIC INLINE struct mqarray *GetMqueueCBByName(const CHAR *name) 1143d8536b4Sopenharmony_ci{ 1153d8536b4Sopenharmony_ci UINT32 index; 1163d8536b4Sopenharmony_ci UINT32 mylen = strlen(name); 1173d8536b4Sopenharmony_ci 1183d8536b4Sopenharmony_ci for (index = 0; index < LOSCFG_BASE_IPC_QUEUE_LIMIT; index++) { 1193d8536b4Sopenharmony_ci if ((g_queueTable[index].mq_name == NULL) || (strlen(g_queueTable[index].mq_name) != mylen)) { 1203d8536b4Sopenharmony_ci continue; 1213d8536b4Sopenharmony_ci } 1223d8536b4Sopenharmony_ci 1233d8536b4Sopenharmony_ci if (strncmp(name, (const CHAR *)(g_queueTable[index].mq_name), mylen) == 0) { 1243d8536b4Sopenharmony_ci return &(g_queueTable[index]); 1253d8536b4Sopenharmony_ci } 1263d8536b4Sopenharmony_ci } 1273d8536b4Sopenharmony_ci 1283d8536b4Sopenharmony_ci return NULL; 1293d8536b4Sopenharmony_ci} 1303d8536b4Sopenharmony_ci 1313d8536b4Sopenharmony_ciSTATIC INT32 DoMqueueDelete(struct mqarray *mqueueCB) 1323d8536b4Sopenharmony_ci{ 1333d8536b4Sopenharmony_ci UINT32 ret; 1343d8536b4Sopenharmony_ci 1353d8536b4Sopenharmony_ci if (mqueueCB->mq_name != NULL) { 1363d8536b4Sopenharmony_ci LOS_MemFree(OS_SYS_MEM_ADDR, mqueueCB->mq_name); 1373d8536b4Sopenharmony_ci mqueueCB->mq_name = NULL; 1383d8536b4Sopenharmony_ci } 1393d8536b4Sopenharmony_ci 1403d8536b4Sopenharmony_ci mqueueCB->mqcb = NULL; 1413d8536b4Sopenharmony_ci 1423d8536b4Sopenharmony_ci ret = LOS_QueueDelete(mqueueCB->mq_id); 1433d8536b4Sopenharmony_ci switch (ret) { 1443d8536b4Sopenharmony_ci case LOS_OK: 1453d8536b4Sopenharmony_ci return 0; 1463d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_NOT_FOUND: 1473d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_NOT_CREATE: 1483d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_IN_TSKUSE: 1493d8536b4Sopenharmony_ci case LOS_ERRNO_QUEUE_IN_TSKWRITE: 1503d8536b4Sopenharmony_ci errno = EAGAIN; 1513d8536b4Sopenharmony_ci return -1; 1523d8536b4Sopenharmony_ci default: 1533d8536b4Sopenharmony_ci errno = EINVAL; 1543d8536b4Sopenharmony_ci return -1; 1553d8536b4Sopenharmony_ci } 1563d8536b4Sopenharmony_ci} 1573d8536b4Sopenharmony_ci 1583d8536b4Sopenharmony_ciSTATIC int SaveMqueueName(const CHAR *mqName, struct mqarray *mqueueCB) 1593d8536b4Sopenharmony_ci{ 1603d8536b4Sopenharmony_ci size_t nameLen; 1613d8536b4Sopenharmony_ci 1623d8536b4Sopenharmony_ci nameLen = strlen(mqName); /* sys_mq_open has checked name and name length */ 1633d8536b4Sopenharmony_ci mqueueCB->mq_name = (char *)LOS_MemAlloc(OS_SYS_MEM_ADDR, nameLen + 1); 1643d8536b4Sopenharmony_ci if (mqueueCB->mq_name == NULL) { 1653d8536b4Sopenharmony_ci errno = ENOMEM; 1663d8536b4Sopenharmony_ci return (int)LOS_NOK; 1673d8536b4Sopenharmony_ci } 1683d8536b4Sopenharmony_ci 1693d8536b4Sopenharmony_ci if (strncpy_s(mqueueCB->mq_name, (nameLen + 1), mqName, nameLen) != EOK) { 1703d8536b4Sopenharmony_ci LOS_MemFree(OS_SYS_MEM_ADDR, mqueueCB->mq_name); 1713d8536b4Sopenharmony_ci mqueueCB->mq_name = NULL; 1723d8536b4Sopenharmony_ci errno = EINVAL; 1733d8536b4Sopenharmony_ci return (int)LOS_NOK; 1743d8536b4Sopenharmony_ci } 1753d8536b4Sopenharmony_ci mqueueCB->mq_name[nameLen] = '\0'; 1763d8536b4Sopenharmony_ci return LOS_OK; 1773d8536b4Sopenharmony_ci} 1783d8536b4Sopenharmony_ci 1793d8536b4Sopenharmony_ciSTATIC struct mqpersonal *DoMqueueCreate(const struct mq_attr *attr, const CHAR *mqName, INT32 openFlag) 1803d8536b4Sopenharmony_ci{ 1813d8536b4Sopenharmony_ci struct mqarray *mqueueCB = NULL; 1823d8536b4Sopenharmony_ci UINT32 mqueueID; 1833d8536b4Sopenharmony_ci 1843d8536b4Sopenharmony_ci UINT32 err = LOS_QueueCreate(NULL, attr->mq_maxmsg, &mqueueID, 0, attr->mq_msgsize); 1853d8536b4Sopenharmony_ci if (MapMqErrno(err) != ENOERR) { 1863d8536b4Sopenharmony_ci goto ERROUT; 1873d8536b4Sopenharmony_ci } 1883d8536b4Sopenharmony_ci 1893d8536b4Sopenharmony_ci if (g_queueTable[GET_QUEUE_INDEX(mqueueID)].mqcb == NULL) { 1903d8536b4Sopenharmony_ci mqueueCB = &(g_queueTable[GET_QUEUE_INDEX(mqueueID)]); 1913d8536b4Sopenharmony_ci mqueueCB->mq_id = mqueueID; 1923d8536b4Sopenharmony_ci } 1933d8536b4Sopenharmony_ci 1943d8536b4Sopenharmony_ci if (mqueueCB == NULL) { 1953d8536b4Sopenharmony_ci errno = EINVAL; 1963d8536b4Sopenharmony_ci goto ERROUT; 1973d8536b4Sopenharmony_ci } 1983d8536b4Sopenharmony_ci 1993d8536b4Sopenharmony_ci if (SaveMqueueName(mqName, mqueueCB) != LOS_OK) { 2003d8536b4Sopenharmony_ci goto ERROUT; 2013d8536b4Sopenharmony_ci } 2023d8536b4Sopenharmony_ci 2033d8536b4Sopenharmony_ci if (GetMqueueCBByID(mqueueCB->mq_id, &(mqueueCB->mqcb)) != LOS_OK) { 2043d8536b4Sopenharmony_ci errno = ENOSPC; 2053d8536b4Sopenharmony_ci goto ERROUT; 2063d8536b4Sopenharmony_ci } 2073d8536b4Sopenharmony_ci 2083d8536b4Sopenharmony_ci mqueueCB->mq_personal = (struct mqpersonal *)LOS_MemAlloc(OS_SYS_MEM_ADDR, sizeof(struct mqpersonal)); 2093d8536b4Sopenharmony_ci if (mqueueCB->mq_personal == NULL) { 2103d8536b4Sopenharmony_ci (VOID)LOS_QueueDelete(mqueueCB->mq_id); 2113d8536b4Sopenharmony_ci mqueueCB->mqcb->queue = NULL; 2123d8536b4Sopenharmony_ci mqueueCB->mqcb = NULL; 2133d8536b4Sopenharmony_ci errno = ENOSPC; 2143d8536b4Sopenharmony_ci goto ERROUT; 2153d8536b4Sopenharmony_ci } 2163d8536b4Sopenharmony_ci 2173d8536b4Sopenharmony_ci mqueueCB->unlinkflag = FALSE; 2183d8536b4Sopenharmony_ci mqueueCB->mq_personal->mq_status = MQ_USE_MAGIC; 2193d8536b4Sopenharmony_ci mqueueCB->mq_personal->mq_next = NULL; 2203d8536b4Sopenharmony_ci mqueueCB->mq_personal->mq_posixdes = mqueueCB; 2213d8536b4Sopenharmony_ci mqueueCB->mq_personal->mq_flags = (INT32)((UINT32)openFlag | ((UINT32)attr->mq_flags & (UINT32)FNONBLOCK)); 2223d8536b4Sopenharmony_ci 2233d8536b4Sopenharmony_ci return mqueueCB->mq_personal; 2243d8536b4Sopenharmony_ciERROUT: 2253d8536b4Sopenharmony_ci 2263d8536b4Sopenharmony_ci if ((mqueueCB != NULL) && (mqueueCB->mq_name != NULL)) { 2273d8536b4Sopenharmony_ci LOS_MemFree(OS_SYS_MEM_ADDR, mqueueCB->mq_name); 2283d8536b4Sopenharmony_ci mqueueCB->mq_name = NULL; 2293d8536b4Sopenharmony_ci } 2303d8536b4Sopenharmony_ci return (struct mqpersonal *)-1; 2313d8536b4Sopenharmony_ci} 2323d8536b4Sopenharmony_ci 2333d8536b4Sopenharmony_ciSTATIC struct mqpersonal *DoMqueueOpen(struct mqarray *mqueueCB, INT32 openFlag) 2343d8536b4Sopenharmony_ci{ 2353d8536b4Sopenharmony_ci struct mqpersonal *privateMqPersonal = NULL; 2363d8536b4Sopenharmony_ci 2373d8536b4Sopenharmony_ci /* already have the same name of g_squeuetable */ 2383d8536b4Sopenharmony_ci if (mqueueCB->unlinkflag == TRUE) { 2393d8536b4Sopenharmony_ci errno = EINVAL; 2403d8536b4Sopenharmony_ci goto ERROUT; 2413d8536b4Sopenharmony_ci } 2423d8536b4Sopenharmony_ci /* alloc mqprivate and add to mqarray */ 2433d8536b4Sopenharmony_ci privateMqPersonal = (struct mqpersonal *)LOS_MemAlloc(OS_SYS_MEM_ADDR, sizeof(struct mqpersonal)); 2443d8536b4Sopenharmony_ci if (privateMqPersonal == NULL) { 2453d8536b4Sopenharmony_ci errno = ENOSPC; 2463d8536b4Sopenharmony_ci goto ERROUT; 2473d8536b4Sopenharmony_ci } 2483d8536b4Sopenharmony_ci 2493d8536b4Sopenharmony_ci privateMqPersonal->mq_next = mqueueCB->mq_personal; 2503d8536b4Sopenharmony_ci mqueueCB->mq_personal = privateMqPersonal; 2513d8536b4Sopenharmony_ci 2523d8536b4Sopenharmony_ci privateMqPersonal->mq_posixdes = mqueueCB; 2533d8536b4Sopenharmony_ci privateMqPersonal->mq_flags = openFlag; 2543d8536b4Sopenharmony_ci privateMqPersonal->mq_status = MQ_USE_MAGIC; 2553d8536b4Sopenharmony_ci 2563d8536b4Sopenharmony_ci return privateMqPersonal; 2573d8536b4Sopenharmony_ci 2583d8536b4Sopenharmony_ciERROUT: 2593d8536b4Sopenharmony_ci return (struct mqpersonal *)-1; 2603d8536b4Sopenharmony_ci} 2613d8536b4Sopenharmony_ci 2623d8536b4Sopenharmony_cimqd_t mq_open(const char *mqName, int openFlag, ...) 2633d8536b4Sopenharmony_ci{ 2643d8536b4Sopenharmony_ci struct mqarray *mqueueCB = NULL; 2653d8536b4Sopenharmony_ci struct mqpersonal *privateMqPersonal = (struct mqpersonal *)-1; 2663d8536b4Sopenharmony_ci struct mq_attr *attr = NULL; 2673d8536b4Sopenharmony_ci struct mq_attr defaultAttr = { 0, MQ_MAX_MSG_NUM, MQ_MAX_MSG_LEN, 0, {0} }; 2683d8536b4Sopenharmony_ci 2693d8536b4Sopenharmony_ci va_list ap; 2703d8536b4Sopenharmony_ci 2713d8536b4Sopenharmony_ci if (MqNameCheck(mqName) == -1) { 2723d8536b4Sopenharmony_ci return (mqd_t)-1; 2733d8536b4Sopenharmony_ci } 2743d8536b4Sopenharmony_ci 2753d8536b4Sopenharmony_ci (VOID)pthread_mutex_lock(&g_mqueueMutex); 2763d8536b4Sopenharmony_ci mqueueCB = GetMqueueCBByName(mqName); 2773d8536b4Sopenharmony_ci if ((UINT32)openFlag & (UINT32)O_CREAT) { 2783d8536b4Sopenharmony_ci if (mqueueCB != NULL) { 2793d8536b4Sopenharmony_ci if (((UINT32)openFlag & (UINT32)O_EXCL)) { 2803d8536b4Sopenharmony_ci errno = EEXIST; 2813d8536b4Sopenharmony_ci goto OUT; 2823d8536b4Sopenharmony_ci } 2833d8536b4Sopenharmony_ci privateMqPersonal = DoMqueueOpen(mqueueCB, openFlag); 2843d8536b4Sopenharmony_ci } else { 2853d8536b4Sopenharmony_ci va_start(ap, openFlag); 2863d8536b4Sopenharmony_ci (VOID)va_arg(ap, int); 2873d8536b4Sopenharmony_ci attr = va_arg(ap, struct mq_attr *); 2883d8536b4Sopenharmony_ci va_end(ap); 2893d8536b4Sopenharmony_ci 2903d8536b4Sopenharmony_ci if (attr != NULL) { 2913d8536b4Sopenharmony_ci (VOID)memcpy_s(&defaultAttr, sizeof(struct mq_attr), attr, sizeof(struct mq_attr)); 2923d8536b4Sopenharmony_ci if ((defaultAttr.mq_maxmsg < 0) || (defaultAttr.mq_maxmsg > (long int)USHRT_MAX) || 2933d8536b4Sopenharmony_ci (defaultAttr.mq_msgsize < 0) || (defaultAttr.mq_msgsize > (long int)(USHRT_MAX - sizeof(UINT32)))) { 2943d8536b4Sopenharmony_ci errno = EINVAL; 2953d8536b4Sopenharmony_ci goto OUT; 2963d8536b4Sopenharmony_ci } 2973d8536b4Sopenharmony_ci } 2983d8536b4Sopenharmony_ci privateMqPersonal = DoMqueueCreate(&defaultAttr, mqName, openFlag); 2993d8536b4Sopenharmony_ci } 3003d8536b4Sopenharmony_ci } else { 3013d8536b4Sopenharmony_ci if (mqueueCB == NULL) { 3023d8536b4Sopenharmony_ci errno = ENOENT; 3033d8536b4Sopenharmony_ci goto OUT; 3043d8536b4Sopenharmony_ci } 3053d8536b4Sopenharmony_ci privateMqPersonal = DoMqueueOpen(mqueueCB, openFlag); 3063d8536b4Sopenharmony_ci } 3073d8536b4Sopenharmony_ci 3083d8536b4Sopenharmony_ciOUT: 3093d8536b4Sopenharmony_ci (VOID)pthread_mutex_unlock(&g_mqueueMutex); 3103d8536b4Sopenharmony_ci return (mqd_t)privateMqPersonal; 3113d8536b4Sopenharmony_ci} 3123d8536b4Sopenharmony_ci 3133d8536b4Sopenharmony_ciint mq_close(mqd_t personal) 3143d8536b4Sopenharmony_ci{ 3153d8536b4Sopenharmony_ci INT32 ret = -1; 3163d8536b4Sopenharmony_ci struct mqarray *mqueueCB = NULL; 3173d8536b4Sopenharmony_ci struct mqpersonal *privateMqPersonal = NULL; 3183d8536b4Sopenharmony_ci struct mqpersonal *tmp = NULL; 3193d8536b4Sopenharmony_ci 3203d8536b4Sopenharmony_ci if ((personal == (mqd_t)NULL) || (personal == (mqd_t)-1)) { 3213d8536b4Sopenharmony_ci errno = EBADF; 3223d8536b4Sopenharmony_ci return -1; 3233d8536b4Sopenharmony_ci } 3243d8536b4Sopenharmony_ci 3253d8536b4Sopenharmony_ci (VOID)pthread_mutex_lock(&g_mqueueMutex); 3263d8536b4Sopenharmony_ci privateMqPersonal = (struct mqpersonal *)personal; 3273d8536b4Sopenharmony_ci if (privateMqPersonal->mq_status != MQ_USE_MAGIC) { 3283d8536b4Sopenharmony_ci errno = EBADF; 3293d8536b4Sopenharmony_ci goto OUT_UNLOCK; 3303d8536b4Sopenharmony_ci } 3313d8536b4Sopenharmony_ci 3323d8536b4Sopenharmony_ci mqueueCB = privateMqPersonal->mq_posixdes; 3333d8536b4Sopenharmony_ci if (mqueueCB->mq_personal == NULL) { 3343d8536b4Sopenharmony_ci errno = EBADF; 3353d8536b4Sopenharmony_ci goto OUT_UNLOCK; 3363d8536b4Sopenharmony_ci } 3373d8536b4Sopenharmony_ci 3383d8536b4Sopenharmony_ci /* find the personal and remove */ 3393d8536b4Sopenharmony_ci if (mqueueCB->mq_personal == privateMqPersonal) { 3403d8536b4Sopenharmony_ci mqueueCB->mq_personal = privateMqPersonal->mq_next; 3413d8536b4Sopenharmony_ci } else { 3423d8536b4Sopenharmony_ci for (tmp = mqueueCB->mq_personal; tmp->mq_next != NULL; tmp = tmp->mq_next) { 3433d8536b4Sopenharmony_ci if (tmp->mq_next == privateMqPersonal) { 3443d8536b4Sopenharmony_ci break; 3453d8536b4Sopenharmony_ci } 3463d8536b4Sopenharmony_ci } 3473d8536b4Sopenharmony_ci if (tmp->mq_next == NULL) { 3483d8536b4Sopenharmony_ci errno = EBADF; 3493d8536b4Sopenharmony_ci goto OUT_UNLOCK; 3503d8536b4Sopenharmony_ci } 3513d8536b4Sopenharmony_ci tmp->mq_next = privateMqPersonal->mq_next; 3523d8536b4Sopenharmony_ci } 3533d8536b4Sopenharmony_ci /* flag no use */ 3543d8536b4Sopenharmony_ci privateMqPersonal->mq_status = 0; 3553d8536b4Sopenharmony_ci 3563d8536b4Sopenharmony_ci /* free the personal */ 3573d8536b4Sopenharmony_ci ret = LOS_MemFree(OS_SYS_MEM_ADDR, privateMqPersonal); 3583d8536b4Sopenharmony_ci if (ret != LOS_OK) { 3593d8536b4Sopenharmony_ci errno = EFAULT; 3603d8536b4Sopenharmony_ci ret = -1; 3613d8536b4Sopenharmony_ci goto OUT_UNLOCK; 3623d8536b4Sopenharmony_ci } 3633d8536b4Sopenharmony_ci 3643d8536b4Sopenharmony_ci if ((mqueueCB->unlinkflag == TRUE) && (mqueueCB->mq_personal == NULL)) { 3653d8536b4Sopenharmony_ci ret = DoMqueueDelete(mqueueCB); 3663d8536b4Sopenharmony_ci } 3673d8536b4Sopenharmony_ciOUT_UNLOCK: 3683d8536b4Sopenharmony_ci (VOID)pthread_mutex_unlock(&g_mqueueMutex); 3693d8536b4Sopenharmony_ci return ret; 3703d8536b4Sopenharmony_ci} 3713d8536b4Sopenharmony_ci 3723d8536b4Sopenharmony_ciint OsMqGetAttr(mqd_t personal, struct mq_attr *mqAttr) 3733d8536b4Sopenharmony_ci{ 3743d8536b4Sopenharmony_ci struct mqarray *mqueueCB = NULL; 3753d8536b4Sopenharmony_ci struct mqpersonal *privateMqPersonal = NULL; 3763d8536b4Sopenharmony_ci 3773d8536b4Sopenharmony_ci if (mqAttr == NULL) { 3783d8536b4Sopenharmony_ci errno = EINVAL; 3793d8536b4Sopenharmony_ci return -1; 3803d8536b4Sopenharmony_ci } 3813d8536b4Sopenharmony_ci 3823d8536b4Sopenharmony_ci (VOID)pthread_mutex_lock(&g_mqueueMutex); 3833d8536b4Sopenharmony_ci privateMqPersonal = (struct mqpersonal *)personal; 3843d8536b4Sopenharmony_ci if (privateMqPersonal->mq_status != MQ_USE_MAGIC) { 3853d8536b4Sopenharmony_ci errno = EBADF; 3863d8536b4Sopenharmony_ci (VOID)pthread_mutex_unlock(&g_mqueueMutex); 3873d8536b4Sopenharmony_ci return -1; 3883d8536b4Sopenharmony_ci } 3893d8536b4Sopenharmony_ci 3903d8536b4Sopenharmony_ci mqueueCB = privateMqPersonal->mq_posixdes; 3913d8536b4Sopenharmony_ci mqAttr->mq_maxmsg = mqueueCB->mqcb->queueLen; 3923d8536b4Sopenharmony_ci mqAttr->mq_msgsize = mqueueCB->mqcb->queueSize - sizeof(UINT32); 3933d8536b4Sopenharmony_ci mqAttr->mq_curmsgs = mqueueCB->mqcb->readWriteableCnt[OS_QUEUE_READ]; 3943d8536b4Sopenharmony_ci mqAttr->mq_flags = privateMqPersonal->mq_flags; 3953d8536b4Sopenharmony_ci (VOID)pthread_mutex_unlock(&g_mqueueMutex); 3963d8536b4Sopenharmony_ci return 0; 3973d8536b4Sopenharmony_ci} 3983d8536b4Sopenharmony_ci 3993d8536b4Sopenharmony_ciint OsMqSetAttr(mqd_t personal, const struct mq_attr *mqSetAttr, struct mq_attr *mqOldAttr) 4003d8536b4Sopenharmony_ci{ 4013d8536b4Sopenharmony_ci struct mqpersonal *privateMqPersonal = NULL; 4023d8536b4Sopenharmony_ci 4033d8536b4Sopenharmony_ci if (mqSetAttr == NULL) { 4043d8536b4Sopenharmony_ci errno = EINVAL; 4053d8536b4Sopenharmony_ci return -1; 4063d8536b4Sopenharmony_ci } 4073d8536b4Sopenharmony_ci 4083d8536b4Sopenharmony_ci (VOID)pthread_mutex_lock(&g_mqueueMutex); 4093d8536b4Sopenharmony_ci privateMqPersonal = (struct mqpersonal *)personal; 4103d8536b4Sopenharmony_ci if (privateMqPersonal->mq_status != MQ_USE_MAGIC) { 4113d8536b4Sopenharmony_ci errno = EBADF; 4123d8536b4Sopenharmony_ci (VOID)pthread_mutex_unlock(&g_mqueueMutex); 4133d8536b4Sopenharmony_ci return -1; 4143d8536b4Sopenharmony_ci } 4153d8536b4Sopenharmony_ci 4163d8536b4Sopenharmony_ci if (mqOldAttr != NULL) { 4173d8536b4Sopenharmony_ci (VOID)OsMqGetAttr((mqd_t)privateMqPersonal, mqOldAttr); 4183d8536b4Sopenharmony_ci } 4193d8536b4Sopenharmony_ci 4203d8536b4Sopenharmony_ci privateMqPersonal->mq_flags = (INT32)((UINT32)privateMqPersonal->mq_flags & (UINT32)(~FNONBLOCK)); /* clear */ 4213d8536b4Sopenharmony_ci if (((UINT32)mqSetAttr->mq_flags & (UINT32)FNONBLOCK) == (UINT32)FNONBLOCK) { 4223d8536b4Sopenharmony_ci privateMqPersonal->mq_flags = (INT32)((UINT32)privateMqPersonal->mq_flags | (UINT32)FNONBLOCK); 4233d8536b4Sopenharmony_ci } 4243d8536b4Sopenharmony_ci (VOID)pthread_mutex_unlock(&g_mqueueMutex); 4253d8536b4Sopenharmony_ci return 0; 4263d8536b4Sopenharmony_ci} 4273d8536b4Sopenharmony_ci 4283d8536b4Sopenharmony_cistatic int MqGetSetAttr(mqd_t mqd, const struct mq_attr *new, struct mq_attr *old) 4293d8536b4Sopenharmony_ci{ 4303d8536b4Sopenharmony_ci if (new == NULL) { 4313d8536b4Sopenharmony_ci return OsMqGetAttr(mqd, old); 4323d8536b4Sopenharmony_ci } 4333d8536b4Sopenharmony_ci return OsMqSetAttr(mqd, new, old); 4343d8536b4Sopenharmony_ci} 4353d8536b4Sopenharmony_ci 4363d8536b4Sopenharmony_ciint mq_getattr(mqd_t mqd, struct mq_attr *attr) 4373d8536b4Sopenharmony_ci{ 4383d8536b4Sopenharmony_ci if ((mqd == (mqd_t)NULL) || (mqd == (mqd_t)-1)) { 4393d8536b4Sopenharmony_ci errno = EBADF; 4403d8536b4Sopenharmony_ci return -1; 4413d8536b4Sopenharmony_ci } 4423d8536b4Sopenharmony_ci return MqGetSetAttr(mqd, NULL, attr); 4433d8536b4Sopenharmony_ci} 4443d8536b4Sopenharmony_ci 4453d8536b4Sopenharmony_ciint mq_setattr(mqd_t mqd, const struct mq_attr *new, struct mq_attr *old) 4463d8536b4Sopenharmony_ci{ 4473d8536b4Sopenharmony_ci if ((mqd == (mqd_t)NULL) || (mqd == (mqd_t)-1)) { 4483d8536b4Sopenharmony_ci errno = EBADF; 4493d8536b4Sopenharmony_ci return -1; 4503d8536b4Sopenharmony_ci } 4513d8536b4Sopenharmony_ci if (new == NULL) { 4523d8536b4Sopenharmony_ci errno = EINVAL; 4533d8536b4Sopenharmony_ci return -1; 4543d8536b4Sopenharmony_ci } 4553d8536b4Sopenharmony_ci return MqGetSetAttr(mqd, new, old); 4563d8536b4Sopenharmony_ci} 4573d8536b4Sopenharmony_ci 4583d8536b4Sopenharmony_ciint mq_unlink(const char *mqName) 4593d8536b4Sopenharmony_ci{ 4603d8536b4Sopenharmony_ci INT32 ret = 0; 4613d8536b4Sopenharmony_ci struct mqarray *mqueueCB = NULL; 4623d8536b4Sopenharmony_ci 4633d8536b4Sopenharmony_ci if (MqNameCheck(mqName) == -1) { 4643d8536b4Sopenharmony_ci return -1; 4653d8536b4Sopenharmony_ci } 4663d8536b4Sopenharmony_ci 4673d8536b4Sopenharmony_ci (VOID)pthread_mutex_lock(&g_mqueueMutex); 4683d8536b4Sopenharmony_ci mqueueCB = GetMqueueCBByName(mqName); 4693d8536b4Sopenharmony_ci if (mqueueCB == NULL) { 4703d8536b4Sopenharmony_ci errno = ENOENT; 4713d8536b4Sopenharmony_ci goto ERROUT_UNLOCK; 4723d8536b4Sopenharmony_ci } 4733d8536b4Sopenharmony_ci 4743d8536b4Sopenharmony_ci if (mqueueCB->mq_personal != NULL) { 4753d8536b4Sopenharmony_ci errno = EINTR; 4763d8536b4Sopenharmony_ci mqueueCB->unlinkflag = TRUE; 4773d8536b4Sopenharmony_ci goto ERROUT_UNLOCK; 4783d8536b4Sopenharmony_ci } else { 4793d8536b4Sopenharmony_ci ret = DoMqueueDelete(mqueueCB); 4803d8536b4Sopenharmony_ci } 4813d8536b4Sopenharmony_ci 4823d8536b4Sopenharmony_ci (VOID)pthread_mutex_unlock(&g_mqueueMutex); 4833d8536b4Sopenharmony_ci return ret; 4843d8536b4Sopenharmony_ci 4853d8536b4Sopenharmony_ciERROUT_UNLOCK: 4863d8536b4Sopenharmony_ci (VOID)pthread_mutex_unlock(&g_mqueueMutex); 4873d8536b4Sopenharmony_ci return -1; 4883d8536b4Sopenharmony_ci} 4893d8536b4Sopenharmony_ci 4903d8536b4Sopenharmony_ciSTATIC INT32 ConvertTimeout(long flags, const struct timespec *absTimeout, UINT64 *ticks) 4913d8536b4Sopenharmony_ci{ 4923d8536b4Sopenharmony_ci if ((UINT32)flags & (UINT32)FNONBLOCK) { 4933d8536b4Sopenharmony_ci *ticks = LOS_NO_WAIT; 4943d8536b4Sopenharmony_ci return 0; 4953d8536b4Sopenharmony_ci } 4963d8536b4Sopenharmony_ci 4973d8536b4Sopenharmony_ci if (absTimeout == NULL) { 4983d8536b4Sopenharmony_ci *ticks = LOS_WAIT_FOREVER; 4993d8536b4Sopenharmony_ci return 0; 5003d8536b4Sopenharmony_ci } 5013d8536b4Sopenharmony_ci 5023d8536b4Sopenharmony_ci if (!ValidTimeSpec(absTimeout)) { 5033d8536b4Sopenharmony_ci errno = EINVAL; 5043d8536b4Sopenharmony_ci return -1; 5053d8536b4Sopenharmony_ci } 5063d8536b4Sopenharmony_ci 5073d8536b4Sopenharmony_ci *ticks = OsTimeSpec2Tick(absTimeout); 5083d8536b4Sopenharmony_ci return 0; 5093d8536b4Sopenharmony_ci} 5103d8536b4Sopenharmony_ci 5113d8536b4Sopenharmony_ciSTATIC INLINE BOOL MqParamCheck(mqd_t personal, const char *msg, size_t msgLen) 5123d8536b4Sopenharmony_ci{ 5133d8536b4Sopenharmony_ci if ((personal == (mqd_t)NULL) || (personal == (mqd_t)-1)) { 5143d8536b4Sopenharmony_ci errno = EBADF; 5153d8536b4Sopenharmony_ci return FALSE; 5163d8536b4Sopenharmony_ci } 5173d8536b4Sopenharmony_ci if ((msg == NULL) || (msgLen == 0)) { 5183d8536b4Sopenharmony_ci errno = EINVAL; 5193d8536b4Sopenharmony_ci return FALSE; 5203d8536b4Sopenharmony_ci } 5213d8536b4Sopenharmony_ci return TRUE; 5223d8536b4Sopenharmony_ci} 5233d8536b4Sopenharmony_ci 5243d8536b4Sopenharmony_ci#define OS_MQ_GOTO_ERROUT_UNLOCK_IF(expr, errcode) \ 5253d8536b4Sopenharmony_ci if (expr) { \ 5263d8536b4Sopenharmony_ci errno = errcode; \ 5273d8536b4Sopenharmony_ci goto ERROUT_UNLOCK; \ 5283d8536b4Sopenharmony_ci } 5293d8536b4Sopenharmony_ci#define OS_MQ_GOTO_ERROUT_IF(expr, errcode) \ 5303d8536b4Sopenharmony_ci if (expr) { \ 5313d8536b4Sopenharmony_ci errno = errcode; \ 5323d8536b4Sopenharmony_ci goto ERROUT; \ 5333d8536b4Sopenharmony_ci } 5343d8536b4Sopenharmony_ciint mq_timedsend(mqd_t personal, const char *msg, size_t msgLen, unsigned int msgPrio, 5353d8536b4Sopenharmony_ci const struct timespec *absTimeout) 5363d8536b4Sopenharmony_ci{ 5373d8536b4Sopenharmony_ci UINT32 mqueueID, err; 5383d8536b4Sopenharmony_ci UINT64 absTicks; 5393d8536b4Sopenharmony_ci struct mqarray *mqueueCB = NULL; 5403d8536b4Sopenharmony_ci struct mqpersonal *privateMqPersonal = NULL; 5413d8536b4Sopenharmony_ci 5423d8536b4Sopenharmony_ci OS_MQ_GOTO_ERROUT_IF(!MqParamCheck(personal, msg, msgLen), errno); 5433d8536b4Sopenharmony_ci 5443d8536b4Sopenharmony_ci OS_MQ_GOTO_ERROUT_IF(msgPrio > (MQ_PRIO_MAX - 1), EINVAL); 5453d8536b4Sopenharmony_ci 5463d8536b4Sopenharmony_ci (VOID)pthread_mutex_lock(&g_mqueueMutex); 5473d8536b4Sopenharmony_ci privateMqPersonal = (struct mqpersonal *)personal; 5483d8536b4Sopenharmony_ci OS_MQ_GOTO_ERROUT_UNLOCK_IF(privateMqPersonal->mq_status != MQ_USE_MAGIC, EBADF); 5493d8536b4Sopenharmony_ci 5503d8536b4Sopenharmony_ci mqueueCB = privateMqPersonal->mq_posixdes; 5513d8536b4Sopenharmony_ci OS_MQ_GOTO_ERROUT_UNLOCK_IF(msgLen > (size_t)(mqueueCB->mqcb->queueSize - sizeof(UINT32)), EMSGSIZE); 5523d8536b4Sopenharmony_ci 5533d8536b4Sopenharmony_ci OS_MQ_GOTO_ERROUT_UNLOCK_IF((((UINT32)privateMqPersonal->mq_flags & (UINT32)O_WRONLY) != (UINT32)O_WRONLY) && 5543d8536b4Sopenharmony_ci (((UINT32)privateMqPersonal->mq_flags & (UINT32)O_RDWR) != (UINT32)O_RDWR), 5553d8536b4Sopenharmony_ci EBADF); 5563d8536b4Sopenharmony_ci 5573d8536b4Sopenharmony_ci OS_MQ_GOTO_ERROUT_UNLOCK_IF(ConvertTimeout(privateMqPersonal->mq_flags, absTimeout, &absTicks) == -1, errno); 5583d8536b4Sopenharmony_ci mqueueID = mqueueCB->mq_id; 5593d8536b4Sopenharmony_ci (VOID)pthread_mutex_unlock(&g_mqueueMutex); 5603d8536b4Sopenharmony_ci 5613d8536b4Sopenharmony_ci err = LOS_QueueWriteCopy(mqueueID, (VOID *)msg, (UINT32)msgLen, (UINT32)absTicks); 5623d8536b4Sopenharmony_ci if (MapMqErrno(err) != ENOERR) { 5633d8536b4Sopenharmony_ci goto ERROUT; 5643d8536b4Sopenharmony_ci } 5653d8536b4Sopenharmony_ci return 0; 5663d8536b4Sopenharmony_ciERROUT_UNLOCK: 5673d8536b4Sopenharmony_ci (VOID)pthread_mutex_unlock(&g_mqueueMutex); 5683d8536b4Sopenharmony_ciERROUT: 5693d8536b4Sopenharmony_ci return -1; 5703d8536b4Sopenharmony_ci} 5713d8536b4Sopenharmony_ci 5723d8536b4Sopenharmony_cissize_t mq_timedreceive(mqd_t personal, char *msg, size_t msgLen, unsigned int *msgPrio, 5733d8536b4Sopenharmony_ci const struct timespec *absTimeout) 5743d8536b4Sopenharmony_ci{ 5753d8536b4Sopenharmony_ci UINT32 mqueueID, err; 5763d8536b4Sopenharmony_ci UINT32 receiveLen; 5773d8536b4Sopenharmony_ci UINT64 absTicks; 5783d8536b4Sopenharmony_ci struct mqarray *mqueueCB = NULL; 5793d8536b4Sopenharmony_ci struct mqpersonal *privateMqPersonal = NULL; 5803d8536b4Sopenharmony_ci 5813d8536b4Sopenharmony_ci if (!MqParamCheck(personal, msg, msgLen)) { 5823d8536b4Sopenharmony_ci goto ERROUT; 5833d8536b4Sopenharmony_ci } 5843d8536b4Sopenharmony_ci 5853d8536b4Sopenharmony_ci if (msgPrio != NULL) { 5863d8536b4Sopenharmony_ci *msgPrio = 0; 5873d8536b4Sopenharmony_ci } 5883d8536b4Sopenharmony_ci 5893d8536b4Sopenharmony_ci (VOID)pthread_mutex_lock(&g_mqueueMutex); 5903d8536b4Sopenharmony_ci privateMqPersonal = (struct mqpersonal *)personal; 5913d8536b4Sopenharmony_ci if (privateMqPersonal->mq_status != MQ_USE_MAGIC) { 5923d8536b4Sopenharmony_ci errno = EBADF; 5933d8536b4Sopenharmony_ci goto ERROUT_UNLOCK; 5943d8536b4Sopenharmony_ci } 5953d8536b4Sopenharmony_ci 5963d8536b4Sopenharmony_ci mqueueCB = privateMqPersonal->mq_posixdes; 5973d8536b4Sopenharmony_ci if (msgLen < (size_t)(mqueueCB->mqcb->queueSize - sizeof(UINT32))) { 5983d8536b4Sopenharmony_ci errno = EMSGSIZE; 5993d8536b4Sopenharmony_ci goto ERROUT_UNLOCK; 6003d8536b4Sopenharmony_ci } 6013d8536b4Sopenharmony_ci 6023d8536b4Sopenharmony_ci if (((UINT32)privateMqPersonal->mq_flags & (UINT32)O_WRONLY) == (UINT32)O_WRONLY) { 6033d8536b4Sopenharmony_ci errno = EBADF; 6043d8536b4Sopenharmony_ci goto ERROUT_UNLOCK; 6053d8536b4Sopenharmony_ci } 6063d8536b4Sopenharmony_ci 6073d8536b4Sopenharmony_ci if (ConvertTimeout(privateMqPersonal->mq_flags, absTimeout, &absTicks) == -1) { 6083d8536b4Sopenharmony_ci goto ERROUT_UNLOCK; 6093d8536b4Sopenharmony_ci } 6103d8536b4Sopenharmony_ci 6113d8536b4Sopenharmony_ci receiveLen = msgLen; 6123d8536b4Sopenharmony_ci mqueueID = mqueueCB->mq_id; 6133d8536b4Sopenharmony_ci (VOID)pthread_mutex_unlock(&g_mqueueMutex); 6143d8536b4Sopenharmony_ci 6153d8536b4Sopenharmony_ci err = LOS_QueueReadCopy(mqueueID, (VOID *)msg, &receiveLen, (UINT32)absTicks); 6163d8536b4Sopenharmony_ci if (MapMqErrno(err) == ENOERR) { 6173d8536b4Sopenharmony_ci return (ssize_t)receiveLen; 6183d8536b4Sopenharmony_ci } else { 6193d8536b4Sopenharmony_ci goto ERROUT; 6203d8536b4Sopenharmony_ci } 6213d8536b4Sopenharmony_ci 6223d8536b4Sopenharmony_ciERROUT_UNLOCK: 6233d8536b4Sopenharmony_ci (VOID)pthread_mutex_unlock(&g_mqueueMutex); 6243d8536b4Sopenharmony_ciERROUT: 6253d8536b4Sopenharmony_ci return -1; 6263d8536b4Sopenharmony_ci} 6273d8536b4Sopenharmony_ci 6283d8536b4Sopenharmony_ci/* not support the prio */ 6293d8536b4Sopenharmony_ciint mq_send(mqd_t personal, const char *msg_ptr, size_t msg_len, unsigned int msg_prio) 6303d8536b4Sopenharmony_ci{ 6313d8536b4Sopenharmony_ci return mq_timedsend(personal, msg_ptr, msg_len, msg_prio, NULL); 6323d8536b4Sopenharmony_ci} 6333d8536b4Sopenharmony_ci 6343d8536b4Sopenharmony_cissize_t mq_receive(mqd_t personal, char *msg_ptr, size_t msg_len, unsigned int *msg_prio) 6353d8536b4Sopenharmony_ci{ 6363d8536b4Sopenharmony_ci return mq_timedreceive(personal, msg_ptr, msg_len, msg_prio, NULL); 6373d8536b4Sopenharmony_ci} 6383d8536b4Sopenharmony_ci 639