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 *******************************/