1*d13be5d4Sfgsch /* $OpenBSD: siginterrupt.c,v 1.1 2011/09/13 23:50:17 fgsch Exp $ */
2*d13be5d4Sfgsch /*
3*d13be5d4Sfgsch * Federico G. Schwindt <fgsch@openbsd.org>, 2011. Public Domain.
4*d13be5d4Sfgsch */
5*d13be5d4Sfgsch #include <pthread.h>
6*d13be5d4Sfgsch #include <signal.h>
7*d13be5d4Sfgsch #include <unistd.h>
8*d13be5d4Sfgsch #include "test.h"
9*d13be5d4Sfgsch
10*d13be5d4Sfgsch volatile sig_atomic_t hits = 0;
11*d13be5d4Sfgsch
12*d13be5d4Sfgsch void
handler(int sig)13*d13be5d4Sfgsch handler(int sig)
14*d13be5d4Sfgsch {
15*d13be5d4Sfgsch hits++;
16*d13be5d4Sfgsch }
17*d13be5d4Sfgsch
18*d13be5d4Sfgsch void *
blocker(void * arg)19*d13be5d4Sfgsch blocker(void *arg)
20*d13be5d4Sfgsch {
21*d13be5d4Sfgsch int fds[2];
22*d13be5d4Sfgsch char buf;
23*d13be5d4Sfgsch
24*d13be5d4Sfgsch CHECKe(pipe(fds));
25*d13be5d4Sfgsch ASSERT(read(fds[0], &buf, 1) == -1);
26*d13be5d4Sfgsch return ((caddr_t)NULL + errno);
27*d13be5d4Sfgsch }
28*d13be5d4Sfgsch
29*d13be5d4Sfgsch int
main(int argc,char ** argv)30*d13be5d4Sfgsch main(int argc, char **argv)
31*d13be5d4Sfgsch {
32*d13be5d4Sfgsch pthread_t tid;
33*d13be5d4Sfgsch void *retval;
34*d13be5d4Sfgsch
35*d13be5d4Sfgsch ASSERT(signal(SIGUSR1, handler) != SIG_ERR);
36*d13be5d4Sfgsch
37*d13be5d4Sfgsch CHECKr(pthread_create(&tid, NULL, blocker, NULL));
38*d13be5d4Sfgsch sleep(1);
39*d13be5d4Sfgsch
40*d13be5d4Sfgsch /* With signal(3) system calls will be restarted. */
41*d13be5d4Sfgsch CHECKr(pthread_kill(tid, SIGUSR1));
42*d13be5d4Sfgsch sleep(1);
43*d13be5d4Sfgsch
44*d13be5d4Sfgsch /* Same as default with signal(3). */
45*d13be5d4Sfgsch CHECKe(siginterrupt(SIGUSR1, 0));
46*d13be5d4Sfgsch CHECKr(pthread_kill(tid, SIGUSR1));
47*d13be5d4Sfgsch sleep(1);
48*d13be5d4Sfgsch
49*d13be5d4Sfgsch /* Should interrupt the call now. */
50*d13be5d4Sfgsch CHECKe(siginterrupt(SIGUSR1, 1));
51*d13be5d4Sfgsch CHECKr(pthread_kill(tid, SIGUSR1));
52*d13be5d4Sfgsch sleep(1);
53*d13be5d4Sfgsch
54*d13be5d4Sfgsch CHECKr(pthread_join(tid, &retval));
55*d13be5d4Sfgsch ASSERT(retval == (void *)EINTR);
56*d13be5d4Sfgsch ASSERT(hits == 3);
57*d13be5d4Sfgsch SUCCEED;
58*d13be5d4Sfgsch }
59