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@
This commit is contained in:
parent
fd3bb38e58
commit
76f4f39125
|
@ -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.
|
* Copyright (c) 2002, 2007 The NetBSD Foundation, Inc.
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
#undef _FORTIFY_SOURCE
|
#undef _FORTIFY_SOURCE
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__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
|
#ifndef lint
|
||||||
|
|
||||||
|
@ -58,6 +58,7 @@ __RCSID("$NetBSD: pthread_cancelstub.c,v 1.35 2011/04/22 14:18:34 joerg Exp $");
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <aio.h>
|
#include <aio.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <mqueue.h>
|
#include <mqueue.h>
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
|
@ -577,6 +578,7 @@ __sigtimedwait50(const sigset_t * __restrict set, siginfo_t * __restrict info,
|
||||||
pthread_t self;
|
pthread_t self;
|
||||||
int retval;
|
int retval;
|
||||||
struct timespec tout, *tp;
|
struct timespec tout, *tp;
|
||||||
|
|
||||||
if (timeout) {
|
if (timeout) {
|
||||||
tout = *timeout;
|
tout = *timeout;
|
||||||
tp = &tout;
|
tp = &tout;
|
||||||
|
@ -591,6 +593,28 @@ __sigtimedwait50(const sigset_t * __restrict set, siginfo_t * __restrict info,
|
||||||
return retval;
|
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(_close, close)
|
||||||
__strong_alias(_fcntl, fcntl)
|
__strong_alias(_fcntl, fcntl)
|
||||||
__strong_alias(_fdatasync, fdatasync)
|
__strong_alias(_fdatasync, fdatasync)
|
||||||
|
@ -608,6 +632,7 @@ __strong_alias(_pread, pread)
|
||||||
__strong_alias(_pwrite, pwrite)
|
__strong_alias(_pwrite, pwrite)
|
||||||
__strong_alias(_read, read)
|
__strong_alias(_read, read)
|
||||||
__strong_alias(_readv, readv)
|
__strong_alias(_readv, readv)
|
||||||
|
__strong_alias(_sigwait, sigwait)
|
||||||
__strong_alias(_write, write)
|
__strong_alias(_write, write)
|
||||||
__strong_alias(_writev, writev)
|
__strong_alias(_writev, writev)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue