From 14397cec2c8429b504b17aaf92509b48da3681b9 Mon Sep 17 00:00:00 2001 From: Jens Gustedt Date: Sat, 6 Sep 2014 22:27:45 -0400 Subject: add C11 condition variable functions 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 | 6 ++++++ src/thread/cnd_init.c | 7 +++++++ src/thread/cnd_signal.c | 10 ++++++++++ src/thread/cnd_timedwait.c | 15 +++++++++++++++ src/thread/cnd_wait.c | 9 +++++++++ 6 files changed, 57 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 (limited to 'src/thread') diff --git a/src/thread/cnd_broadcast.c b/src/thread/cnd_broadcast.c new file mode 100644 index 00000000..85d4d3ea --- /dev/null +++ b/src/thread/cnd_broadcast.c @@ -0,0 +1,10 @@ +#include + +int __private_cond_signal(cnd_t *, int); + +int cnd_broadcast(cnd_t *c) +{ + /* This internal function never fails, and always returns zero, + * which matches the value thrd_success is defined with. */ + return __private_cond_signal(c, -1); +} diff --git a/src/thread/cnd_destroy.c b/src/thread/cnd_destroy.c new file mode 100644 index 00000000..453c90be --- /dev/null +++ b/src/thread/cnd_destroy.c @@ -0,0 +1,6 @@ +#include + +void cnd_destroy(cnd_t *c) +{ + /* 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 00000000..18c50855 --- /dev/null +++ b/src/thread/cnd_init.c @@ -0,0 +1,7 @@ +#include + +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 00000000..1211260b --- /dev/null +++ b/src/thread/cnd_signal.c @@ -0,0 +1,10 @@ +#include + +int __private_cond_signal(cnd_t *, int); + +int cnd_signal(cnd_t *c) +{ + /* This internal function never fails, and always returns zero, + * which matches the value thrd_success is defined with. */ + return __private_cond_signal(c, 1); +} diff --git a/src/thread/cnd_timedwait.c b/src/thread/cnd_timedwait.c new file mode 100644 index 00000000..59976793 --- /dev/null +++ b/src/thread/cnd_timedwait.c @@ -0,0 +1,15 @@ +#include +#include + +int __pthread_cond_timedwait(cnd_t *restrict, mtx_t *restrict, const struct timespec *restrict); + +int cnd_timedwait(cnd_t *restrict c, mtx_t *restrict m, const struct timespec *restrict ts) +{ + int ret = __pthread_cond_timedwait(c, m, 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 00000000..602796f8 --- /dev/null +++ b/src/thread/cnd_wait.c @@ -0,0 +1,9 @@ +#include + +int cnd_wait(cnd_t *c, mtx_t *m) +{ + /* Calling cnd_timedwait with a null pointer is an extension. + * It is convenient here to avoid duplication of the logic + * for return values. */ + return cnd_timedwait(c, m, 0); +} -- cgit v1.2.1