13d8536b4Sopenharmony_ci/*
23d8536b4Sopenharmony_ci * Copyright (c) 2022-2022 Huawei Device Co., Ltd. All rights reserved.
33d8536b4Sopenharmony_ci *
43d8536b4Sopenharmony_ci * Redistribution and use in source and binary forms, with or without modification,
53d8536b4Sopenharmony_ci * are permitted provided that the following conditions are met:
63d8536b4Sopenharmony_ci *
73d8536b4Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright notice, this list of
83d8536b4Sopenharmony_ci *    conditions and the following disclaimer.
93d8536b4Sopenharmony_ci *
103d8536b4Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright notice, this list
113d8536b4Sopenharmony_ci *    of conditions and the following disclaimer in the documentation and/or other materials
123d8536b4Sopenharmony_ci *    provided with the distribution.
133d8536b4Sopenharmony_ci *
143d8536b4Sopenharmony_ci * 3. Neither the name of the copyright holder nor the names of its contributors may be used
153d8536b4Sopenharmony_ci *    to endorse or promote products derived from this software without specific prior written
163d8536b4Sopenharmony_ci *    permission.
173d8536b4Sopenharmony_ci *
183d8536b4Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
193d8536b4Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
203d8536b4Sopenharmony_ci * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
213d8536b4Sopenharmony_ci * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
223d8536b4Sopenharmony_ci * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
233d8536b4Sopenharmony_ci * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
243d8536b4Sopenharmony_ci * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
253d8536b4Sopenharmony_ci * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
263d8536b4Sopenharmony_ci * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
273d8536b4Sopenharmony_ci * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
283d8536b4Sopenharmony_ci * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
293d8536b4Sopenharmony_ci */
303d8536b4Sopenharmony_ci
313d8536b4Sopenharmony_ci#include <fcntl.h>
323d8536b4Sopenharmony_ci#include <poll.h>
333d8536b4Sopenharmony_ci#include "securec.h"
343d8536b4Sopenharmony_ci#include "los_list.h"
353d8536b4Sopenharmony_ci#include "los_mux.h"
363d8536b4Sopenharmony_ci#include "los_sem.h"
373d8536b4Sopenharmony_ci#include "los_debug.h"
383d8536b4Sopenharmony_ci#include "los_memory.h"
393d8536b4Sopenharmony_ci#include "pipe_impl.h"
403d8536b4Sopenharmony_ci
413d8536b4Sopenharmony_ci#if (LOSCFG_POSIX_PIPE_API == 1)
423d8536b4Sopenharmony_ci
433d8536b4Sopenharmony_ci#define PIPE_DEV_NUM            32
443d8536b4Sopenharmony_ci#define PIPE_FD_NUM             (PIPE_DEV_NUM << 1)
453d8536b4Sopenharmony_ci#define PIPE_DEV_NAME_MAX       32
463d8536b4Sopenharmony_ci#define PIPE_DEV_FD_BITMAP_LEN  ((PIPE_FD_NUM >> 5) + 1)
473d8536b4Sopenharmony_ci#define PIPE_DEV_BUF_SIZE       1024
483d8536b4Sopenharmony_ci#define PIPE_READ               1
493d8536b4Sopenharmony_ci#define PIPE_WRITE              2
503d8536b4Sopenharmony_ci
513d8536b4Sopenharmony_ci#define PIPE_DEV_LOCK(mutex)    do {                            \
523d8536b4Sopenharmony_ci    UINT32 __ret = LOS_MuxPend(mutex, LOS_WAIT_FOREVER);        \
533d8536b4Sopenharmony_ci    if (__ret != LOS_OK) {                                      \
543d8536b4Sopenharmony_ci        PRINT_ERR("pipe device lock error, ret = %x\n", __ret); \
553d8536b4Sopenharmony_ci    }                                                           \
563d8536b4Sopenharmony_ci} while (0)
573d8536b4Sopenharmony_ci
583d8536b4Sopenharmony_ci#define PIPE_DEV_UNLOCK(mutex)    do {                            \
593d8536b4Sopenharmony_ci    UINT32 __ret = LOS_MuxPost(mutex);                            \
603d8536b4Sopenharmony_ci    if (__ret != LOS_OK) {                                        \
613d8536b4Sopenharmony_ci        PRINT_ERR("pipe device unlock error, ret = %x\n", __ret); \
623d8536b4Sopenharmony_ci    }                                                             \
633d8536b4Sopenharmony_ci} while (0)
643d8536b4Sopenharmony_ci
653d8536b4Sopenharmony_ci#define PIPE_RW_WAIT(sem)    do {                                           \
663d8536b4Sopenharmony_ci    LosSemCB *__sem = GET_SEM(sem);                                         \
673d8536b4Sopenharmony_ci    while (__sem->semCount != 0) {                                          \
683d8536b4Sopenharmony_ci        UINT32 __ret = LOS_SemPend(__sem->semID, LOS_WAIT_FOREVER);         \
693d8536b4Sopenharmony_ci        if (__ret != LOS_OK) {                                              \
703d8536b4Sopenharmony_ci            PRINT_ERR("pipe device R/W sem wait error, ret = %x\n", __ret); \
713d8536b4Sopenharmony_ci        }                                                                   \
723d8536b4Sopenharmony_ci    }                                                                       \
733d8536b4Sopenharmony_ci} while (0)
743d8536b4Sopenharmony_ci
753d8536b4Sopenharmony_ci#define PIPE_RW_POST(sem)    do {                                           \
763d8536b4Sopenharmony_ci    LosSemCB *__sem = GET_SEM(sem);                                         \
773d8536b4Sopenharmony_ci    while (__sem->semCount == 0) {                                          \
783d8536b4Sopenharmony_ci        UINT32 __ret = LOS_SemPost(__sem->semID);                           \
793d8536b4Sopenharmony_ci        if (__ret != LOS_OK) {                                              \
803d8536b4Sopenharmony_ci            PRINT_ERR("pipe device R/W sem post error, ret = %x\n", __ret); \
813d8536b4Sopenharmony_ci        }                                                                   \
823d8536b4Sopenharmony_ci    }                                                                       \
833d8536b4Sopenharmony_ci} while (0)
843d8536b4Sopenharmony_ci
853d8536b4Sopenharmony_cistruct PipeDev {
863d8536b4Sopenharmony_ci    CHAR devName[PIPE_DEV_NAME_MAX];
873d8536b4Sopenharmony_ci    UINT32 num;
883d8536b4Sopenharmony_ci    UINT32 mutex;
893d8536b4Sopenharmony_ci    LOS_DL_LIST list;
903d8536b4Sopenharmony_ci    UINT32 readSem;
913d8536b4Sopenharmony_ci    UINT32 writeSem;
923d8536b4Sopenharmony_ci    UINT8 *ringBuffer;
933d8536b4Sopenharmony_ci    size_t bufferSize;
943d8536b4Sopenharmony_ci    size_t readIndex;
953d8536b4Sopenharmony_ci    size_t writeIndex;
963d8536b4Sopenharmony_ci    BOOL roll;
973d8536b4Sopenharmony_ci    UINT32 readerCnt;
983d8536b4Sopenharmony_ci    UINT32 writerCnt;
993d8536b4Sopenharmony_ci    UINT32 ref;
1003d8536b4Sopenharmony_ci    struct PollWaitQueue wq;
1013d8536b4Sopenharmony_ci};
1023d8536b4Sopenharmony_ci
1033d8536b4Sopenharmony_cistruct PipeFdDev {
1043d8536b4Sopenharmony_ci    struct PipeDev *dev;
1053d8536b4Sopenharmony_ci    BOOL openFlag;
1063d8536b4Sopenharmony_ci};
1073d8536b4Sopenharmony_ci
1083d8536b4Sopenharmony_ciSTATIC LOS_DL_LIST g_devList = {&g_devList, &g_devList};
1093d8536b4Sopenharmony_ciSTATIC UINT32 g_devListMutex = LOSCFG_BASE_IPC_MUX_LIMIT;
1103d8536b4Sopenharmony_ci
1113d8536b4Sopenharmony_ciSTATIC UINT32 g_devNumBitmap = 0;
1123d8536b4Sopenharmony_ciSTATIC UINT32 g_devFdBitmap[PIPE_DEV_FD_BITMAP_LEN] = {0};
1133d8536b4Sopenharmony_ciSTATIC struct PipeFdDev g_devFd[PIPE_FD_NUM] = {0};
1143d8536b4Sopenharmony_ciSTATIC UINT32 g_devFdMutex = LOSCFG_BASE_IPC_MUX_LIMIT;
1153d8536b4Sopenharmony_ciSTATIC INT32 g_devStartFd = 0;
1163d8536b4Sopenharmony_ci
1173d8536b4Sopenharmony_ciSTATIC INT32 PipeDevNumAlloc(VOID)
1183d8536b4Sopenharmony_ci{
1193d8536b4Sopenharmony_ci    UINT32 temp = g_devNumBitmap;
1203d8536b4Sopenharmony_ci    INT32 devNum = 0;
1213d8536b4Sopenharmony_ci
1223d8536b4Sopenharmony_ci    while (temp & 0x1) {
1233d8536b4Sopenharmony_ci        devNum++;
1243d8536b4Sopenharmony_ci        temp = temp >> 1;
1253d8536b4Sopenharmony_ci    }
1263d8536b4Sopenharmony_ci
1273d8536b4Sopenharmony_ci    if (devNum >= PIPE_DEV_NUM) {
1283d8536b4Sopenharmony_ci        return -1;
1293d8536b4Sopenharmony_ci    }
1303d8536b4Sopenharmony_ci    g_devNumBitmap |= 1U << devNum;
1313d8536b4Sopenharmony_ci
1323d8536b4Sopenharmony_ci    return devNum;
1333d8536b4Sopenharmony_ci}
1343d8536b4Sopenharmony_ci
1353d8536b4Sopenharmony_ciSTATIC VOID PipeDevNumFree(INT32 devNum)
1363d8536b4Sopenharmony_ci{
1373d8536b4Sopenharmony_ci    if ((devNum < 0) || (devNum >= PIPE_DEV_NUM)) {
1383d8536b4Sopenharmony_ci        return;
1393d8536b4Sopenharmony_ci    }
1403d8536b4Sopenharmony_ci    g_devNumBitmap &= ~(1U << devNum);
1413d8536b4Sopenharmony_ci}
1423d8536b4Sopenharmony_ci
1433d8536b4Sopenharmony_ciSTATIC struct PipeDev *PipeDevFind(const CHAR *path)
1443d8536b4Sopenharmony_ci{
1453d8536b4Sopenharmony_ci    struct PipeDev *dev = NULL;
1463d8536b4Sopenharmony_ci
1473d8536b4Sopenharmony_ci    (VOID)LOS_MuxPend(g_devListMutex, LOS_WAIT_FOREVER);
1483d8536b4Sopenharmony_ci    if (!LOS_ListEmpty(&g_devList)) {
1493d8536b4Sopenharmony_ci        LOS_DL_LIST_FOR_EACH_ENTRY(dev, &g_devList, struct PipeDev, list) {
1503d8536b4Sopenharmony_ci            if (!strncmp(dev->devName, path, PIPE_DEV_NAME_MAX)) {
1513d8536b4Sopenharmony_ci                (VOID)LOS_MuxPost(g_devListMutex);
1523d8536b4Sopenharmony_ci                return dev;
1533d8536b4Sopenharmony_ci            }
1543d8536b4Sopenharmony_ci        }
1553d8536b4Sopenharmony_ci    }
1563d8536b4Sopenharmony_ci    (VOID)LOS_MuxPost(g_devListMutex);
1573d8536b4Sopenharmony_ci    return NULL;
1583d8536b4Sopenharmony_ci}
1593d8536b4Sopenharmony_ci
1603d8536b4Sopenharmony_ciSTATIC size_t PipeRingbufferRead(struct PipeDev *dev, VOID *buf, size_t len)
1613d8536b4Sopenharmony_ci{
1623d8536b4Sopenharmony_ci    size_t nbytes;
1633d8536b4Sopenharmony_ci
1643d8536b4Sopenharmony_ci    if (dev->readIndex < dev->writeIndex) {
1653d8536b4Sopenharmony_ci        nbytes = dev->writeIndex - dev->readIndex;
1663d8536b4Sopenharmony_ci    } else if (dev->readIndex > dev->writeIndex) {
1673d8536b4Sopenharmony_ci        nbytes = dev->bufferSize - dev->readIndex;
1683d8536b4Sopenharmony_ci    } else {
1693d8536b4Sopenharmony_ci        if (dev->roll == FALSE) {
1703d8536b4Sopenharmony_ci            return 0;
1713d8536b4Sopenharmony_ci        } else {
1723d8536b4Sopenharmony_ci            nbytes = dev->bufferSize - dev->readIndex;
1733d8536b4Sopenharmony_ci        }
1743d8536b4Sopenharmony_ci    }
1753d8536b4Sopenharmony_ci    nbytes = (nbytes > len) ? len : nbytes;
1763d8536b4Sopenharmony_ci    (VOID)memcpy_s(buf, len, dev->ringBuffer + dev->readIndex, nbytes);
1773d8536b4Sopenharmony_ci    dev->readIndex += nbytes;
1783d8536b4Sopenharmony_ci    if (dev->readIndex >= dev->bufferSize) {
1793d8536b4Sopenharmony_ci        dev->readIndex = 0;
1803d8536b4Sopenharmony_ci        dev->roll = FALSE;
1813d8536b4Sopenharmony_ci    }
1823d8536b4Sopenharmony_ci
1833d8536b4Sopenharmony_ci    return nbytes;
1843d8536b4Sopenharmony_ci}
1853d8536b4Sopenharmony_ci
1863d8536b4Sopenharmony_ciSTATIC size_t PipeRingbufferWrite(struct PipeDev *dev, const VOID *buf, size_t len)
1873d8536b4Sopenharmony_ci{
1883d8536b4Sopenharmony_ci    size_t nbytes;
1893d8536b4Sopenharmony_ci
1903d8536b4Sopenharmony_ci    if (dev->readIndex < dev->writeIndex) {
1913d8536b4Sopenharmony_ci        nbytes = dev->bufferSize - dev->writeIndex;
1923d8536b4Sopenharmony_ci    } else if (dev->readIndex > dev->writeIndex) {
1933d8536b4Sopenharmony_ci        nbytes = dev->readIndex - dev->writeIndex;
1943d8536b4Sopenharmony_ci    } else {
1953d8536b4Sopenharmony_ci        if (dev->roll == TRUE) {
1963d8536b4Sopenharmony_ci            return 0;
1973d8536b4Sopenharmony_ci        } else {
1983d8536b4Sopenharmony_ci            nbytes = dev->bufferSize - dev->writeIndex;
1993d8536b4Sopenharmony_ci        }
2003d8536b4Sopenharmony_ci    }
2013d8536b4Sopenharmony_ci
2023d8536b4Sopenharmony_ci    nbytes = (nbytes > len) ? len : nbytes;
2033d8536b4Sopenharmony_ci    (VOID)memcpy_s(dev->ringBuffer + dev->writeIndex, dev->bufferSize
2043d8536b4Sopenharmony_ci                   - dev->writeIndex, buf, nbytes);
2053d8536b4Sopenharmony_ci    dev->writeIndex += nbytes;
2063d8536b4Sopenharmony_ci    if (dev->writeIndex >= dev->bufferSize) {
2073d8536b4Sopenharmony_ci        dev->roll = TRUE;
2083d8536b4Sopenharmony_ci        dev->writeIndex = 0;
2093d8536b4Sopenharmony_ci    }
2103d8536b4Sopenharmony_ci
2113d8536b4Sopenharmony_ci    return nbytes;
2123d8536b4Sopenharmony_ci}
2133d8536b4Sopenharmony_ci
2143d8536b4Sopenharmony_ciSTATIC INT32 PipeDevRegister(CHAR *devName, UINT32 len)
2153d8536b4Sopenharmony_ci{
2163d8536b4Sopenharmony_ci    INT32 ret;
2173d8536b4Sopenharmony_ci    INT32 num = PipeDevNumAlloc();
2183d8536b4Sopenharmony_ci    struct PipeDev *devTemp = NULL;
2193d8536b4Sopenharmony_ci    if (num < 0) {
2203d8536b4Sopenharmony_ci        return -ENODEV;
2213d8536b4Sopenharmony_ci    }
2223d8536b4Sopenharmony_ci
2233d8536b4Sopenharmony_ci    struct PipeDev *dev = LOS_MemAlloc(OS_SYS_MEM_ADDR, sizeof(struct PipeDev));
2243d8536b4Sopenharmony_ci    if (dev == NULL) {
2253d8536b4Sopenharmony_ci        ret = -ENOMEM;
2263d8536b4Sopenharmony_ci        goto ERROR;
2273d8536b4Sopenharmony_ci    }
2283d8536b4Sopenharmony_ci    (VOID)memset_s(dev, sizeof(struct PipeDev), 0, sizeof(struct PipeDev));
2293d8536b4Sopenharmony_ci    (VOID)snprintf_s(dev->devName, PIPE_DEV_NAME_MAX, PIPE_DEV_NAME_MAX - 1, "%s%d", PIPE_DEV_PATH, num);
2303d8536b4Sopenharmony_ci    (VOID)memcpy_s(devName, len, dev->devName, strlen(dev->devName));
2313d8536b4Sopenharmony_ci
2323d8536b4Sopenharmony_ci    devTemp = PipeDevFind(dev->devName);
2333d8536b4Sopenharmony_ci    if (devTemp != NULL) {
2343d8536b4Sopenharmony_ci        ret = -EEXIST;
2353d8536b4Sopenharmony_ci        goto ERROR;
2363d8536b4Sopenharmony_ci    }
2373d8536b4Sopenharmony_ci
2383d8536b4Sopenharmony_ci    ret = LOS_MuxCreate(&dev->mutex);
2393d8536b4Sopenharmony_ci    if (ret != LOS_OK) {
2403d8536b4Sopenharmony_ci        ret = -ENOSPC;
2413d8536b4Sopenharmony_ci        goto ERROR;
2423d8536b4Sopenharmony_ci    }
2433d8536b4Sopenharmony_ci
2443d8536b4Sopenharmony_ci    ret = LOS_SemCreate(0, &dev->readSem);
2453d8536b4Sopenharmony_ci    if (ret != LOS_OK) {
2463d8536b4Sopenharmony_ci        (VOID)LOS_MuxDelete(dev->mutex);
2473d8536b4Sopenharmony_ci        ret = -ENOSPC;
2483d8536b4Sopenharmony_ci        goto ERROR;
2493d8536b4Sopenharmony_ci    }
2503d8536b4Sopenharmony_ci
2513d8536b4Sopenharmony_ci    ret = LOS_SemCreate(0, &dev->writeSem);
2523d8536b4Sopenharmony_ci    if (ret != LOS_OK) {
2533d8536b4Sopenharmony_ci        (VOID)LOS_MuxDelete(dev->mutex);
2543d8536b4Sopenharmony_ci        (VOID)LOS_SemDelete(dev->readSem);
2553d8536b4Sopenharmony_ci        ret = -ENOSPC;
2563d8536b4Sopenharmony_ci        goto ERROR;
2573d8536b4Sopenharmony_ci    }
2583d8536b4Sopenharmony_ci
2593d8536b4Sopenharmony_ci    dev->num = num;
2603d8536b4Sopenharmony_ci    PollWaitQueueInit(&dev->wq);
2613d8536b4Sopenharmony_ci
2623d8536b4Sopenharmony_ci    (VOID)LOS_MuxPend(g_devListMutex, LOS_WAIT_FOREVER);
2633d8536b4Sopenharmony_ci    LOS_ListAdd(&g_devList, &dev->list);
2643d8536b4Sopenharmony_ci    (VOID)LOS_MuxPost(g_devListMutex);
2653d8536b4Sopenharmony_ci
2663d8536b4Sopenharmony_ci    return 0;
2673d8536b4Sopenharmony_ciERROR:
2683d8536b4Sopenharmony_ci    if (dev != NULL) {
2693d8536b4Sopenharmony_ci        (VOID)LOS_MemFree(OS_SYS_MEM_ADDR, dev);
2703d8536b4Sopenharmony_ci    }
2713d8536b4Sopenharmony_ci    PipeDevNumFree(num);
2723d8536b4Sopenharmony_ci    return ret;
2733d8536b4Sopenharmony_ci}
2743d8536b4Sopenharmony_ci
2753d8536b4Sopenharmony_ciSTATIC INT32 PipeDevUnregister(struct PipeDev *dev)
2763d8536b4Sopenharmony_ci{
2773d8536b4Sopenharmony_ci    BOOL findFlag = FALSE;
2783d8536b4Sopenharmony_ci
2793d8536b4Sopenharmony_ci    (VOID)LOS_MuxPend(g_devListMutex, LOS_WAIT_FOREVER);
2803d8536b4Sopenharmony_ci    if (LOS_ListEmpty(&g_devList)) {
2813d8536b4Sopenharmony_ci        (VOID)LOS_MuxPost(g_devListMutex);
2823d8536b4Sopenharmony_ci        return -ENODEV;
2833d8536b4Sopenharmony_ci    }
2843d8536b4Sopenharmony_ci
2853d8536b4Sopenharmony_ci    struct PipeDev *tmpDev = NULL;
2863d8536b4Sopenharmony_ci    LOS_DL_LIST_FOR_EACH_ENTRY(tmpDev, &g_devList, struct PipeDev, list) {
2873d8536b4Sopenharmony_ci        if (tmpDev == dev) {
2883d8536b4Sopenharmony_ci            LOS_ListDelete(&dev->list);
2893d8536b4Sopenharmony_ci            findFlag = TRUE;
2903d8536b4Sopenharmony_ci            break;
2913d8536b4Sopenharmony_ci        }
2923d8536b4Sopenharmony_ci    }
2933d8536b4Sopenharmony_ci    (VOID)LOS_MuxPost(g_devListMutex);
2943d8536b4Sopenharmony_ci
2953d8536b4Sopenharmony_ci    if (findFlag != TRUE) {
2963d8536b4Sopenharmony_ci        return -ENODEV;
2973d8536b4Sopenharmony_ci    }
2983d8536b4Sopenharmony_ci
2993d8536b4Sopenharmony_ci    PipeDevNumFree(dev->num);
3003d8536b4Sopenharmony_ci    (VOID)LOS_MuxDelete(dev->mutex);
3013d8536b4Sopenharmony_ci    (VOID)LOS_SemDelete(dev->readSem);
3023d8536b4Sopenharmony_ci    (VOID)LOS_SemDelete(dev->writeSem);
3033d8536b4Sopenharmony_ci    (VOID)LOS_MemFree(OS_SYS_MEM_ADDR, dev->ringBuffer);
3043d8536b4Sopenharmony_ci    dev->ringBuffer = NULL;
3053d8536b4Sopenharmony_ci    (VOID)LOS_MemFree(OS_SYS_MEM_ADDR, dev);
3063d8536b4Sopenharmony_ci
3073d8536b4Sopenharmony_ci    return 0;
3083d8536b4Sopenharmony_ci}
3093d8536b4Sopenharmony_ci
3103d8536b4Sopenharmony_ciSTATIC INT32 PipeDevFdAlloc(VOID)
3113d8536b4Sopenharmony_ci{
3123d8536b4Sopenharmony_ci    UINT32 i = 0;
3133d8536b4Sopenharmony_ci    INT32 fd = 0;
3143d8536b4Sopenharmony_ci
3153d8536b4Sopenharmony_ci    while (g_devFdBitmap[i] & (1U << fd)) {
3163d8536b4Sopenharmony_ci        fd++;
3173d8536b4Sopenharmony_ci        if (fd == 32) { /* 32: bit index max is 32. */
3183d8536b4Sopenharmony_ci            i++;
3193d8536b4Sopenharmony_ci            fd = 0;
3203d8536b4Sopenharmony_ci        }
3213d8536b4Sopenharmony_ci
3223d8536b4Sopenharmony_ci        if (i == PIPE_DEV_FD_BITMAP_LEN) {
3233d8536b4Sopenharmony_ci            return -1;
3243d8536b4Sopenharmony_ci        }
3253d8536b4Sopenharmony_ci    }
3263d8536b4Sopenharmony_ci    g_devFdBitmap[i] |= (1U << fd);
3273d8536b4Sopenharmony_ci    return (fd + (i << 5)); /* 5: i is the multiple of 32. */
3283d8536b4Sopenharmony_ci}
3293d8536b4Sopenharmony_ci
3303d8536b4Sopenharmony_ciSTATIC VOID PipeDevFdFree(INT32 fd)
3313d8536b4Sopenharmony_ci{
3323d8536b4Sopenharmony_ci    g_devFdBitmap[fd >> 5] &= ~(1U << (fd & 0x1F)); /* 5: fd is the multiple of 32. */
3333d8536b4Sopenharmony_ci}
3343d8536b4Sopenharmony_ci
3353d8536b4Sopenharmony_ciSTATIC VOID PipePollNotify(struct PipeDev *dev, PollEvent event)
3363d8536b4Sopenharmony_ci{
3373d8536b4Sopenharmony_ci    struct PollWaitQueue *waitQueue = &dev->wq;
3383d8536b4Sopenharmony_ci
3393d8536b4Sopenharmony_ci    if (event & POLLERR) {
3403d8536b4Sopenharmony_ci        event &= ~(POLLIN | POLLOUT);
3413d8536b4Sopenharmony_ci    }
3423d8536b4Sopenharmony_ci
3433d8536b4Sopenharmony_ci    PollNotify(waitQueue, event);
3443d8536b4Sopenharmony_ci}
3453d8536b4Sopenharmony_ci
3463d8536b4Sopenharmony_ciINT32 PipeOpen(const CHAR *path, INT32 openFlag, INT32 minFd)
3473d8536b4Sopenharmony_ci{
3483d8536b4Sopenharmony_ci    struct PipeDev *dev = NULL;
3493d8536b4Sopenharmony_ci    INT32 fd = -1;
3503d8536b4Sopenharmony_ci
3513d8536b4Sopenharmony_ci    if (path == NULL) {
3523d8536b4Sopenharmony_ci        errno = EINVAL;
3533d8536b4Sopenharmony_ci        return -1;
3543d8536b4Sopenharmony_ci    }
3553d8536b4Sopenharmony_ci
3563d8536b4Sopenharmony_ci    if ((openFlag != O_RDONLY) && (openFlag != O_WRONLY)) {
3573d8536b4Sopenharmony_ci        errno = EINVAL;
3583d8536b4Sopenharmony_ci        return -1;
3593d8536b4Sopenharmony_ci    }
3603d8536b4Sopenharmony_ci
3613d8536b4Sopenharmony_ci    dev = PipeDevFind(path);
3623d8536b4Sopenharmony_ci    if (dev == NULL) {
3633d8536b4Sopenharmony_ci        errno = ENODEV;
3643d8536b4Sopenharmony_ci        return -1;
3653d8536b4Sopenharmony_ci    }
3663d8536b4Sopenharmony_ci
3673d8536b4Sopenharmony_ci    fd = PipeDevFdAlloc();
3683d8536b4Sopenharmony_ci    if (fd < 0) {
3693d8536b4Sopenharmony_ci        errno = EBUSY;
3703d8536b4Sopenharmony_ci        return -1;
3713d8536b4Sopenharmony_ci    }
3723d8536b4Sopenharmony_ci
3733d8536b4Sopenharmony_ci    (VOID)LOS_MuxPend(g_devFdMutex, LOS_WAIT_FOREVER);
3743d8536b4Sopenharmony_ci    g_devFd[fd].dev = dev;
3753d8536b4Sopenharmony_ci    g_devFd[fd].openFlag = openFlag;
3763d8536b4Sopenharmony_ci    g_devStartFd = minFd;
3773d8536b4Sopenharmony_ci    (VOID)LOS_MuxPost(g_devFdMutex);
3783d8536b4Sopenharmony_ci
3793d8536b4Sopenharmony_ci    PIPE_DEV_LOCK(dev->mutex);
3803d8536b4Sopenharmony_ci    if (openFlag == O_RDONLY) {
3813d8536b4Sopenharmony_ci        dev->readerCnt++;
3823d8536b4Sopenharmony_ci    } else if (openFlag == O_WRONLY) {
3833d8536b4Sopenharmony_ci        dev->writerCnt++;
3843d8536b4Sopenharmony_ci    }
3853d8536b4Sopenharmony_ci    dev->ref++;
3863d8536b4Sopenharmony_ci
3873d8536b4Sopenharmony_ci    if (dev->ringBuffer == NULL) {
3883d8536b4Sopenharmony_ci        dev->ringBuffer = LOS_MemAlloc(OS_SYS_MEM_ADDR, PIPE_DEV_BUF_SIZE);
3893d8536b4Sopenharmony_ci        if (dev->ringBuffer == NULL) {
3903d8536b4Sopenharmony_ci            PIPE_DEV_UNLOCK(dev->mutex);
3913d8536b4Sopenharmony_ci            PipeDevFdFree(fd);
3923d8536b4Sopenharmony_ci            errno = ENOMEM;
3933d8536b4Sopenharmony_ci            return -1;
3943d8536b4Sopenharmony_ci        }
3953d8536b4Sopenharmony_ci        dev->bufferSize = PIPE_DEV_BUF_SIZE;
3963d8536b4Sopenharmony_ci    }
3973d8536b4Sopenharmony_ci    PIPE_DEV_UNLOCK(dev->mutex);
3983d8536b4Sopenharmony_ci
3993d8536b4Sopenharmony_ci    return (fd + minFd);
4003d8536b4Sopenharmony_ci}
4013d8536b4Sopenharmony_ci
4023d8536b4Sopenharmony_ciSTATIC INLINE struct PipeFdDev *PipeFdDevGet(INT32 fd)
4033d8536b4Sopenharmony_ci{
4043d8536b4Sopenharmony_ci    if (fd < g_devStartFd) {
4053d8536b4Sopenharmony_ci        return NULL;
4063d8536b4Sopenharmony_ci    }
4073d8536b4Sopenharmony_ci
4083d8536b4Sopenharmony_ci    fd -= g_devStartFd;
4093d8536b4Sopenharmony_ci    if (fd >= PIPE_FD_NUM) {
4103d8536b4Sopenharmony_ci        return NULL;
4113d8536b4Sopenharmony_ci    }
4123d8536b4Sopenharmony_ci    return &g_devFd[fd];
4133d8536b4Sopenharmony_ci}
4143d8536b4Sopenharmony_ci
4153d8536b4Sopenharmony_ciSTATIC struct PipeDev *PipeFd2Dev(INT32 fd)
4163d8536b4Sopenharmony_ci{
4173d8536b4Sopenharmony_ci    struct PipeFdDev *devFd = PipeFdDevGet(fd);
4183d8536b4Sopenharmony_ci
4193d8536b4Sopenharmony_ci    return (devFd != NULL) ? devFd->dev : NULL;
4203d8536b4Sopenharmony_ci}
4213d8536b4Sopenharmony_ci
4223d8536b4Sopenharmony_ciINT32 PipeClose(INT32 fd)
4233d8536b4Sopenharmony_ci{
4243d8536b4Sopenharmony_ci    struct PipeDev *dev = NULL;
4253d8536b4Sopenharmony_ci    UINT32 openFlag;
4263d8536b4Sopenharmony_ci
4273d8536b4Sopenharmony_ci    (VOID)LOS_MuxPend(g_devFdMutex, LOS_WAIT_FOREVER);
4283d8536b4Sopenharmony_ci    dev = PipeFd2Dev(fd);
4293d8536b4Sopenharmony_ci    if (dev == NULL) {
4303d8536b4Sopenharmony_ci        errno = ENODEV;
4313d8536b4Sopenharmony_ci        goto ERROR;
4323d8536b4Sopenharmony_ci    }
4333d8536b4Sopenharmony_ci    fd -= g_devStartFd;
4343d8536b4Sopenharmony_ci    openFlag = g_devFd[fd].openFlag;
4353d8536b4Sopenharmony_ci    g_devFd[fd].dev = NULL;
4363d8536b4Sopenharmony_ci    g_devFd[fd].openFlag = FALSE;
4373d8536b4Sopenharmony_ci    PipeDevFdFree(fd);
4383d8536b4Sopenharmony_ci    (VOID)LOS_MuxPost(g_devFdMutex);
4393d8536b4Sopenharmony_ci
4403d8536b4Sopenharmony_ci    PIPE_DEV_LOCK(dev->mutex);
4413d8536b4Sopenharmony_ci    if (openFlag == O_RDONLY) {
4423d8536b4Sopenharmony_ci        dev->readerCnt--;
4433d8536b4Sopenharmony_ci    } else if (openFlag == O_WRONLY) {
4443d8536b4Sopenharmony_ci        dev->writerCnt--;
4453d8536b4Sopenharmony_ci    }
4463d8536b4Sopenharmony_ci
4473d8536b4Sopenharmony_ci    if (dev->readerCnt == 0) {
4483d8536b4Sopenharmony_ci        PIPE_RW_POST(dev->writeSem);
4493d8536b4Sopenharmony_ci        PipePollNotify(dev, POLLOUT);
4503d8536b4Sopenharmony_ci    }
4513d8536b4Sopenharmony_ci
4523d8536b4Sopenharmony_ci    if (dev->writerCnt == 0) {
4533d8536b4Sopenharmony_ci        PIPE_RW_POST(dev->readSem);
4543d8536b4Sopenharmony_ci        PipePollNotify(dev, POLLIN);
4553d8536b4Sopenharmony_ci    }
4563d8536b4Sopenharmony_ci
4573d8536b4Sopenharmony_ci    if (--dev->ref == 0) {
4583d8536b4Sopenharmony_ci        PIPE_DEV_UNLOCK(dev->mutex);
4593d8536b4Sopenharmony_ci        (VOID)PipeDevUnregister(dev);
4603d8536b4Sopenharmony_ci    } else {
4613d8536b4Sopenharmony_ci        PIPE_DEV_UNLOCK(dev->mutex);
4623d8536b4Sopenharmony_ci    }
4633d8536b4Sopenharmony_ci
4643d8536b4Sopenharmony_ci    return 0;
4653d8536b4Sopenharmony_ciERROR:
4663d8536b4Sopenharmony_ci    (VOID)LOS_MuxPost(g_devFdMutex);
4673d8536b4Sopenharmony_ci    return -1;
4683d8536b4Sopenharmony_ci}
4693d8536b4Sopenharmony_ci
4703d8536b4Sopenharmony_ciSTATIC INLINE BOOL PipeWriterIsWaiting(UINT32 sem)
4713d8536b4Sopenharmony_ci{
4723d8536b4Sopenharmony_ci    LosSemCB *semCB = GET_SEM(sem);
4733d8536b4Sopenharmony_ci    UINT32 num = 0;
4743d8536b4Sopenharmony_ci
4753d8536b4Sopenharmony_ci    while (semCB->semCount == 0) {
4763d8536b4Sopenharmony_ci        UINT32 ret = LOS_SemPost(semCB->semID);
4773d8536b4Sopenharmony_ci        if (ret != LOS_OK) {
4783d8536b4Sopenharmony_ci            PRINT_ERR("pipe device write sem post error, ret = %x\n", ret);
4793d8536b4Sopenharmony_ci        }
4803d8536b4Sopenharmony_ci        num++;
4813d8536b4Sopenharmony_ci    }
4823d8536b4Sopenharmony_ci    return (num <= 1) ? FALSE : TRUE;
4833d8536b4Sopenharmony_ci}
4843d8536b4Sopenharmony_ci
4853d8536b4Sopenharmony_ciSTATIC struct PipeDev *PipeDevGet(INT32 fd)
4863d8536b4Sopenharmony_ci{
4873d8536b4Sopenharmony_ci    struct PipeDev *dev = NULL;
4883d8536b4Sopenharmony_ci
4893d8536b4Sopenharmony_ci    (VOID)LOS_MuxPend(g_devFdMutex, LOS_WAIT_FOREVER);
4903d8536b4Sopenharmony_ci    dev = PipeFd2Dev(fd);
4913d8536b4Sopenharmony_ci    (VOID)LOS_MuxPost(g_devFdMutex);
4923d8536b4Sopenharmony_ci
4933d8536b4Sopenharmony_ci    return dev;
4943d8536b4Sopenharmony_ci}
4953d8536b4Sopenharmony_ci
4963d8536b4Sopenharmony_ciINT32 PipeRead(INT32 fd, VOID *buf, size_t len)
4973d8536b4Sopenharmony_ci{
4983d8536b4Sopenharmony_ci    struct PipeDev *dev = NULL;
4993d8536b4Sopenharmony_ci    INT32 ret;
5003d8536b4Sopenharmony_ci    size_t nread = 0;
5013d8536b4Sopenharmony_ci    size_t tmpLen;
5023d8536b4Sopenharmony_ci
5033d8536b4Sopenharmony_ci    if ((buf == NULL) || (len == 0)) {
5043d8536b4Sopenharmony_ci        errno = EINVAL;
5053d8536b4Sopenharmony_ci        return -1;
5063d8536b4Sopenharmony_ci    }
5073d8536b4Sopenharmony_ci
5083d8536b4Sopenharmony_ci    dev = PipeDevGet(fd);
5093d8536b4Sopenharmony_ci    if (dev == NULL) {
5103d8536b4Sopenharmony_ci        errno = ENODEV;
5113d8536b4Sopenharmony_ci        return -1;
5123d8536b4Sopenharmony_ci    }
5133d8536b4Sopenharmony_ci
5143d8536b4Sopenharmony_ci    PIPE_DEV_LOCK(dev->mutex);
5153d8536b4Sopenharmony_ci    if ((dev->readIndex == dev->writeIndex) &&
5163d8536b4Sopenharmony_ci        (dev->roll == FALSE)) {
5173d8536b4Sopenharmony_ci        PIPE_DEV_UNLOCK(dev->mutex);
5183d8536b4Sopenharmony_ci
5193d8536b4Sopenharmony_ci        ret = LOS_SemPend(dev->readSem, LOS_WAIT_FOREVER);
5203d8536b4Sopenharmony_ci        if (ret != LOS_OK) {
5213d8536b4Sopenharmony_ci            errno = EINVAL;
5223d8536b4Sopenharmony_ci            goto ERROR;
5233d8536b4Sopenharmony_ci        }
5243d8536b4Sopenharmony_ci        PIPE_DEV_LOCK(dev->mutex);
5253d8536b4Sopenharmony_ci    }
5263d8536b4Sopenharmony_ci
5273d8536b4Sopenharmony_ci    while (nread < len) {
5283d8536b4Sopenharmony_ci        tmpLen = PipeRingbufferRead(dev, (CHAR *)buf + nread, len - nread);
5293d8536b4Sopenharmony_ci        if (tmpLen == 0) {
5303d8536b4Sopenharmony_ci            PIPE_RW_WAIT(dev->readSem);
5313d8536b4Sopenharmony_ci            /* No writer operates at present, which indicates that the write operation may have ended */
5323d8536b4Sopenharmony_ci            if (!PipeWriterIsWaiting(dev->writeSem)) {
5333d8536b4Sopenharmony_ci                PipePollNotify(dev, POLLOUT);
5343d8536b4Sopenharmony_ci                PIPE_DEV_UNLOCK(dev->mutex);
5353d8536b4Sopenharmony_ci                return nread;
5363d8536b4Sopenharmony_ci            }
5373d8536b4Sopenharmony_ci            PipePollNotify(dev, POLLOUT);
5383d8536b4Sopenharmony_ci
5393d8536b4Sopenharmony_ci            PIPE_DEV_UNLOCK(dev->mutex);
5403d8536b4Sopenharmony_ci            ret = LOS_SemPend(dev->readSem, LOS_WAIT_FOREVER);
5413d8536b4Sopenharmony_ci            if (ret != LOS_OK) {
5423d8536b4Sopenharmony_ci                errno = EINVAL;
5433d8536b4Sopenharmony_ci                goto ERROR;
5443d8536b4Sopenharmony_ci            }
5453d8536b4Sopenharmony_ci            PIPE_DEV_LOCK(dev->mutex);
5463d8536b4Sopenharmony_ci        }
5473d8536b4Sopenharmony_ci        nread += tmpLen;
5483d8536b4Sopenharmony_ci    }
5493d8536b4Sopenharmony_ci    PIPE_RW_POST(dev->writeSem);
5503d8536b4Sopenharmony_ci    PIPE_DEV_UNLOCK(dev->mutex);
5513d8536b4Sopenharmony_ci    PipePollNotify(dev, POLLOUT);
5523d8536b4Sopenharmony_ci
5533d8536b4Sopenharmony_ci    return nread;
5543d8536b4Sopenharmony_ciERROR:
5553d8536b4Sopenharmony_ci    return -1;
5563d8536b4Sopenharmony_ci}
5573d8536b4Sopenharmony_ci
5583d8536b4Sopenharmony_ciINT32 PipeWrite(INT32 fd, const VOID *buf, size_t len)
5593d8536b4Sopenharmony_ci{
5603d8536b4Sopenharmony_ci    struct PipeDev *dev = NULL;
5613d8536b4Sopenharmony_ci    INT32 ret;
5623d8536b4Sopenharmony_ci    size_t nwrite = 0;
5633d8536b4Sopenharmony_ci    size_t tmpLen;
5643d8536b4Sopenharmony_ci
5653d8536b4Sopenharmony_ci    if ((buf == NULL) || (len == 0)) {
5663d8536b4Sopenharmony_ci        errno = EINVAL;
5673d8536b4Sopenharmony_ci        return -1;
5683d8536b4Sopenharmony_ci    }
5693d8536b4Sopenharmony_ci
5703d8536b4Sopenharmony_ci    dev = PipeDevGet(fd);
5713d8536b4Sopenharmony_ci    if (dev == NULL) {
5723d8536b4Sopenharmony_ci        errno = ENODEV;
5733d8536b4Sopenharmony_ci        return -1;
5743d8536b4Sopenharmony_ci    }
5753d8536b4Sopenharmony_ci
5763d8536b4Sopenharmony_ci    PIPE_DEV_LOCK(dev->mutex);
5773d8536b4Sopenharmony_ci    while (nwrite < len) {
5783d8536b4Sopenharmony_ci        tmpLen = PipeRingbufferWrite(dev, (char *)buf + nwrite, len - nwrite);
5793d8536b4Sopenharmony_ci        if (tmpLen == 0) {
5803d8536b4Sopenharmony_ci            PIPE_RW_POST(dev->readSem);
5813d8536b4Sopenharmony_ci            PipePollNotify(dev, POLLIN);
5823d8536b4Sopenharmony_ci            PIPE_RW_WAIT(dev->writeSem);
5833d8536b4Sopenharmony_ci
5843d8536b4Sopenharmony_ci            PIPE_DEV_UNLOCK(dev->mutex);
5853d8536b4Sopenharmony_ci            ret = LOS_SemPend(dev->writeSem, LOS_WAIT_FOREVER);
5863d8536b4Sopenharmony_ci            if (ret != LOS_OK) {
5873d8536b4Sopenharmony_ci                errno = EINVAL;
5883d8536b4Sopenharmony_ci                goto ERROR;
5893d8536b4Sopenharmony_ci            }
5903d8536b4Sopenharmony_ci            PIPE_DEV_LOCK(dev->mutex);
5913d8536b4Sopenharmony_ci        }
5923d8536b4Sopenharmony_ci        nwrite += tmpLen;
5933d8536b4Sopenharmony_ci    }
5943d8536b4Sopenharmony_ci    PIPE_RW_POST(dev->readSem);
5953d8536b4Sopenharmony_ci    PipePollNotify(dev, POLLIN);
5963d8536b4Sopenharmony_ci    PIPE_DEV_UNLOCK(dev->mutex);
5973d8536b4Sopenharmony_ci
5983d8536b4Sopenharmony_ci    return nwrite;
5993d8536b4Sopenharmony_ciERROR:
6003d8536b4Sopenharmony_ci    return -1;
6013d8536b4Sopenharmony_ci}
6023d8536b4Sopenharmony_ci
6033d8536b4Sopenharmony_ciINT32 PipePoll(INT32 fd, struct PollTable *table)
6043d8536b4Sopenharmony_ci{
6053d8536b4Sopenharmony_ci    struct PipeDev *dev = NULL;
6063d8536b4Sopenharmony_ci    struct PipeFdDev *devFd = NULL;
6073d8536b4Sopenharmony_ci    UINT32 openFlag;
6083d8536b4Sopenharmony_ci    INT32 mask;
6093d8536b4Sopenharmony_ci    size_t nbytes;
6103d8536b4Sopenharmony_ci    PollEvent event = 0;
6113d8536b4Sopenharmony_ci
6123d8536b4Sopenharmony_ci    if (table == NULL) {
6133d8536b4Sopenharmony_ci        errno = EINVAL;
6143d8536b4Sopenharmony_ci        return -1;
6153d8536b4Sopenharmony_ci    }
6163d8536b4Sopenharmony_ci
6173d8536b4Sopenharmony_ci    (VOID)LOS_MuxPend(g_devFdMutex, LOS_WAIT_FOREVER);
6183d8536b4Sopenharmony_ci    devFd = PipeFdDevGet(fd);
6193d8536b4Sopenharmony_ci    if (devFd == NULL) {
6203d8536b4Sopenharmony_ci        (VOID)LOS_MuxPost(g_devFdMutex);
6213d8536b4Sopenharmony_ci        errno = ENODEV;
6223d8536b4Sopenharmony_ci        return -1;
6233d8536b4Sopenharmony_ci    }
6243d8536b4Sopenharmony_ci    openFlag = devFd->openFlag;
6253d8536b4Sopenharmony_ci    dev = devFd->dev;
6263d8536b4Sopenharmony_ci    (VOID)LOS_MuxPost(g_devFdMutex);
6273d8536b4Sopenharmony_ci
6283d8536b4Sopenharmony_ci    PIPE_DEV_LOCK(dev->mutex);
6293d8536b4Sopenharmony_ci    if (dev->readIndex == dev->writeIndex) {
6303d8536b4Sopenharmony_ci        if (dev->roll == TRUE) {
6313d8536b4Sopenharmony_ci            nbytes = dev->bufferSize;
6323d8536b4Sopenharmony_ci        } else {
6333d8536b4Sopenharmony_ci            nbytes = 0;
6343d8536b4Sopenharmony_ci        }
6353d8536b4Sopenharmony_ci    } else if (dev->writeIndex > dev->readIndex) {
6363d8536b4Sopenharmony_ci        nbytes = dev->writeIndex - dev->readIndex;
6373d8536b4Sopenharmony_ci    } else {
6383d8536b4Sopenharmony_ci        nbytes = dev->bufferSize - dev->readIndex + dev->writeIndex;
6393d8536b4Sopenharmony_ci    }
6403d8536b4Sopenharmony_ci
6413d8536b4Sopenharmony_ci    if (((openFlag & O_WRONLY) != 0) && (nbytes < (dev->bufferSize - 1))) {
6423d8536b4Sopenharmony_ci        event |= POLLOUT;
6433d8536b4Sopenharmony_ci    }
6443d8536b4Sopenharmony_ci
6453d8536b4Sopenharmony_ci    if (((openFlag & O_WRONLY) == 0) && (nbytes > 0)) {
6463d8536b4Sopenharmony_ci        event |= POLLIN;
6473d8536b4Sopenharmony_ci    }
6483d8536b4Sopenharmony_ci
6493d8536b4Sopenharmony_ci    mask = event & table->event;
6503d8536b4Sopenharmony_ci    if (mask == 0) {
6513d8536b4Sopenharmony_ci        PollWait(&dev->wq, table);
6523d8536b4Sopenharmony_ci    }
6533d8536b4Sopenharmony_ci    PIPE_DEV_UNLOCK(dev->mutex);
6543d8536b4Sopenharmony_ci
6553d8536b4Sopenharmony_ci    return mask;
6563d8536b4Sopenharmony_ci}
6573d8536b4Sopenharmony_ci
6583d8536b4Sopenharmony_ciint pipe(int filedes[2])
6593d8536b4Sopenharmony_ci{
6603d8536b4Sopenharmony_ci    INT32 ret;
6613d8536b4Sopenharmony_ci    CHAR devName[PIPE_DEV_NAME_MAX] = {0};
6623d8536b4Sopenharmony_ci
6633d8536b4Sopenharmony_ci    ret = PipeDevRegister(devName, PIPE_DEV_NAME_MAX);
6643d8536b4Sopenharmony_ci    if (ret < 0) {
6653d8536b4Sopenharmony_ci        errno = -ret;
6663d8536b4Sopenharmony_ci        return -1;
6673d8536b4Sopenharmony_ci    }
6683d8536b4Sopenharmony_ci
6693d8536b4Sopenharmony_ci    struct PipeDev *dev = PipeDevFind(devName);
6703d8536b4Sopenharmony_ci    filedes[0] = open(devName, O_RDONLY);
6713d8536b4Sopenharmony_ci    if (filedes[0] < 0) {
6723d8536b4Sopenharmony_ci        (VOID)PipeDevUnregister(dev);
6733d8536b4Sopenharmony_ci        return -1;
6743d8536b4Sopenharmony_ci    }
6753d8536b4Sopenharmony_ci
6763d8536b4Sopenharmony_ci    filedes[1] = open(devName, O_WRONLY);
6773d8536b4Sopenharmony_ci    if (filedes[1] < 0) {
6783d8536b4Sopenharmony_ci        (VOID)PipeDevUnregister(dev);
6793d8536b4Sopenharmony_ci        (VOID)close(filedes[0]);
6803d8536b4Sopenharmony_ci        return -1;
6813d8536b4Sopenharmony_ci    }
6823d8536b4Sopenharmony_ci
6833d8536b4Sopenharmony_ci    return 0;
6843d8536b4Sopenharmony_ci}
6853d8536b4Sopenharmony_ci
6863d8536b4Sopenharmony_ciUINT32 OsPipeInit(VOID)
6873d8536b4Sopenharmony_ci{
6883d8536b4Sopenharmony_ci    UINT32 ret;
6893d8536b4Sopenharmony_ci
6903d8536b4Sopenharmony_ci    ret = LOS_MuxCreate(&g_devListMutex);
6913d8536b4Sopenharmony_ci    if (ret != LOS_OK) {
6923d8536b4Sopenharmony_ci        return ret;
6933d8536b4Sopenharmony_ci    }
6943d8536b4Sopenharmony_ci
6953d8536b4Sopenharmony_ci    ret = LOS_MuxCreate(&g_devFdMutex);
6963d8536b4Sopenharmony_ci    if (ret != LOS_OK) {
6973d8536b4Sopenharmony_ci        (VOID)LOS_MuxDelete(g_devListMutex);
6983d8536b4Sopenharmony_ci        return ret;
6993d8536b4Sopenharmony_ci    }
7003d8536b4Sopenharmony_ci
7013d8536b4Sopenharmony_ci    return LOS_OK;
7023d8536b4Sopenharmony_ci}
7033d8536b4Sopenharmony_ci#endif
704