From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/10011 Path: news.gmane.org!not-for-mail From: Bobby Bingham Newsgroups: gmane.linux.lib.musl.general Subject: [PATCH v3] pthread: implement try/timed join variants Date: Sat, 7 May 2016 13:48:21 -0500 Message-ID: <1462646901-16748-1-git-send-email-koorogi@koorogi.info> References: <1443988530-23978-2-git-send-email-koorogi@koorogi.info> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org X-Trace: ger.gmane.org 1462646938 11505 80.91.229.3 (7 May 2016 18:48:58 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 7 May 2016 18:48:58 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-10024-gllmg-musl=m.gmane.org@lists.openwall.com Sat May 07 20:48:53 2016 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1az7HT-0007y5-IE for gllmg-musl@m.gmane.org; Sat, 07 May 2016 20:48:47 +0200 Original-Received: (qmail 4049 invoked by uid 550); 7 May 2016 18:48:44 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Original-Received: (qmail 4017 invoked from network); 7 May 2016 18:48:40 -0000 X-Mailer: git-send-email 2.8.1 In-Reply-To: <1443988530-23978-2-git-send-email-koorogi@koorogi.info> Xref: news.gmane.org gmane.linux.lib.musl.general:10011 Archived-At: --- In the interest of unstalling this, here's a new, less invasive version. In the previous patch, timejoin waited for the thread to exit, and tail called to tryjoin which cleaned up after the thread and retrieved the thread result. The regular join was just a timedjoin with an infinite timeout. Now, timedjoin has all the logic for waiting, cleaning up after the thread, and retrieving the result. Regular join is still just a timedjoin with an infinite timeout. However, tryjoin now just checks if the thread has exited and either returns EBUSY or calls join, depending. include/pthread.h | 2 ++ src/thread/pthread_join.c | 20 +++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/include/pthread.h b/include/pthread.h index af70b73..3d2e0c4 100644 --- a/include/pthread.h +++ b/include/pthread.h @@ -214,6 +214,8 @@ struct cpu_set_t; int pthread_getaffinity_np(pthread_t, size_t, struct cpu_set_t *); int pthread_setaffinity_np(pthread_t, size_t, const struct cpu_set_t *); int pthread_getattr_np(pthread_t, pthread_attr_t *); +int pthread_tryjoin_np(pthread_t, void **); +int pthread_timedjoin_np(pthread_t, void **, const struct timespec *); #endif #ifdef __cplusplus diff --git a/src/thread/pthread_join.c b/src/thread/pthread_join.c index 694d377..5211148 100644 --- a/src/thread/pthread_join.c +++ b/src/thread/pthread_join.c @@ -5,18 +5,32 @@ int __munmap(void *, size_t); void __pthread_testcancel(void); int __pthread_setcancelstate(int, int *); -int __pthread_join(pthread_t t, void **res) +int __pthread_timedjoin_np(pthread_t t, void **res, const struct timespec *at) { - int tmp, cs; + int tmp, cs, r = 0; __pthread_testcancel(); __pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); if (cs == PTHREAD_CANCEL_ENABLE) __pthread_setcancelstate(cs, 0); - while ((tmp = t->tid)) __timedwait_cp(&t->tid, tmp, 0, 0, 0); + while ((tmp = t->tid) && r != ETIMEDOUT && r != EINVAL) + r = __timedwait_cp(&t->tid, tmp, CLOCK_REALTIME, at, 0); __pthread_setcancelstate(cs, 0); + if (r == ETIMEDOUT || r == EINVAL) return r; a_barrier(); if (res) *res = t->result; if (t->map_base) __munmap(t->map_base, t->map_size); return 0; } +int __pthread_join(pthread_t t, void **res) +{ + return __pthread_timedjoin_np(t, res, 0); +} + +int __pthread_tryjoin_np(pthread_t t, void **res) +{ + return t->tid ? EBUSY : __pthread_join(t, res); +} + +weak_alias(__pthread_tryjoin_np, pthread_tryjoin_np); +weak_alias(__pthread_timedjoin_np, pthread_timedjoin_np); weak_alias(__pthread_join, pthread_join); -- 2.8.1