1*e04b953eSDavid Xu /* $FreeBSD$ */
2*e04b953eSDavid Xu /* Test stack unwinding for pthread_cond_wait function */
3*e04b953eSDavid Xu 
4*e04b953eSDavid Xu #include <pthread.h>
5*e04b953eSDavid Xu #include <stdio.h>
6*e04b953eSDavid Xu #include <semaphore.h>
7*e04b953eSDavid Xu #include <unistd.h>
8*e04b953eSDavid Xu 
9*e04b953eSDavid Xu #include "Test.cpp"
10*e04b953eSDavid Xu 
11*e04b953eSDavid Xu pthread_mutex_t mtx;
12*e04b953eSDavid Xu pthread_cond_t cv;
13*e04b953eSDavid Xu 
14*e04b953eSDavid Xu void *
thr(void * arg)15*e04b953eSDavid Xu thr(void *arg)
16*e04b953eSDavid Xu {
17*e04b953eSDavid Xu 	Test t;
18*e04b953eSDavid Xu 
19*e04b953eSDavid Xu 	pthread_mutex_lock(&mtx);
20*e04b953eSDavid Xu 	pthread_cond_wait(&cv, &mtx);
21*e04b953eSDavid Xu 	pthread_mutex_unlock(&mtx);
22*e04b953eSDavid Xu 	printf("Bug, thread shouldn't be here.\n");
23*e04b953eSDavid Xu 	return (0);
24*e04b953eSDavid Xu }
25*e04b953eSDavid Xu 
26*e04b953eSDavid Xu int
main()27*e04b953eSDavid Xu main()
28*e04b953eSDavid Xu {
29*e04b953eSDavid Xu 	pthread_t td;
30*e04b953eSDavid Xu 
31*e04b953eSDavid Xu 	pthread_mutex_init(&mtx, NULL);
32*e04b953eSDavid Xu 	pthread_cond_init(&cv, NULL);
33*e04b953eSDavid Xu 	pthread_create(&td, NULL, thr, NULL);
34*e04b953eSDavid Xu 	sleep(1);
35*e04b953eSDavid Xu 	pthread_cancel(td);
36*e04b953eSDavid Xu 	pthread_join(td, NULL);
37*e04b953eSDavid Xu 	check_destruct();
38*e04b953eSDavid Xu 	return (0);
39*e04b953eSDavid Xu }
40