📄 port_sema.c
字号:
}intosip_sem_post (struct osip_sem *_sem){ osip_sem_t *sem = (osip_sem_t *) _sem; if (sem == NULL) return OSIP_BADPARAMETER; return semGive (sem->semId);}intosip_sem_wait (struct osip_sem *_sem){ osip_sem_t *sem = (osip_sem_t *) _sem; if (sem == NULL) return OSIP_BADPARAMETER; return semTake (sem->semId, WAIT_FOREVER);}intosip_sem_trywait (struct osip_sem *_sem){ osip_sem_t *sem = (osip_sem_t *) _sem; if (sem == NULL) return OSIP_BADPARAMETER; return semTake (sem->semId, NO_WAIT);}#endif#if (defined(WIN32) || defined(_WIN32_WCE)) && !defined(HAVE_PTHREAD_WIN32)#include <limits.h>#if (_WIN32_WINNT >= 0x0403) && !defined(_WIN32_WCE)struct osip_mutex *osip_mutex_init (){ osip_mutex_t *mut = (osip_mutex_t *) osip_malloc (sizeof (osip_mutex_t)); if (mut == NULL) return NULL; if (InitializeCriticalSectionAndSpinCount (&mut->h, OSIP_CRITICALSECTION_SPIN) != 0) return (struct osip_mutex *) (mut); osip_free (mut); return (NULL);}voidosip_mutex_destroy (struct osip_mutex *_mut){ osip_mutex_t *mut = (osip_mutex_t *) _mut; if (mut == NULL) return; DeleteCriticalSection (&mut->h); osip_free (mut);}intosip_mutex_lock (struct osip_mutex *_mut){ osip_mutex_t *mut = (osip_mutex_t *) _mut; if (mut == NULL) return OSIP_BADPARAMETER; EnterCriticalSection (&mut->h); return (0);}intosip_mutex_unlock (struct osip_mutex *_mut){ osip_mutex_t *mut = (osip_mutex_t *) _mut; if (mut == NULL) return OSIP_BADPARAMETER; LeaveCriticalSection (&mut->h); return (0);}#elsestruct osip_mutex *osip_mutex_init (){ osip_mutex_t *mut = (osip_mutex_t *) osip_malloc (sizeof (osip_mutex_t)); if (mut == NULL) return NULL; if ((mut->h = CreateMutex (NULL, FALSE, NULL)) != NULL) return (struct osip_mutex *) (mut); osip_free (mut); return (NULL);}voidosip_mutex_destroy (struct osip_mutex *_mut){ osip_mutex_t *mut = (osip_mutex_t *) _mut; if (mut == NULL) return; CloseHandle (mut->h); osip_free (mut);}intosip_mutex_lock (struct osip_mutex *_mut){ DWORD err; osip_mutex_t *mut = (osip_mutex_t *) _mut; if (mut == NULL) return OSIP_BADPARAMETER; if ((err = WaitForSingleObject (mut->h, INFINITE)) == WAIT_OBJECT_0) return (0); return (EBUSY);}intosip_mutex_unlock (struct osip_mutex *_mut){ osip_mutex_t *mut = (osip_mutex_t *) _mut; if (mut == NULL) return OSIP_BADPARAMETER; ReleaseMutex (mut->h); return (0);}#endifstruct osip_sem *osip_sem_init (unsigned int value){ osip_sem_t *sem = (osip_sem_t *) osip_malloc (sizeof (osip_sem_t)); if (sem == NULL) return NULL; if ((sem->h = CreateSemaphore (NULL, value, LONG_MAX, NULL)) != NULL) return (struct osip_sem *) (sem); osip_free (sem); return (NULL);}intosip_sem_destroy (struct osip_sem *_sem){ osip_sem_t *sem = (osip_sem_t *) _sem; if (sem == NULL) return OSIP_SUCCESS; CloseHandle (sem->h); osip_free (sem); return (0);}intosip_sem_post (struct osip_sem *_sem){ osip_sem_t *sem = (osip_sem_t *) _sem; if (sem == NULL) return OSIP_BADPARAMETER; ReleaseSemaphore (sem->h, 1, NULL); return (0);}intosip_sem_wait (struct osip_sem *_sem){ DWORD err; osip_sem_t *sem = (osip_sem_t *) _sem; if (sem == NULL) return OSIP_BADPARAMETER; if ((err = WaitForSingleObject (sem->h, INFINITE)) == WAIT_OBJECT_0) return (0); if (err == WAIT_TIMEOUT) return (EBUSY); return (EBUSY);}intosip_sem_trywait (struct osip_sem *_sem){ DWORD err; osip_sem_t *sem = (osip_sem_t *) _sem; if (sem == NULL) return OSIP_BADPARAMETER; if ((err = WaitForSingleObject (sem->h, 0)) == WAIT_OBJECT_0) return (0); return (EBUSY);}#endif#ifdef __PSOS__struct osip_mutex *osip_mutex_init (){ osip_mutex_t *mut = (osip_mutex_t *) osip_malloc (sizeof (osip_mutex_t)); if (sm_create ("mut", 1, 0, &mut->id) == 0) return (struct osip_mutex *) (mut); osip_free (mut); return (NULL);}voidosip_mutex_destroy (struct osip_mutex *_mut){ osip_mutex_t *mut = (osip_mutex_t *) _mut; if (mut) { sm_delete (mut->id); osip_free (mut); }}intosip_mutex_lock (struct osip_mutex *_mut){ osip_mutex_t *mut = (osip_mutex_t *) _mut; if (mut) { if (sm_p (mut->id, SM_WAIT, 0) != 0) return OSIP_UNDEFINED_ERROR; } return (0);}intosip_mutex_unlock (struct osip_mutex *_mut){ osip_mutex_t *mut = (osip_mutex_t *) _mut; if (mut) { sm_v (mut->id); } return (0);}struct osip_sem *osip_sem_init (unsigned int value){ osip_sem_t *sem = (osip_sem_t *) osip_malloc (sizeof (osip_sem_t)); if (sm_create ("sem", value, 0, &sem->id) == 0) return (struct osip_sem *) (sem); osip_free (sem); return (NULL);}intosip_sem_destroy (struct osip_sem *_sem){ osip_sem_t *sem = (osip_sem_t *) _sem; if (sem == NULL) return OSIP_SUCCESS; sm_delete (sem->id); osip_free (sem); return (0);}intosip_sem_post (struct osip_sem *_sem){ osip_sem_t *sem = (osip_sem_t *) _sem; if (sem == NULL) return OSIP_BADPARAMETER; return (sm_v (sem->id));}intosip_sem_wait (struct osip_sem *_sem){ osip_sem_t *sem = (osip_sem_t *) _sem; if (sem == NULL) return OSIP_BADPARAMETER; if (sm_p (sem->id, SM_WAIT, 0) != 0) return (-1); return (0);}intosip_sem_trywait (struct osip_sem *_sem){ osip_sem_t *sem = (osip_sem_t *) _sem; if (sem == NULL) return OSIP_BADPARAMETER; if (sm_p (sem->id, SM_NOWAIT, 0) != 0) return OSIP_UNDEFINED_ERROR; return (0);}#endif#if defined(__rtems__)struct osip_mutex *osip_mutex_init(){ rtems_status_code status; osip_mutex_t *mut = (osip_mutex_t *) osip_malloc(sizeof(osip_mutex_t)); status = rtems_semaphore_create( rtems_build_name( 's','i','p','M'), 1, /* Count */ RTEMS_SIMPLE_BINARY_SEMAPHORE , 0, &mut->id); if ( status == RTEMS_SUCCESSFUL ) { return (struct osip_mutex *) (mut); } osip_free(mut); return (NULL);}void osip_mutex_destroy(struct osip_mutex *_mut){ osip_mutex_t *mut = (osip_mutex_t *) _mut; if ( mut != NULL ) { rtems_semaphore_delete(mut->id); osip_free(mut); }}int osip_mutex_lock(struct osip_mutex *_mut){ rtems_status_code status; osip_mutex_t *mut = (osip_mutex_t *) _mut; if ( mut != NULL) { status = rtems_semaphore_obtain( mut->id, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if ( status != RTEMS_SUCCESSFUL ) { return OSIP_UNDEFINED_ERROR; } } return OSIP_SUCCESS;}int osip_mutex_unlock(struct osip_mutex *_mut){ osip_mutex_t *mut = (osip_mutex_t *) _mut; if ( mut != NULL ) { (void) rtems_semaphore_release( mut->id); } return (0);}struct osip_sem *osip_sem_init(unsigned int value){ rtems_status_code status; osip_sem_t *sem = (osip_sem_t *) osip_malloc (sizeof (osip_sem_t)); status = rtems_semaphore_create( rtems_build_name('s','i','p','S'), value, RTEMS_COUNTING_SEMAPHORE, 0, &sem->id); if ( status == RTEMS_SUCCESSFUL ) { return (struct osip_sem *) (sem); } osip_free (sem); return (NULL);}int osip_sem_destroy(struct osip_sem *_sem){ osip_sem_t *sem = (osip_sem_t *) _sem; if (sem == NULL) { return OSIP_SUCCESS; } rtems_semaphore_delete(sem->id); osip_free (sem); return (0);}int osip_sem_post(struct osip_sem *_sem){ osip_sem_t *sem = (osip_sem_t *) _sem; if (sem == NULL) { return OSIP_UNDEFINED_ERROR; } return rtems_semaphore_release( sem->id);}int osip_sem_wait(struct osip_sem *_sem){ osip_sem_t *sem = (osip_sem_t *) _sem; if (sem == NULL) { return OSIP_BADPARAMETER; } if ( rtems_semaphore_obtain( sem->id, RTEMS_WAIT, RTEMS_NO_TIMEOUT) != RTEMS_SUCCESSFUL ) { return OSIP_UNDEFINED_ERROR; } return (0);}int osip_sem_trywait(struct osip_sem *_sem){ osip_sem_t *sem = (osip_sem_t *) _sem; if (sem == NULL) { return OSIP_BADPARAMETER; } if ( rtems_semaphore_obtain( sem->id,RTEMS_NO_WAIT, 0) != RTEMS_SUCCESSFUL) { return OSIP_UNDEFINED_ERROR; } return (0);}#endif #endif /* #ifdef OSIP_MT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -