xref: /openbsd-src/regress/lib/libpthread/siginterrupt/siginterrupt.c (revision d13be5d47e4149db2549a9828e244d59dbc43f15)
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