blob: 555c76e849d8e27de0e7946216a8ca475d289159 [file] [log] [blame]
#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;
}