From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/6027 Path: news.gmane.org!not-for-mail From: Jens Gustedt Newsgroups: gmane.linux.lib.musl.general Subject: [PATCH 6/9] add the functions for cnd_t Date: Mon, 01 Sep 2014 00:47:10 +0200 Message-ID: <92a8085e31df9f3e313583980256ae38746f3d3f.1409524413.git.Jens.Gustedt@inria.fr> References: Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1409525231 19452 80.91.229.3 (31 Aug 2014 22:47:11 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 31 Aug 2014 22:47:11 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-6034-gllmg-musl=m.gmane.org@lists.openwall.com Mon Sep 01 00:47:04 2014 Return-path: Envelope-to: gllmg-musl@plane.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1XODtm-0005H9-Bn for gllmg-musl@plane.gmane.org; Mon, 01 Sep 2014 00:47:02 +0200 Original-Received: (qmail 13893 invoked by uid 550); 31 Aug 2014 22:47:01 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 13883 invoked from network); 31 Aug 2014 22:47:01 -0000 X-IronPort-AV: E=Sophos;i="5.04,438,1406584800"; d="scan'208";a="92390682" In-Reply-To: Resent-From: Jens Gustedt Resent-To: musl@lists.openwall.com X-Mailer: Evolution 3.4.4-3 Xref: news.gmane.org gmane.linux.lib.musl.general:6027 Archived-At: 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 + +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 + +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 + +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 + +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 +#include + +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 + +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