/**************************************************************************
 Function   : VOS_SmBCreate
 Description: To create a Binary semaphore;
 Input      : acSmName -- the semaphore name, can be null
              Sm_Ini   -- The count number of the semaphore that create;
              ulFlags  -- FIFO or priority;
 Output     : pulSmID  -- the ID of the create semaphore;
 Return     : VOS_OK on success and errno on failure
 **************************************************************************/
VOS_UINT32 VOS_SmBCreate( VOS_CHAR Sm_Name[4],
                          VOS_UINT32 Sm_Init,
                          VOS_UINT32 Flags,
                          VOS_SEM * Sm_ID )
{
    int                    i;
    SEM_CONTROL_BLOCK      *iSemId;
    HANDLE                 pulSemId;
    VOS_INT32              init_state;

    if ( Sm_Init >= 1 )
    {
        init_state = 1;
    }
    else
    {
        init_state = 0;
    }

    iSemId = VOS_SemCtrlBlkGet();

    if( iSemId == VOS_MAX_SEM_ID_NULL)
    {
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
        return(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
    }

    pulSemId = CreateSemaphore( NULL, init_state,(VOS_INT32) 1, NULL );

    if(pulSemId == NULL)
    {
        VOS_SemCtrlBlkFree(iSemId);
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
        return(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
    }
    else
    {
        *Sm_ID = (VOS_SEM)iSemId;

        if ( VOS_NULL_PTR != Sm_Name )
        {
            for(i=0; i<VOS_MAX_SEM_NAME_LENGTH/2; i++)
            {
                iSemId->Name[i]  = Sm_Name[i];
            }
            iSemId->Name[VOS_MAX_SEM_NAME_LENGTH/2]  = '\0';
        }
        else
        {
            iSemId->Name[0] = '\0';
        }

        iSemId->SemType  = VOS_SEM_TYPE_BINARY;
        iSemId->SemFlags     = (int)Flags;
        iSemId->SemInitCount = (int)Sm_Init;
        iSemId->Win32Handle = pulSemId;

        return(VOS_OK);
    }
}
/*****************************************************************************
 Function   : VOS_SmDelete
 Description: to delete the exiting semaphore according to the ulSmID
 Input      : ulSmID -- ID of semaphore
 Return     : VOS_OK on success and errno on failure
 *****************************************************************************/
VOS_UINT32 VOS_SmDelete( VOS_SEM Sm_ID )
{
    SEM_CONTROL_BLOCK *temp_Ptr;

    temp_Ptr = (SEM_CONTROL_BLOCK *)Sm_ID;

    if( temp_Ptr == temp_Ptr->SemId )
    {
        if(temp_Ptr->Flag == VOS_SEM_CTRL_BLK_IDLE)
        {
            VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
            return(VOS_ERRNO_SEMA4_CCREATE_INVALID_SMID);
        }

        if ( 0 != CloseHandle(temp_Ptr->Win32Handle) )
        {
            return VOS_SemCtrlBlkFree(temp_Ptr);
        }
        else
        {
            VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OSALCREATEERR);
            return(VOS_ERRNO_SEMA4_CCREATE_OSALCREATEERR);
        }
    }
    else
    {
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_INVALID_SMID);
        return(VOS_ERRNO_SEMA4_CCREATE_INVALID_SMID);
    }
}
VOS_UINT32 VOS_SmDelete( VOS_SEM Sm_ID )
{
    SEM_CONTROL_BLOCK *temp_Ptr;

    temp_Ptr = (SEM_CONTROL_BLOCK *)Sm_ID;

    if( temp_Ptr == temp_Ptr->SemId )
    {
        if(temp_Ptr->Flag == VOS_SEM_CTRL_BLK_IDLE)
        {
            VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
            return(VOS_ERRNO_SEMA4_CCREATE_INVALID_SMID);
        }

        if ( NU_SUCCESS == NU_Delete_Semaphore(&(temp_Ptr->NuSem)) )
        {
            return VOS_SemCtrlBlkFree(temp_Ptr);
        }
        else
        {
            VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OSALCREATEERR);
            return(VOS_ERRNO_SEMA4_CCREATE_OSALCREATEERR);
        }
    }
    else
    {
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_INVALID_SMID);
        return(VOS_ERRNO_SEMA4_CCREATE_INVALID_SMID);
    }
}
Beispiel #4
0
/*****************************************************************************
 Function   : VOS_SmCCreate
 Description: To create a counting semaphore;
 Input      : acSmName -- the semaphore name, can be null
              ulSmInit -- The count number of the semaphore that create;
              ulFlags  -- FIFO or priority;
 Output     : pulSmID  -- the ID of the create semaphore;
 Return     : VOS_OK on success and errno on failure
 *****************************************************************************/
