www.pudn.com > fsm.rar > port_sema.c


/*
  The oSIP library implements the Session Initiation Protocol (SIP -rfc2543-)
  Copyright (C) 2001  Aymeric MOIZARD jack@atosc.org
  
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  
  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
  
  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

#ifdef OSIP_MT

#include 
#include 

#include 
#include 

/* Posix Thread API (use pthread.h) */
#if defined(THREAD_PTHREAD) && !defined(__VXWORKS_OS__)
smutex_t * smutex_init() {
  smutex_t *mut = (smutex_t *)smalloc(sizeof(smutex_t));
  pthread_mutex_init(mut, NULL);
  return mut;
}
void smutex_destroy(smutex_t *mut) { pthread_mutex_destroy(mut); }
int  smutex_lock(smutex_t *mut) {
  int i;
  i = pthread_mutex_lock(mut);
  if (i!=0)
    {
      fprintf(stdout, "ERROR while locking !!%i",i);
      if (i==EINVAL) fprintf(stdout, "ERROR while locking EINVAL!!");
      if (i==EDEADLK) fprintf(stdout, "ERROR while locking EDEADLK!!");
      if (i==EBUSY) fprintf(stdout, "ERROR while locking EBUSY!!");
      if (i==EINVAL) fprintf(stdout, "ERROR while locking EINVAL!!");
      return i;
    }
  return 0;
}

int smutex_unlock(smutex_t *mut) { return pthread_mutex_unlock(mut); }

/* Counting Semaphore is initialized to value */
ssem_t *ssem_init(unsigned int value) {
  ssem_t *sem = (ssem_t *)smalloc(sizeof(ssem_t));
  if (sem_init(sem, 0, value)==0) return sem;
  sfree(sem);
  return NULL;
}
int ssem_destroy(ssem_t *sem)           { return sem_destroy(sem); }
int ssem_post(ssem_t *sem)              { return sem_post(sem); }
int ssem_wait(ssem_t *sem)              { return sem_wait(sem); }
int ssem_trywait(ssem_t *sem)           { return sem_trywait(sem); }
#endif

#if defined(THREAD_PTH) && !defined(__VXWORKS_OS__)
smutex_t * smutex_init() {
  smutex_t *mut = (smutex_t *)smalloc(sizeof(smutex_t));
  pth_rwlock_init(mut);
  return mut;
}
void smutex_destroy(smutex_t *mut) { /* pth_mutex_destroy(mut);???? */ }
int  smutex_lock(smutex_t *mut) {
  int i;
  i = pth_rwlock_acquire(mut,PTH_RWLOCK_RW,FALSE,NULL);
  if (i==0)
    {
      fprintf(stdout, "ERROR while locking !!%i",errno);
      if (errno==EINVAL) fprintf(stdout, "ERROR while locking EINVAL!!");
      if (errno==EDEADLK) fprintf(stdout, "ERROR while locking EDEADLK!!");
      if (errno==EBUSY) fprintf(stdout, "ERROR while locking EBUSY!!");
      if (errno==EINVAL) fprintf(stdout, "ERROR while locking EINVAL!!");
      return errno;
    }
  return 0;
}

int smutex_unlock(smutex_t *mut)
{ return pth_rwlock_release(mut); }

/* Counting Semaphore is initialized to value */
ssem_t *ssem_init(unsigned int value) {
  ssem_t *sem = (ssem_t *)smalloc(sizeof(ssem_t));
  if (pth_mutex_init(sem)==0) return sem;
  sfree(sem);
  return NULL;
}
/* this method does not exist?? */
int ssem_destroy(ssem_t *sem)           { return 0; /* sem_destroy(sem);????? */ }
int ssem_post(ssem_t *sem)              { return pth_mutex_acquire(sem,TRUE,NULL); }
int ssem_wait(ssem_t *sem)              { return pth_mutex_release(sem); }
int ssem_trywait(ssem_t *sem)           { return pth_mutex_acquire(sem,FALSE,NULL); }

#endif



/* use VxWorks implementation */
#if defined(__VXWORKS_OS__) && defined(THREAD_PTHREAD)
smutex_t *smutex_init()                 { return semMCreate(0); }
void      smutex_destroy(smutex_t *mut) { semDelete(mut); }
int       smutex_lock(smutex_t *mut)    { return semTake(mut,WAIT_FOREVER); }
int       smutex_unlock(smutex_t *mut)  { return semGive(mut); }
#endif

