#include <Copyright.h>
/********************************************************************************
* osSem.c
*
* DESCRIPTION:
*       Semaphore related routines
*
* DEPENDENCIES:
*       OS Dependent.
*
* FILE REVISION NUMBER:
*
*******************************************************************************/

#ifdef _VXWORKS
#include "vxWorks.h"
#include "semLib.h"
#include "errnoLib.h"
#include "objLib.h"

int sysClkRateGet(void);

#elif defined(WIN32)
#include "windows.h"
#include "wdm.h"
#elif defined(LINUX)
#include "/usr/include/semaphore.h"
typedef    sem_t          semaphore ;
#endif

#include <msApi.h>

GT_SEM osSemCreate( GT_SEM_BEGIN_STATE state);
GT_STATUS osSemDelete(GT_SEM smid);
GT_STATUS osSemWait(  GT_SEM smid, GT_U32 timeOut);
GT_STATUS osSemSignal(GT_SEM smid);

/*******************************************************************************
* osSemCreate
*
* DESCRIPTION:
*       Create semaphore.
*
* INPUTS:
*       name   - semaphore Name
*       init   - init value of semaphore counter
*       count  - max counter (must be >= 1)
*
* OUTPUTS:
*       smid - semaphore Id
*
* RETURNS:
*       GT_OK   - on success
*       GT_FAIL - on error
*
* COMMENTS:
*       None
*
*******************************************************************************/
GT_SEM osSemCreate(GT_SEM_BEGIN_STATE state)
{
#ifdef _VXWORKS
#if 0
    return (GT_SEM)semBCreate(SEM_Q_FIFO, state);
#else
    GT_SEM semid;
    semid =(GT_SEM)semBCreate(SEM_Q_FIFO, state);
    return semid;
#endif

#elif defined(WIN32)
    return (GT_SEM)CreateSemaphore(NULL, state, 1, NULL);
#elif defined(LINUX)
    semaphore lxSem;

    sem_init(&lxSem, state, 1);
    return lxSem;
#else
    return 1;
#endif
    return GT_OK;
}

/*******************************************************************************
* osSemDelete
*
* DESCRIPTION:
*       Delete semaphore.
*
* INPUTS:
*       smid - semaphore Id
*
* OUTPUTS:
*       None
*
* RETURNS:
*       GT_OK   - on success
*       GT_FAIL - on error
*
* COMMENTS:
*       None
*
*******************************************************************************/
GT_STATUS osSemDelete(GT_SEM smid)
{
#ifdef _VXWORKS
    STATUS rc;

    rc = semDelete((SEM_ID) smid);
    if (rc != OK)
        return GT_FAIL;

#elif defined(WIN32)
    if (CloseHandle((HANDLE)smid) == 0)
        return GT_FAIL;

#elif defined(LINUX)
    sem_destroy((semaphore*) smid);
#else
    return GT_OK;
#endif

    return GT_OK;
}

/*******************************************************************************
* osSemWait
*
* DESCRIPTION:
*       Wait on semaphore.
*
* INPUTS:
*       smid    - semaphore Id
*       timeOut - time out in miliseconds or 0 to wait forever
*
* OUTPUTS:
*       None
*
* RETURNS:
*       GT_OK   - on success
*       GT_FAIL - on error
*       OS_TIMEOUT - on time out
*
* COMMENTS:
*       None
*
*******************************************************************************/
GT_STATUS osSemWait(GT_SEM smid, GT_U32 timeOut)
{
#ifdef _VXWORKS
    STATUS rc;

    if (timeOut == 0)
    rc = semTake ((SEM_ID) smid, WAIT_FOREVER);
    else
    {
        int num, delay;

        num = sysClkRateGet();
        delay = (num * timeOut) / 1000;
        if (delay < 1)
            rc = semTake ((SEM_ID) smid, 1);
        else
            rc = semTake ((SEM_ID) smid, delay);
    }

    if (rc != OK)
    {
        if (errno == S_objLib_OBJ_TIMEOUT)
            return GT_TIMEOUT;
        else
            return GT_FAIL;
    }

#elif defined(WIN32)
    DWORD rc;

    rc = WaitForSingleObject((HANDLE)smid, timeOut);

    if (rc == WAIT_ABANDONED)
        return GT_FAIL;
    if (rc == WAIT_TIMEOUT)
        return GT_TIMEOUT;

#elif defined(LINUX)
    sem_wait((semaphore*) smid) ;
#else
    return GT_OK;

#endif

    return GT_OK;
}

/*******************************************************************************
* osSemSignal
*
* DESCRIPTION:
*       Signal a semaphore.
*
* INPUTS:
*       smid    - semaphore Id
*
* OUTPUTS:
*       None
*
* RETURNS:
*       GT_OK   - on success
*       GT_FAIL - on error
*
* COMMENTS:
*       None
*
*******************************************************************************/
GT_STATUS osSemSignal(GT_SEM smid)
{
#ifdef _VXWORKS
    STATUS rc;
    rc = semGive ((SEM_ID) smid);
    if (rc != OK)
        return GT_FAIL;

#elif defined(WIN32)
    if(ReleaseSemaphore((HANDLE) smid, 1, NULL) == 0)
        return GT_FAIL;

#elif defined(LINUX)
    sem_post((semaphore*) smid) ;
#else
    return GT_OK;
#endif
    return GT_OK;
}
