diff options
| -rw-r--r-- | src/thread/cnd_broadcast.c | 10 | ||||
| -rw-r--r-- | src/thread/cnd_destroy.c | 6 | ||||
| -rw-r--r-- | src/thread/cnd_init.c | 7 | ||||
| -rw-r--r-- | src/thread/cnd_signal.c | 10 | ||||
| -rw-r--r-- | src/thread/cnd_timedwait.c | 15 | ||||
| -rw-r--r-- | src/thread/cnd_wait.c | 9 | 
6 files changed, 57 insertions, 0 deletions
| 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 <threads.h> + +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 <threads.h> + +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 <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 00000000..1211260b --- /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 *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 <threads.h> +#include <errno.h> + +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 <threads.h> + +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); +} | 
