From 5c27f5550c12edf7605d8714f6870f4a706bd500 Mon Sep 17 00:00:00 2001 From: Leif Andersen Date: Mon, 5 Jun 2017 10:46:24 -0400 Subject: [PATCH] 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); --- racket/src/racket/src/mzrt.c | 17 +++++++++++++++++ racket/src/racket/src/mzrt.h | 1 + 2 files changed, 18 insertions(+) diff --git a/racket/src/racket/src/mzrt.c b/racket/src/racket/src/mzrt.c index 1807d69b6c..c351b27ee9 100644 --- a/racket/src/racket/src/mzrt.c +++ b/racket/src/racket/src/mzrt.c @@ -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); diff --git a/racket/src/racket/src/mzrt.h b/racket/src/racket/src/mzrt.h index 2eee24a79a..163025921b 100644 --- a/racket/src/racket/src/mzrt.h +++ b/racket/src/racket/src/mzrt.h @@ -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 *******************************/