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 "los_mux.h"
333d8536b4Sopenharmony_ci#include "los_config.h"
343d8536b4Sopenharmony_ci#include "los_debug.h"
353d8536b4Sopenharmony_ci#include "los_hook.h"
363d8536b4Sopenharmony_ci#include "los_interrupt.h"
373d8536b4Sopenharmony_ci#include "los_memory.h"
383d8536b4Sopenharmony_ci#include "los_sched.h"
393d8536b4Sopenharmony_ci
403d8536b4Sopenharmony_ci#if (LOSCFG_BASE_IPC_MUX == 1)
413d8536b4Sopenharmony_ci
423d8536b4Sopenharmony_ciLITE_OS_SEC_BSS       LosMuxCB*   g_allMux = NULL;
433d8536b4Sopenharmony_ciLITE_OS_SEC_DATA_INIT LOS_DL_LIST g_unusedMuxList;
443d8536b4Sopenharmony_ci
453d8536b4Sopenharmony_ci/*****************************************************************************
463d8536b4Sopenharmony_ci Function      : OsMuxInit
473d8536b4Sopenharmony_ci Description  : Initializes the mutex
483d8536b4Sopenharmony_ci Input        : None
493d8536b4Sopenharmony_ci Output       : None
503d8536b4Sopenharmony_ci Return       : LOS_OK on success, or error code on failure
513d8536b4Sopenharmony_ci *****************************************************************************/
523d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_INIT UINT32 OsMuxInit(VOID)
533d8536b4Sopenharmony_ci{
543d8536b4Sopenharmony_ci    LosMuxCB *muxNode = NULL;
553d8536b4Sopenharmony_ci    UINT32 index;
563d8536b4Sopenharmony_ci
573d8536b4Sopenharmony_ci    LOS_ListInit(&g_unusedMuxList);
583d8536b4Sopenharmony_ci
593d8536b4Sopenharmony_ci    if (LOSCFG_BASE_IPC_MUX_LIMIT == 0) {
603d8536b4Sopenharmony_ci        return LOS_ERRNO_MUX_MAXNUM_ZERO;
613d8536b4Sopenharmony_ci    }
623d8536b4Sopenharmony_ci
633d8536b4Sopenharmony_ci    g_allMux = (LosMuxCB *)LOS_MemAlloc(m_aucSysMem0, (LOSCFG_BASE_IPC_MUX_LIMIT * sizeof(LosMuxCB)));
643d8536b4Sopenharmony_ci    if (g_allMux == NULL) {
653d8536b4Sopenharmony_ci        return LOS_ERRNO_MUX_NO_MEMORY;
663d8536b4Sopenharmony_ci    }
673d8536b4Sopenharmony_ci
683d8536b4Sopenharmony_ci    for (index = 0; index < LOSCFG_BASE_IPC_MUX_LIMIT; index++) {
693d8536b4Sopenharmony_ci        muxNode = ((LosMuxCB *)g_allMux) + index;
703d8536b4Sopenharmony_ci        muxNode->muxID = index;
713d8536b4Sopenharmony_ci        muxNode->owner = (LosTaskCB *)NULL;
723d8536b4Sopenharmony_ci        muxNode->muxStat = OS_MUX_UNUSED;
733d8536b4Sopenharmony_ci#if (LOSCFG_MUTEX_CREATE_TRACE == 1)
743d8536b4Sopenharmony_ci        muxNode->createInfo = 0;
753d8536b4Sopenharmony_ci#endif
763d8536b4Sopenharmony_ci        LOS_ListTailInsert(&g_unusedMuxList, &muxNode->muxList);
773d8536b4Sopenharmony_ci    }
783d8536b4Sopenharmony_ci    return LOS_OK;
793d8536b4Sopenharmony_ci}
803d8536b4Sopenharmony_ci
813d8536b4Sopenharmony_ci/*****************************************************************************
823d8536b4Sopenharmony_ci Function     : LOS_MuxCreate
833d8536b4Sopenharmony_ci Description  : Create a mutex
843d8536b4Sopenharmony_ci Input        : None
853d8536b4Sopenharmony_ci Output       : muxHandle ------ Mutex operation handle
863d8536b4Sopenharmony_ci Return       : LOS_OK on success, or error code on failure
873d8536b4Sopenharmony_ci *****************************************************************************/
883d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_INIT UINT32 LOS_MuxCreate(UINT32 *muxHandle)
893d8536b4Sopenharmony_ci{
903d8536b4Sopenharmony_ci    UINT32 intSave;
913d8536b4Sopenharmony_ci    LosMuxCB *muxCreated = NULL;
923d8536b4Sopenharmony_ci    LOS_DL_LIST *unusedMux = NULL;
933d8536b4Sopenharmony_ci    UINT32 errNo;
943d8536b4Sopenharmony_ci    UINT32 errLine;
953d8536b4Sopenharmony_ci
963d8536b4Sopenharmony_ci    if (muxHandle == NULL) {
973d8536b4Sopenharmony_ci        return LOS_ERRNO_MUX_PTR_NULL;
983d8536b4Sopenharmony_ci    }
993d8536b4Sopenharmony_ci
1003d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
1013d8536b4Sopenharmony_ci    if (LOS_ListEmpty(&g_unusedMuxList)) {
1023d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
1033d8536b4Sopenharmony_ci        OS_GOTO_ERR_HANDLER(LOS_ERRNO_MUX_ALL_BUSY);
1043d8536b4Sopenharmony_ci    }
1053d8536b4Sopenharmony_ci
1063d8536b4Sopenharmony_ci    unusedMux = LOS_DL_LIST_FIRST(&(g_unusedMuxList));
1073d8536b4Sopenharmony_ci    LOS_ListDelete(unusedMux);
1083d8536b4Sopenharmony_ci    muxCreated = (GET_MUX_LIST(unusedMux));
1093d8536b4Sopenharmony_ci    muxCreated->muxCount = 0;
1103d8536b4Sopenharmony_ci    muxCreated->muxStat = OS_MUX_USED;
1113d8536b4Sopenharmony_ci    muxCreated->priority = 0;
1123d8536b4Sopenharmony_ci    muxCreated->owner = (LosTaskCB *)NULL;
1133d8536b4Sopenharmony_ci    LOS_ListInit(&muxCreated->muxList);
1143d8536b4Sopenharmony_ci    *muxHandle = (UINT32)muxCreated->muxID;
1153d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
1163d8536b4Sopenharmony_ci    OsHookCall(LOS_HOOK_TYPE_MUX_CREATE, muxCreated);
1173d8536b4Sopenharmony_ci    return LOS_OK;
1183d8536b4Sopenharmony_ciERR_HANDLER:
1193d8536b4Sopenharmony_ci    OS_RETURN_ERROR_P2(errLine, errNo);
1203d8536b4Sopenharmony_ci}
1213d8536b4Sopenharmony_ci
1223d8536b4Sopenharmony_ci/*****************************************************************************
1233d8536b4Sopenharmony_ci Function     : LOS_MuxDelete
1243d8536b4Sopenharmony_ci Description  : Delete a mutex
1253d8536b4Sopenharmony_ci Input        : muxHandle ------Mutex operation handle
1263d8536b4Sopenharmony_ci Output       : None
1273d8536b4Sopenharmony_ci Return       : LOS_OK on success, or error code on failure
1283d8536b4Sopenharmony_ci *****************************************************************************/
1293d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_INIT UINT32 LOS_MuxDelete(UINT32 muxHandle)
1303d8536b4Sopenharmony_ci{
1313d8536b4Sopenharmony_ci    UINT32 intSave;
1323d8536b4Sopenharmony_ci    LosMuxCB *muxDeleted = NULL;
1333d8536b4Sopenharmony_ci    UINT32 errNo;
1343d8536b4Sopenharmony_ci    UINT32 errLine;
1353d8536b4Sopenharmony_ci
1363d8536b4Sopenharmony_ci    if (muxHandle >= (UINT32)LOSCFG_BASE_IPC_MUX_LIMIT) {
1373d8536b4Sopenharmony_ci        OS_GOTO_ERR_HANDLER(LOS_ERRNO_MUX_INVALID);
1383d8536b4Sopenharmony_ci    }
1393d8536b4Sopenharmony_ci
1403d8536b4Sopenharmony_ci    muxDeleted = GET_MUX(muxHandle);
1413d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
1423d8536b4Sopenharmony_ci    if (muxDeleted->muxStat == OS_MUX_UNUSED) {
1433d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
1443d8536b4Sopenharmony_ci        OS_GOTO_ERR_HANDLER(LOS_ERRNO_MUX_INVALID);
1453d8536b4Sopenharmony_ci    }
1463d8536b4Sopenharmony_ci
1473d8536b4Sopenharmony_ci    if ((!LOS_ListEmpty(&muxDeleted->muxList)) || muxDeleted->muxCount) {
1483d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
1493d8536b4Sopenharmony_ci        OS_GOTO_ERR_HANDLER(LOS_ERRNO_MUX_PENDED);
1503d8536b4Sopenharmony_ci    }
1513d8536b4Sopenharmony_ci
1523d8536b4Sopenharmony_ci    LOS_ListAdd(&g_unusedMuxList, &muxDeleted->muxList);
1533d8536b4Sopenharmony_ci    muxDeleted->muxStat = OS_MUX_UNUSED;
1543d8536b4Sopenharmony_ci#if (LOSCFG_MUTEX_CREATE_TRACE == 1)
1553d8536b4Sopenharmony_ci    muxDeleted->createInfo = 0;
1563d8536b4Sopenharmony_ci#endif
1573d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
1583d8536b4Sopenharmony_ci
1593d8536b4Sopenharmony_ci    OsHookCall(LOS_HOOK_TYPE_MUX_DELETE, muxDeleted);
1603d8536b4Sopenharmony_ci    return LOS_OK;
1613d8536b4Sopenharmony_ciERR_HANDLER:
1623d8536b4Sopenharmony_ci    OS_RETURN_ERROR_P2(errLine, errNo);
1633d8536b4Sopenharmony_ci}
1643d8536b4Sopenharmony_ci
1653d8536b4Sopenharmony_ciSTATIC_INLINE UINT32 OsMuxValidCheck(LosMuxCB *muxPended)
1663d8536b4Sopenharmony_ci{
1673d8536b4Sopenharmony_ci    if (muxPended->muxStat == OS_MUX_UNUSED) {
1683d8536b4Sopenharmony_ci        return LOS_ERRNO_MUX_INVALID;
1693d8536b4Sopenharmony_ci    }
1703d8536b4Sopenharmony_ci
1713d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
1723d8536b4Sopenharmony_ci        return LOS_ERRNO_MUX_IN_INTERR;
1733d8536b4Sopenharmony_ci    }
1743d8536b4Sopenharmony_ci
1753d8536b4Sopenharmony_ci    if (g_losTaskLock) {
1763d8536b4Sopenharmony_ci        PRINT_ERR("!!!LOS_ERRNO_MUX_PEND_IN_LOCK!!!\n");
1773d8536b4Sopenharmony_ci        return LOS_ERRNO_MUX_PEND_IN_LOCK;
1783d8536b4Sopenharmony_ci    }
1793d8536b4Sopenharmony_ci
1803d8536b4Sopenharmony_ci    if (g_losTask.runTask->taskStatus & OS_TASK_FLAG_SYSTEM_TASK) {
1813d8536b4Sopenharmony_ci        return LOS_ERRNO_MUX_PEND_IN_SYSTEM_TASK;
1823d8536b4Sopenharmony_ci    }
1833d8536b4Sopenharmony_ci
1843d8536b4Sopenharmony_ci    return LOS_OK;
1853d8536b4Sopenharmony_ci}
1863d8536b4Sopenharmony_ci
1873d8536b4Sopenharmony_ci/*****************************************************************************
1883d8536b4Sopenharmony_ci Function     : LOS_MuxPend
1893d8536b4Sopenharmony_ci Description  : Specify the mutex P operation
1903d8536b4Sopenharmony_ci Input        : muxHandle ------ Mutex operation handleone
1913d8536b4Sopenharmony_ci              : timeOut   ------- waiting time
1923d8536b4Sopenharmony_ci Output       : None
1933d8536b4Sopenharmony_ci Return       : LOS_OK on success, or error code on failure
1943d8536b4Sopenharmony_ci *****************************************************************************/
1953d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout)
1963d8536b4Sopenharmony_ci{
1973d8536b4Sopenharmony_ci    UINT32 intSave;
1983d8536b4Sopenharmony_ci    LosMuxCB *muxPended = NULL;
1993d8536b4Sopenharmony_ci    UINT32 retErr;
2003d8536b4Sopenharmony_ci    LosTaskCB *runningTask = NULL;
2013d8536b4Sopenharmony_ci
2023d8536b4Sopenharmony_ci    if (muxHandle >= (UINT32)LOSCFG_BASE_IPC_MUX_LIMIT) {
2033d8536b4Sopenharmony_ci        OS_RETURN_ERROR(LOS_ERRNO_MUX_INVALID);
2043d8536b4Sopenharmony_ci    }
2053d8536b4Sopenharmony_ci
2063d8536b4Sopenharmony_ci    muxPended = GET_MUX(muxHandle);
2073d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
2083d8536b4Sopenharmony_ci    retErr = OsMuxValidCheck(muxPended);
2093d8536b4Sopenharmony_ci    if (retErr) {
2103d8536b4Sopenharmony_ci        goto ERROR_MUX_PEND;
2113d8536b4Sopenharmony_ci    }
2123d8536b4Sopenharmony_ci
2133d8536b4Sopenharmony_ci    runningTask = (LosTaskCB *)g_losTask.runTask;
2143d8536b4Sopenharmony_ci    if (muxPended->muxCount == 0) {
2153d8536b4Sopenharmony_ci        muxPended->muxCount++;
2163d8536b4Sopenharmony_ci        muxPended->owner = runningTask;
2173d8536b4Sopenharmony_ci        muxPended->priority = runningTask->priority;
2183d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
2193d8536b4Sopenharmony_ci        goto HOOK;
2203d8536b4Sopenharmony_ci    }
2213d8536b4Sopenharmony_ci
2223d8536b4Sopenharmony_ci    if (muxPended->owner == runningTask) {
2233d8536b4Sopenharmony_ci        muxPended->muxCount++;
2243d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
2253d8536b4Sopenharmony_ci        goto HOOK;
2263d8536b4Sopenharmony_ci    }
2273d8536b4Sopenharmony_ci
2283d8536b4Sopenharmony_ci    if (!timeout) {
2293d8536b4Sopenharmony_ci        retErr = LOS_ERRNO_MUX_UNAVAILABLE;
2303d8536b4Sopenharmony_ci        goto ERROR_MUX_PEND;
2313d8536b4Sopenharmony_ci    }
2323d8536b4Sopenharmony_ci
2333d8536b4Sopenharmony_ci    runningTask->taskMux = (VOID *)muxPended;
2343d8536b4Sopenharmony_ci
2353d8536b4Sopenharmony_ci    if (muxPended->owner->priority > runningTask->priority) {
2363d8536b4Sopenharmony_ci        (VOID)OsSchedModifyTaskSchedParam(muxPended->owner, runningTask->priority);
2373d8536b4Sopenharmony_ci    }
2383d8536b4Sopenharmony_ci
2393d8536b4Sopenharmony_ci    OsSchedTaskWait(&muxPended->muxList, timeout);
2403d8536b4Sopenharmony_ci
2413d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
2423d8536b4Sopenharmony_ci    OsHookCall(LOS_HOOK_TYPE_MUX_PEND, muxPended, timeout);
2433d8536b4Sopenharmony_ci    LOS_Schedule();
2443d8536b4Sopenharmony_ci
2453d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
2463d8536b4Sopenharmony_ci    if (runningTask->taskStatus & OS_TASK_STATUS_TIMEOUT) {
2473d8536b4Sopenharmony_ci        runningTask->taskStatus &= (~OS_TASK_STATUS_TIMEOUT);
2483d8536b4Sopenharmony_ci        retErr = LOS_ERRNO_MUX_TIMEOUT;
2493d8536b4Sopenharmony_ci        goto ERROR_MUX_PEND;
2503d8536b4Sopenharmony_ci    }
2513d8536b4Sopenharmony_ci
2523d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
2533d8536b4Sopenharmony_ci    return LOS_OK;
2543d8536b4Sopenharmony_ci
2553d8536b4Sopenharmony_ciHOOK:
2563d8536b4Sopenharmony_ci    OsHookCall(LOS_HOOK_TYPE_MUX_PEND, muxPended, timeout);
2573d8536b4Sopenharmony_ci    return LOS_OK;
2583d8536b4Sopenharmony_ci
2593d8536b4Sopenharmony_ciERROR_MUX_PEND:
2603d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
2613d8536b4Sopenharmony_ci    OS_RETURN_ERROR(retErr);
2623d8536b4Sopenharmony_ci}
2633d8536b4Sopenharmony_ci
2643d8536b4Sopenharmony_ci/*****************************************************************************
2653d8536b4Sopenharmony_ci Function     : LOS_MuxPost
2663d8536b4Sopenharmony_ci Description  : Specify the mutex V operation,
2673d8536b4Sopenharmony_ci Input        : muxHandle ------ Mutex operation handle
2683d8536b4Sopenharmony_ci Output       : None
2693d8536b4Sopenharmony_ci Return       : LOS_OK on success, or error code on failure
2703d8536b4Sopenharmony_ci *****************************************************************************/
2713d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT UINT32 LOS_MuxPost(UINT32 muxHandle)
2723d8536b4Sopenharmony_ci{
2733d8536b4Sopenharmony_ci    UINT32 intSave;
2743d8536b4Sopenharmony_ci    LosMuxCB *muxPosted = GET_MUX(muxHandle);
2753d8536b4Sopenharmony_ci    LosTaskCB *resumedTask = NULL;
2763d8536b4Sopenharmony_ci    LosTaskCB *runningTask = NULL;
2773d8536b4Sopenharmony_ci
2783d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
2793d8536b4Sopenharmony_ci
2803d8536b4Sopenharmony_ci    if ((muxHandle >= (UINT32)LOSCFG_BASE_IPC_MUX_LIMIT) ||
2813d8536b4Sopenharmony_ci        (muxPosted->muxStat == OS_MUX_UNUSED)) {
2823d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
2833d8536b4Sopenharmony_ci        OS_RETURN_ERROR(LOS_ERRNO_MUX_INVALID);
2843d8536b4Sopenharmony_ci    }
2853d8536b4Sopenharmony_ci
2863d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
2873d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
2883d8536b4Sopenharmony_ci        OS_RETURN_ERROR(LOS_ERRNO_MUX_IN_INTERR);
2893d8536b4Sopenharmony_ci    }
2903d8536b4Sopenharmony_ci
2913d8536b4Sopenharmony_ci    runningTask = (LosTaskCB *)g_losTask.runTask;
2923d8536b4Sopenharmony_ci    if ((muxPosted->muxCount == 0) || (muxPosted->owner != runningTask)) {
2933d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
2943d8536b4Sopenharmony_ci        OS_RETURN_ERROR(LOS_ERRNO_MUX_INVALID);
2953d8536b4Sopenharmony_ci    }
2963d8536b4Sopenharmony_ci
2973d8536b4Sopenharmony_ci    if (--(muxPosted->muxCount) != 0) {
2983d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
2993d8536b4Sopenharmony_ci        OsHookCall(LOS_HOOK_TYPE_MUX_POST, muxPosted);
3003d8536b4Sopenharmony_ci        return LOS_OK;
3013d8536b4Sopenharmony_ci    }
3023d8536b4Sopenharmony_ci
3033d8536b4Sopenharmony_ci    if ((muxPosted->owner->priority) != muxPosted->priority) {
3043d8536b4Sopenharmony_ci        (VOID)OsSchedModifyTaskSchedParam(muxPosted->owner, muxPosted->priority);
3053d8536b4Sopenharmony_ci    }
3063d8536b4Sopenharmony_ci
3073d8536b4Sopenharmony_ci    if (!LOS_ListEmpty(&muxPosted->muxList)) {
3083d8536b4Sopenharmony_ci        resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(muxPosted->muxList)));
3093d8536b4Sopenharmony_ci
3103d8536b4Sopenharmony_ci        muxPosted->muxCount = 1;
3113d8536b4Sopenharmony_ci        muxPosted->owner = resumedTask;
3123d8536b4Sopenharmony_ci        muxPosted->priority = resumedTask->priority;
3133d8536b4Sopenharmony_ci        resumedTask->taskMux = NULL;
3143d8536b4Sopenharmony_ci
3153d8536b4Sopenharmony_ci        OsSchedTaskWake(resumedTask);
3163d8536b4Sopenharmony_ci
3173d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
3183d8536b4Sopenharmony_ci        OsHookCall(LOS_HOOK_TYPE_MUX_POST, muxPosted);
3193d8536b4Sopenharmony_ci        LOS_Schedule();
3203d8536b4Sopenharmony_ci    } else {
3213d8536b4Sopenharmony_ci        muxPosted->owner = NULL;
3223d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
3233d8536b4Sopenharmony_ci    }
3243d8536b4Sopenharmony_ci
3253d8536b4Sopenharmony_ci    return LOS_OK;
3263d8536b4Sopenharmony_ci}
3273d8536b4Sopenharmony_ci
3283d8536b4Sopenharmony_ci#endif /* (LOSCFG_BASE_IPC_MUX == 1) */
329