VOS_UINT32 VOS_SmCCreate( VOS_CHAR   acSmName[4],
                          VOS_UINT32 ulSmInit,
                          VOS_UINT32 ulFlags,
                          VOS_UINT32 *pulSmID )
{
    VOS_UINT32             i;
    SEM_CONTROL_BLOCK      *iSemId;
    HANDLE                 pulSemId;

    iSemId = VOS_SemCtrlBlkGet();

    if( iSemId == VOS_NULL_PTR)
    {
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
        return(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
    }

    if(ulSmInit == VOS_NULL_DWORD)
    {
        pulSemId = CreateSemaphore( VOS_NULL_PTR, (VOS_INT32)1, 1, VOS_NULL_PTR );
    }
    else
    {
        pulSemId = CreateSemaphore( VOS_NULL_PTR, (VOS_INT32)ulSmInit,\
                                    0x400000, VOS_NULL_PTR );
    }

    if(pulSemId == VOS_NULL_PTR)
    {
        VOS_SemCtrlBlkFree(iSemId);
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
        return(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
    }
    else
    {
        *pulSmID = (VOS_UINT32)iSemId;

        if ( VOS_NULL_PTR != acSmName )
        {
            for(i=0; i<VOS_MAX_SEM_NAME_LENGTH/2; i++)
            {
                iSemId->Name[i]  = acSmName[i];
            }
            iSemId->Name[VOS_MAX_SEM_NAME_LENGTH/2]  = '\0';
        }
        else
        {
            iSemId->Name[0] = '\0';
        }

        iSemId->SemFlags     = ulFlags;
        iSemId->SemInitCount = ulSmInit;
        iSemId->Win32Handle  = pulSemId;

        return(VOS_OK);
    }
}
/*****************************************************************************
 Function   : VOS_SmDelete
 Description: to delete the exiting semaphore according to the ulSmID
 Input      : ulSmID -- ID of semaphore
 Return     : VOS_OK on success and errno on failure
 *****************************************************************************/
VOS_UINT32 VOS_SmDelete( VOS_SEM Sm_ID )
{
    SEM_CONTROL_BLOCK *temp_Ptr;

    temp_Ptr = (SEM_CONTROL_BLOCK *)Sm_ID;

    if( temp_Ptr == temp_Ptr->SemId )
    {
        vos_printf("\r\nVOS_SmDelete: Delete the Sem %x", Sm_ID);

        if(temp_Ptr->Flag == VOS_SEM_CTRL_BLK_IDLE)
        {
            VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
            return(VOS_ERRNO_SEMA4_CCREATE_INVALID_SMID);
        }

        return VOS_SemCtrlBlkFree(temp_Ptr);     
    }
    else
    {
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_INVALID_SMID);
        return(VOS_ERRNO_SEMA4_CCREATE_INVALID_SMID);
    }
}
VOS_UINT32 VOS_SmDelete( VOS_SEM Sm_ID )
{
    SEM_CONTROL_BLOCK *temp_Ptr;

    temp_Ptr = (SEM_CONTROL_BLOCK *)Sm_ID;

    if( temp_Ptr == temp_Ptr->SemId )
    {
        if(temp_Ptr->Flag == VOS_SEM_CTRL_BLK_IDLE)
        {
            /*lint -e534*/
            VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
            /*lint +e534*/
            return(VOS_ERRNO_SEMA4_CCREATE_INVALID_SMID);
        }

        if ( SRE_OK == SRE_SemDelete(temp_Ptr->RTOSckSemId) )
        {
            return VOS_SemCtrlBlkFree(temp_Ptr);
        }
        else
        {
            /*lint -e534*/
            VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OSALCREATEERR);
            /*lint +e534*/
            return(VOS_ERRNO_SEMA4_CCREATE_OSALCREATEERR);
        }
    }
    else
    {
        /*lint -e534*/
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_INVALID_SMID);
        /*lint +e534*/
        return(VOS_ERRNO_SEMA4_CCREATE_INVALID_SMID);
    }
}
/*****************************************************************************
 Function   : VOS_SmCCreate
 Description: To create a counting semaphore;
 Input      : acSmName -- the semaphore name, can be null
              ulSmInit -- The count number of the semaphore that create;
              ulFlags  -- FIFO or priority;
 Output     : pulSmID  -- the ID of the create semaphore;
 Return     : VOS_OK on success and errno on failure
 *****************************************************************************/
