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