From 76f4f391251f99a73a9322453af78848b98529f0 Mon Sep 17 00:00:00 2001 From: agc Date: Wed, 4 Apr 2012 06:29:16 +0000 Subject: [PATCH] Add a pthread cancel stub for sigwait, following Onno van der Linden's analysis in PR 45131. Kindly tested by Hisashi T Fujinaka (using csup as the test case) with a successful outcome. OK martin@ --- lib/libpthread/pthread_cancelstub.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/libpthread/pthread_cancelstub.c b/lib/libpthread/pthread_cancelstub.c index 6f4670c44ae1..d4ea28a19c10 100644 --- a/lib/libpthread/pthread_cancelstub.c +++ b/lib/libpthread/pthread_cancelstub.c @@ -1,4 +1,4 @@ -/* $NetBSD: pthread_cancelstub.c,v 1.35 2011/04/22 14:18:34 joerg Exp $ */ +/* $NetBSD: pthread_cancelstub.c,v 1.36 2012/04/04 06:29:16 agc Exp $ */ /*- * Copyright (c) 2002, 2007 The NetBSD Foundation, Inc. @@ -33,7 +33,7 @@ #undef _FORTIFY_SOURCE #include -__RCSID("$NetBSD: pthread_cancelstub.c,v 1.35 2011/04/22 14:18:34 joerg Exp $"); +__RCSID("$NetBSD: pthread_cancelstub.c,v 1.36 2012/04/04 06:29:16 agc Exp $"); #ifndef lint @@ -58,6 +58,7 @@ __RCSID("$NetBSD: pthread_cancelstub.c,v 1.35 2011/04/22 14:18:34 joerg Exp $"); #include #include #include +#include #include #include #include @@ -577,6 +578,7 @@ __sigtimedwait50(const sigset_t * __restrict set, siginfo_t * __restrict info, pthread_t self; int retval; struct timespec tout, *tp; + if (timeout) { tout = *timeout; tp = &tout; @@ -591,6 +593,28 @@ __sigtimedwait50(const sigset_t * __restrict set, siginfo_t * __restrict info, return retval; } +int +sigwait(const sigset_t * __restrict set, int * __restrict sig) +{ + pthread_t self; + int saved_errno; + int new_errno; + int retval; + + self = pthread__self(); + saved_errno = errno; + TESTCANCEL(self); + retval = ____sigtimedwait50(set, NULL, NULL); + TESTCANCEL(self); + new_errno = errno; + errno = saved_errno; + if (retval < 0) { + return new_errno; + } + *sig = retval; + return 0; +} + __strong_alias(_close, close) __strong_alias(_fcntl, fcntl) __strong_alias(_fdatasync, fdatasync) @@ -608,6 +632,7 @@ __strong_alias(_pread, pread) __strong_alias(_pwrite, pwrite) __strong_alias(_read, read) __strong_alias(_readv, readv) +__strong_alias(_sigwait, sigwait) __strong_alias(_write, write) __strong_alias(_writev, writev)