xref: /openbsd-src/regress/lib/libpthread/signals/pthread_join/pthread_join.c (revision 6355590a4bbf151f3e0689e56ce0b7de5d3ae6f2)
1*6355590aSfgsch /*	$OpenBSD: pthread_join.c,v 1.1 2011/10/01 10:26:59 fgsch Exp $	*/
2*6355590aSfgsch /*
3*6355590aSfgsch  * Federico G. Schwindt <fgsch@openbsd.org>, 2011. Public Domain.
4*6355590aSfgsch  */
5*6355590aSfgsch #include <pthread.h>
6*6355590aSfgsch #include <signal.h>
7*6355590aSfgsch #include <unistd.h>
8*6355590aSfgsch #include "test.h"
9*6355590aSfgsch 
10*6355590aSfgsch volatile sig_atomic_t hits = 0;
11*6355590aSfgsch 
12*6355590aSfgsch void
handler(int sig)13*6355590aSfgsch handler(int sig)
14*6355590aSfgsch {
15*6355590aSfgsch 	hits++;
16*6355590aSfgsch }
17*6355590aSfgsch 
18*6355590aSfgsch void *
thr_sleep(void * arg)19*6355590aSfgsch thr_sleep(void *arg)
20*6355590aSfgsch {
21*6355590aSfgsch 	return ((caddr_t)NULL + sleep(5));
22*6355590aSfgsch }
23*6355590aSfgsch 
24*6355590aSfgsch void *
thr_join(void * arg)25*6355590aSfgsch thr_join(void *arg)
26*6355590aSfgsch {
27*6355590aSfgsch 	pthread_t tid = *(pthread_t *)arg;
28*6355590aSfgsch 	void *retval;
29*6355590aSfgsch 
30*6355590aSfgsch 	CHECKr(pthread_join(tid, &retval));
31*6355590aSfgsch 	return (retval);
32*6355590aSfgsch }
33*6355590aSfgsch 
34*6355590aSfgsch int
main(int argc,char ** argv)35*6355590aSfgsch main(int argc, char **argv)
36*6355590aSfgsch {
37*6355590aSfgsch 	struct sigaction sa;
38*6355590aSfgsch 	pthread_t tid[2];
39*6355590aSfgsch 	void *retval;
40*6355590aSfgsch 
41*6355590aSfgsch 	bzero(&sa, sizeof(sa));
42*6355590aSfgsch 	sa.sa_handler = handler;
43*6355590aSfgsch 	CHECKe(sigaction(SIGUSR1, &sa, NULL));
44*6355590aSfgsch 
45*6355590aSfgsch 	CHECKr(pthread_create(&tid[0], NULL, thr_sleep, NULL));
46*6355590aSfgsch 	CHECKr(pthread_create(&tid[1], NULL, thr_join, &tid[0]));
47*6355590aSfgsch 	sleep(2);
48*6355590aSfgsch 
49*6355590aSfgsch 	CHECKr(pthread_kill(tid[1], SIGUSR1));
50*6355590aSfgsch 	sleep(2);
51*6355590aSfgsch 
52*6355590aSfgsch 	ASSERT(hits == 1);
53*6355590aSfgsch 	CHECKr(pthread_join(tid[1], &retval));
54*6355590aSfgsch 	ASSERT(retval == (void *)0);
55*6355590aSfgsch 	SUCCEED;
56*6355590aSfgsch }
57