Add mzrt_sema_trywait to the mzrt library.

This commit add mzrt_sema_try_wait to the functions that operate
on semaphores. The existing ones are:

* int mzrt_sema_create(mzrt_sema **sema, int init);
* int mzrt_sema_post(mzrt_sema *sema);
* int mzrt_sema_wait(mzrt_sema *sema);
* int mzrt_sema_destroy(mzrt_sema *sema);
This commit is contained in:
Leif Andersen 2017-06-05 10:46:24 -04:00 committed by GitHub
parent 40d4a35329
commit 5c27f5550c
2 changed files with 18 additions and 0 deletions

View File

@ -598,6 +598,18 @@ int mzrt_sema_wait(mzrt_sema *s)
return 0;
}
int mzrt_sema_trywait(mzrt_sema *s)
{
int locked = 1;
pthread_mutex_lock(&s->m);
if(s->ready) {
--s->ready;
locked = 0;
}
pthread_mutex_unlock(&s->m);
return locked;
}
int mzrt_sema_post(mzrt_sema *s)
{
pthread_mutex_lock(&s->m);
@ -810,6 +822,11 @@ int mzrt_sema_wait(mzrt_sema *s)
return 0;
}
int mzrt_sema_trywait(mzrt_sema *s)
{
return WaitForSingleObject(s->ws, 0);
}
int mzrt_sema_post(mzrt_sema *s)
{
ReleaseSemaphore(s->ws, 1, NULL);

View File

@ -86,6 +86,7 @@ typedef struct mzrt_sema mzrt_sema; /* OPAQUE DEFINITION */
int mzrt_sema_create(mzrt_sema **sema, int init);
int mzrt_sema_post(mzrt_sema *sema);
int mzrt_sema_wait(mzrt_sema *sema);
int mzrt_sema_trywait(mzrt_sema *sema);
int mzrt_sema_destroy(mzrt_sema *sema);
/****************** Compare and Swap *******************************/