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