VOS_UINT32 VOS_SmCCreate( VOS_CHAR   acSmName[4],
                          VOS_UINT32 ulSmInit,
                          VOS_UINT32 ulFlags,
                          VOS_SEM *pulSmID )
{
    int                    i;
    SEM_CONTROL_BLOCK      *iSemId;
    HANDLE                 pulSemId;

    iSemId = VOS_SemCtrlBlkGet();

    if( iSemId == VOS_MAX_SEM_ID_NULL)
    {
        /*lint -e534*/
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
        /*lint +e534*/
        return(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
    }

    if(ulSmInit == 0xFFFFFFFF)
    {
        pulSemId = CreateSemaphore( NULL, (VOS_INT32)1, 1, NULL );
    }
    else
    {
        pulSemId = CreateSemaphore( NULL, (VOS_INT32)ulSmInit, 0x400000, NULL );
    }

    if(pulSemId == NULL)
    {
        VOS_SemCtrlBlkFree(iSemId);
        /*lint -e534*/
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
        /*lint +e534*/
        return(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
    }
    else
    {
        *pulSmID = (VOS_SEM)iSemId;

        if ( VOS_NULL_PTR != acSmName )
        {
            for(i=0; i<VOS_MAX_SEM_NAME_LENGTH/2; i++)
            {
                iSemId->Name[i]  = acSmName[i];
            }
            iSemId->Name[VOS_MAX_SEM_NAME_LENGTH/2]  = '\0';
        }
        else
        {
            iSemId->Name[0] = '\0';
        }

        if(ulSmInit == 0xFFFFFFFF)
        {
            iSemId->SemType  = VOS_SEM_TYPE_MUTEX;
        }
        else
        {
            iSemId->SemType  = VOS_SEM_TYPE_COUNT;
        }

        iSemId->SemFlags     = (int)ulFlags;
        iSemId->SemInitCount = (int)ulSmInit;
        iSemId->Win32Handle  = pulSemId;

        return(VOS_OK);
    }
}
/*****************************************************************************
 Function   : VOS_SmCCreate
 Description: To create a counting semaphore;
 Input      : acSmName -- the semaphore name, can be null
              ulSmInit -- The count number of the semaphore that create;
              ulFlags  -- FIFO or priority;
 Output     : pulSmID  -- the ID of the create semaphore;
 Return     : VOS_OK on success and errno on failure
 *****************************************************************************/
VOS_UINT32 VOS_SmCCreate( VOS_CHAR   acSmName[4],
                          VOS_UINT32 ulSmInit,
                          VOS_UINT32 ulFlags,
                          VOS_SEM *pulSmID )
{
    int                    i;
    SEM_CONTROL_BLOCK      *iSemId;
    OPTION                 SemOption;
    VOS_UINT32             ulTempInitVal;

    iSemId = VOS_SemCtrlBlkGet();

    if( iSemId == VOS_MAX_SEM_ID_NULL)
    {
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
        return(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
    }

    if( (ulFlags & VOS_SEMA4_PRIOR) )
    {
        SemOption = NU_PRIORITY;
    }
    else
    {
        SemOption = NU_FIFO;
    }

    if( 0xFFFFFFFF == ulSmInit )
    {
        ulTempInitVal  = 1;
    }
    else
    {
        ulTempInitVal  = ulSmInit;
    }

    if ( NU_SUCCESS
        != NU_Create_Semaphore(&(iSemId->NuSem), acSmName, ulTempInitVal, SemOption))
    {
        VOS_SemCtrlBlkFree(iSemId);
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
        return(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
    }
    else
    {
        *pulSmID = (VOS_SEM)iSemId;

        if ( VOS_NULL_PTR != acSmName )
        {
            for(i=0; i<VOS_MAX_SEM_NAME_LENGTH/2; i++)
            {
                iSemId->Name[i]  = acSmName[i];
            }
            iSemId->Name[VOS_MAX_SEM_NAME_LENGTH/2]  = '\0';
        }
        else
        {
            iSemId->Name[0] = '\0';
        }

        if( 0xFFFFFFFF == ulSmInit )
        {
            iSemId->SemType  = VOS_SEM_TYPE_MUTEX;
        }
        else
        {
            iSemId->SemType  = VOS_SEM_TYPE_COUNT;
        }

        iSemId->SemFlags     = (int)ulFlags;
        iSemId->SemInitCount = (int)ulSmInit;

        return(VOS_OK);
    }
}
VOS_UINT32 VOS_SmBCreate( VOS_CHAR Sm_Name[4],
                          VOS_UINT32 Sm_Init,
                          VOS_UINT32 Flags,
                          VOS_SEM * Sm_ID )
{
    int                    i;
    SEM_CONTROL_BLOCK      *iSemId;
    OS_SEM_MODE_E          enOptions;
    SEM_HANDLE_T           SemHandle;
    VOS_UINT32             ulResult;
    VOS_UINT32             init_state;

    if( (Flags & VOS_SEMA4_PRIOR) )
    {
        enOptions = SEM_MODE_PRIOR;
    }
    else
    {
        enOptions = SEM_MODE_FIFO;
    }
/*
    if ( (ulFlags & VOS_SEMA4_INVERSION_SAFE) && (0xFFFFFFFF == ulSmInit) )
    {
        iOptions |= SEM_INVERSION_SAFE;
    }
*/
    iSemId = VOS_SemCtrlBlkGet();

    if( iSemId == VOS_MAX_SEM_ID_NULL)
    {
        /*lint -e534*/
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
        /*lint +e534*/
        return(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
    }

    if ( Sm_Init >= 1 )
    {
        init_state = OS_SEM_FULL;
    }
    else
    {
        init_state = OS_SEM_EMPTY;
    }

    /* SRE_SemBCreate输入OS_SEM_FULL只能为优先级方式 */
    if (OS_SEM_FULL != init_state)
    {
        ulResult = SRE_SemBCreate(init_state, &SemHandle, enOptions);
    }
    else
    {
        ulResult = SRE_SemCCreate(init_state, &SemHandle, enOptions);
        /*lint -e534*/
        SRE_SemCMaxCountSet(SemHandle, OS_SEM_FULL);
        /*lint +e534*/
    }

    if (SRE_OK != ulResult)
    {
        /*lint -e534*/
        VOS_SemCtrlBlkFree(iSemId);
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
        /*lint +e534*/
        return(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
    }
    else
    {
        *Sm_ID = (VOS_SEM)iSemId;

        if ( VOS_NULL_PTR != Sm_Name )
        {
            for(i=0; i<VOS_MAX_SEM_NAME_LENGTH/2; i++)
            {
                iSemId->Name[i]  = Sm_Name[i];
            }
            iSemId->Name[VOS_MAX_SEM_NAME_LENGTH/2]  = '\0';
        }
        else
        {
            iSemId->Name[0] = '\0';
        }

        iSemId->SemType  = VOS_SEM_TYPE_BINARY;

        iSemId->SemFlags     = (int)Flags;
        iSemId->SemInitCount = (int)Sm_Init;
        iSemId->RTOSckSemId  = SemHandle;

        return(VOS_OK);
    }
}
/*****************************************************************************
 Function   : VOS_SmCCreate
 Description: To create a counting semaphore;
 Input      : acSmName -- the semaphore name, can be null
              ulSmInit -- The count number of the semaphore that create;
              ulFlags  -- FIFO or priority;
 Output     : pulSmID  -- the ID of the create semaphore;
 Return     : VOS_OK on success and errno on failure
 *****************************************************************************/
VOS_UINT32 VOS_SmCCreate( VOS_CHAR   acSmName[4],
                          VOS_UINT32 ulSmInit,
                          VOS_UINT32 ulFlags,
                          VOS_SEM *pulSmID )
{
    int                    i;
    SEM_CONTROL_BLOCK      *iSemId;
    OS_SEM_MODE_E          enOptions;
    SEM_HANDLE_T           SemHandle;
    VOS_UINT32             ulResult;

    if( (ulFlags & VOS_SEMA4_PRIOR) )
    {
        enOptions = SEM_MODE_PRIOR;
    }
    else
    {
        enOptions = SEM_MODE_FIFO;
    }
/*
    if ( (ulFlags & VOS_SEMA4_INVERSION_SAFE) && (0xFFFFFFFF == ulSmInit) )
    {
        iOptions |= SEM_INVERSION_SAFE;
    }
*/
    iSemId = VOS_SemCtrlBlkGet();

    if( iSemId == VOS_MAX_SEM_ID_NULL)
    {
        /*lint -e534*/
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
        /*lint +e534*/
        return(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
    }

    if(ulSmInit == 0xFFFFFFFF)
    {
        /* RTOSck中只有二进制信号量支持优先级翻转 */
        if ((VOS_SEMA4_PRIOR | VOS_SEMA4_INVERSION_SAFE)
            == (ulFlags & (VOS_SEMA4_PRIOR | VOS_SEMA4_INVERSION_SAFE)))
        {
            ulResult = SRE_SemBCreate(OS_SEM_FULL, &SemHandle, enOptions);
        }
        else
        {
            ulResult = SRE_SemCCreate(OS_SEM_FULL, &SemHandle, enOptions);
            /*lint -e534*/
            SRE_SemCMaxCountSet(SemHandle, OS_SEM_FULL);
            /*lint +e534*/
        }
    }
    else
    {
        ulResult = SRE_SemCCreate(ulSmInit, &SemHandle, enOptions);
    }

    if (SRE_OK != ulResult)
    {
        /*lint -e534*/
        VOS_SemCtrlBlkFree(iSemId);
        VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
        /*lint +e534*/
        return(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL);
    }
    else
    {
        *pulSmID = (VOS_SEM)iSemId;

        if ( VOS_NULL_PTR != acSmName )
        {
            for(i=0; i<VOS_MAX_SEM_NAME_LENGTH/2; i++)
            {
                iSemId->Name[i]  = acSmName[i];
            }
            iSemId->Name[VOS_MAX_SEM_NAME_LENGTH/2]  = '\0';
        }
        else
        {
            iSemId->Name[0] = '\0';
        }

        if(ulSmInit == 0xFFFFFFFF)
        {
            iSemId->SemType  = VOS_SEM_TYPE_MUTEX;
        }
        else
        {
            iSemId->SemType  = VOS_SEM_TYPE_COUNT;
        }

        iSemId->SemFlags     = (int)ulFlags;
        iSemId->SemInitCount = (int)ulSmInit;
        iSemId->RTOSckSemId  = SemHandle;

        return(VOS_OK);
    }
}