|
Message-Id: <92a8085e31df9f3e313583980256ae38746f3d3f.1409524413.git.Jens.Gustedt@inria.fr> Date: Mon, 01 Sep 2014 00:47:10 +0200 From: Jens Gustedt <Jens.Gustedt@...ia.fr> To: musl@...ts.openwall.com Subject: [PATCH 6/9] add the functions for cnd_t Because of the clear separation for private pthread_cond_t these interfaces are quite simple and direct. --- src/thread/cnd_broadcast.c | 10 ++++++++++ src/thread/cnd_destroy.c | 5 +++++ src/thread/cnd_init.c | 7 +++++++ src/thread/cnd_signal.c | 10 ++++++++++ src/thread/cnd_timedwait.c | 14 ++++++++++++++ src/thread/cnd_wait.c | 10 ++++++++++ 6 files changed, 56 insertions(+) create mode 100644 src/thread/cnd_broadcast.c create mode 100644 src/thread/cnd_destroy.c create mode 100644 src/thread/cnd_init.c create mode 100644 src/thread/cnd_signal.c create mode 100644 src/thread/cnd_timedwait.c create mode 100644 src/thread/cnd_wait.c diff --git a/src/thread/cnd_broadcast.c b/src/thread/cnd_broadcast.c new file mode 100644 index 0000000..c8cf311 --- /dev/null +++ b/src/thread/cnd_broadcast.c @@ -0,0 +1,10 @@ +#include <threads.h> + +int __private_cond_signal(cnd_t *, int); + +int cnd_broadcast(cnd_t * cnd) { + /* This internal function never fails, so it always returns + * 0. Under the assumption that thrd_success is 0 this is a + * tail call. */ + return __private_cond_signal(cnd, -1); +} diff --git a/src/thread/cnd_destroy.c b/src/thread/cnd_destroy.c new file mode 100644 index 0000000..d960db6 --- /dev/null +++ b/src/thread/cnd_destroy.c @@ -0,0 +1,5 @@ +#include <threads.h> + +void cnd_destroy(cnd_t *cnd) { + /* For private cv this is a no-op */ +} diff --git a/src/thread/cnd_init.c b/src/thread/cnd_init.c new file mode 100644 index 0000000..618b649 --- /dev/null +++ b/src/thread/cnd_init.c @@ -0,0 +1,7 @@ +#include <threads.h> + +int cnd_init(cnd_t * c) +{ + *c = (cnd_t){ 0 }; + return thrd_success; +} diff --git a/src/thread/cnd_signal.c b/src/thread/cnd_signal.c new file mode 100644 index 0000000..c31282f --- /dev/null +++ b/src/thread/cnd_signal.c @@ -0,0 +1,10 @@ +#include <threads.h> + +int __private_cond_signal(cnd_t *, int); + +int cnd_signal(cnd_t * cnd) { + /* This internal function never fails, so it always returns + * 0. Under the assumption that thrd_success is 0 this is a + * tail call. */ + return __private_cond_signal(cnd, 1); +} diff --git a/src/thread/cnd_timedwait.c b/src/thread/cnd_timedwait.c new file mode 100644 index 0000000..d69a4f1 --- /dev/null +++ b/src/thread/cnd_timedwait.c @@ -0,0 +1,14 @@ +#include <threads.h> +#include <errno.h> + +int __pthread_cond_timedwait(cnd_t *restrict c, mtx_t *restrict m, const struct timespec *restrict ts); + +int cnd_timedwait(cnd_t *restrict cond, mtx_t *restrict mutex, const struct timespec *restrict ts) { + int ret = __pthread_cond_timedwait(cond, mutex, ts); + switch (ret) { + /* May also return EINVAL or EPERM. */ + default: return thrd_error; + case 0: return thrd_success; + case ETIMEDOUT: return thrd_timedout; + } +} diff --git a/src/thread/cnd_wait.c b/src/thread/cnd_wait.c new file mode 100644 index 0000000..91e89db --- /dev/null +++ b/src/thread/cnd_wait.c @@ -0,0 +1,10 @@ +#include <threads.h> + +int cnd_wait(cnd_t *cond, mtx_t *mutex) +{ + /* Calling cnd_timedwait with a null pointer is an + extension. Such a call is convenient, here since it avoids to + repeat the case analysis that is already done for + cnd_timedwait. */ + return cnd_timedwait(cond, mutex, 0); +} -- 1.7.10.4
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.