From 9628207066e1fc6d3666fdb085ba7c8bc75b94c7 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Mon, 9 Dec 2013 23:11:47 +1100 Subject: [PATCH] Provide a helper function that can reset cgsems to zero. --- util.c | 28 ++++++++++++++++++++++++++++ util.h | 1 + 2 files changed, 29 insertions(+) diff --git a/util.c b/util.c index 78cc7aaa..b5b1c762 100644 --- a/util.c +++ b/util.c @@ -2599,6 +2599,25 @@ int _cgsem_mswait(cgsem_t *cgsem, int ms, const char *file, const char *func, co /* We don't reach here */ return 0; } + +/* Reset semaphore count back to zero */ +void cgsem_reset(cgsem_t *cgsem) +{ + int ret, fd; + fd_set rd; + char buf; + + fd = cgsem->pipefd[0]; + FD_ZERO(&rd); + FD_SET(fd, &rd); + do { + struct timeval timeout = {0, 0}; + + ret = select(fd + 1, &rd, NULL, NULL, &timeout); + if (ret > 0) + ret = read(fd, &buf, 1); + } while (ret > 0); +} #else void _cgsem_init(cgsem_t *cgsem, const char *file, const char *func, const int line) { @@ -2639,6 +2658,15 @@ int _cgsem_mswait(cgsem_t *cgsem, int ms, const char *file, const char *func, co return 0; } +void cgsem_reset(cgsem_t *cgsem) +{ + int ret; + + do { + ret = sem_trywait(cgsem); + } while (!ret); +} + void cgsem_destroy(cgsem_t *cgsem) { sem_destroy(cgsem); diff --git a/util.h b/util.h index d3596566..90b1ca90 100644 --- a/util.h +++ b/util.h @@ -138,6 +138,7 @@ void _cgsem_init(cgsem_t *cgsem, const char *file, const char *func, const int l void _cgsem_post(cgsem_t *cgsem, const char *file, const char *func, const int line); void _cgsem_wait(cgsem_t *cgsem, const char *file, const char *func, const int line); int _cgsem_mswait(cgsem_t *cgsem, int ms, const char *file, const char *func, const int line); +void cgsem_reset(cgsem_t *cgsem); void cgsem_destroy(cgsem_t *cgsem); bool cg_completion_timeout(void *fn, void *fnarg, int timeout);