|
Message-Id: <64bad51d35eea337b8d998a1a2165c5adc440e1d.1409423162.git.Jens.Gustedt@inria.fr> Date: Sat, 30 Aug 2014 20:47:22 +0200 From: Jens Gustedt <Jens.Gustedt@...ia.fr> To: musl@...ts.openwall.com Subject: [PATCH 6/8] 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 | 9 +++++++++ src/thread/cnd_destroy.c | 5 +++++ src/thread/cnd_init.c | 9 +++++++++ src/thread/cnd_signal.c | 9 +++++++++ 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..cf52f6d --- /dev/null +++ b/src/thread/cnd_broadcast.c @@ -0,0 +1,9 @@ +#include <threads.h> + +int __private_cond_signal(cnd_t *, int); + +int cnd_broadcast(cnd_t * cnd) { + /* This internal function never fails. */ + (void)__private_cond_signal(cnd, -1); + return thrd_success; +} diff --git a/src/thread/cnd_destroy.c b/src/thread/cnd_destroy.c new file mode 100644 index 0000000..7c24d1a --- /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..c8aaee5 --- /dev/null +++ b/src/thread/cnd_init.c @@ -0,0 +1,9 @@ +#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..143883c --- /dev/null +++ b/src/thread/cnd_signal.c @@ -0,0 +1,9 @@ +#include <threads.h> + +int __private_cond_signal(cnd_t *, int); + +int cnd_signal(cnd_t * cnd) { + /* This internal function never fails. */ + (void)__private_cond_signal(cnd, 1); + return thrd_success; +} 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.