From: Jens Gustedt Date: Sun, 7 Sep 2014 02:27:45 +0000 (-0400) Subject: add C11 condition variable functions X-Git-Tag: v1.1.5~26 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=14397cec2c8429b504b17aaf92509b48da3681b9;p=oweals%2Fmusl.git add C11 condition variable functions Because of the clear separation for private pthread_cond_t these interfaces are quite simple and direct. --- 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); +}