xref: /kernel/liteos_m/kal/posix/src/mqueue.c (revision 3d8536b4)
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