#ifdef __VXWORKS_OS__
/* Counting Semaphore is initialized to value */
ssem_t *  ssem_init(unsigned int value) { return semCCreate(SEM_Q_FIFO,value); }
int       ssem_destroy(ssem_t *sem)     { semDelete(sem); return 0; }
int       ssem_post(ssem_t *sem)        { return semGive(sem); }
int       ssem_wait(ssem_t *sem)        { return semTake(sem,WAIT_FOREVER); }
int       ssem_trywait(ssem_t *sem)     { return semTake(sem,NO_WAIT); }
#endif

#ifdef WIN32
#include 
smutex_t *smutex_init()
{
  smutex_t *mut = (smutex_t *)smalloc(sizeof(smutex_t));

  if ((mut->h = CreateMutex(NULL, FALSE, NULL)) != NULL) {
     return(mut);
  }

  sfree(mut);
  return(NULL);
}

void smutex_destroy(smutex_t *mut)
{
  CloseHandle(mut->h);
}

int smutex_lock(smutex_t *mut)
{
  DWORD err;

  if ((err = WaitForSingleObject(mut->h, INFINITE)) == WAIT_OBJECT_0) {
      return(0);
  }

  if (err == WAIT_TIMEOUT) {
      return(EBUSY);
  }

  return(EBUSY);
}

int smutex_unlock(smutex_t *mut)
{
  ReleaseMutex(mut->h);

  return(0);
}

ssem_t *ssem_init(unsigned int value)
{
  ssem_t *sem = (ssem_t *)smalloc(sizeof(ssem_t));
  
  if ((sem->h = CreateSemaphore(NULL, value, LONG_MAX, NULL)) != NULL) {
      return(sem);
  }
  
  sfree(sem);
  return(NULL);
}

int ssem_destroy(ssem_t *sem)
{
  CloseHandle(sem->h);
  
  return(0);
}

int ssem_post(ssem_t *sem)
{
  ReleaseSemaphore(sem->h, 1, NULL);

  return(0);
}

int ssem_wait(ssem_t *sem)
{
  DWORD err;

  if ((err = WaitForSingleObject(sem->h, INFINITE)) == WAIT_OBJECT_0) {
      return(0);
  }

  if (err == WAIT_TIMEOUT) {
      return(EBUSY);
  }

  return(EBUSY);
}

int ssem_trywait(ssem_t *sem)
{
  DWORD err;

  if ((err = WaitForSingleObject(sem->h, 0)) == WAIT_TIMEOUT) {
      return(-1);
  }

  if (err == WAIT_TIMEOUT) {
      return(0);
  }

  return(EBUSY);
}
#endif

#ifdef __PSOS__
smutex_t *smutex_init()
{
  smutex_t *mut = (smutex_t *)smalloc(sizeof(smutex_t));
  
   if (sm_create("mut", 1, 0, &mut->id) == 0)
      return(mut);
  
  sfree(mut);
  return(NULL);
}

void smutex_destroy(smutex_t *mut)
{
  if (mut) {
    sm_delete(mut->id);
    sfree(mut);
  }
}

int smutex_lock(smutex_t *mut)
{
  if (mut) {
    if (sm_p(mut->id, SM_WAIT, 0) != 0)
        return(-1);
  }

  return(0);
}

int smutex_unlock(smutex_t *mut)
{
  if (mut) {
    sm_v(mut->id);
  }

  return(0);
}

ssem_t *ssem_init(unsigned int value)
{
  ssem_t *sem = (ssem_t *)smalloc(sizeof(ssem_t));
  
  if (sm_create("sem", value, 0, &sem->id) == 0)
      return(sem);
  
  sfree(sem);
  return(NULL);
}

int ssem_destroy(ssem_t *sem)
{
  sm_delete(sem->id);
  sfree(sem);

  return(0);
}

int ssem_post(ssem_t *sem)
{
  return(sm_v(sem->id));
}

int ssem_wait(ssem_t *sem)
{
  if (sm_p(sem->id, SM_WAIT, 0) != 0)
      return(-1);
  return(0);
}

int ssem_trywait(ssem_t *sem)
{
  if (sm_p(sem->id, SM_NOWAIT, 0) != 0)
      return(-1);
  return(0);
}
#endif

#endif