xref: /freebsd/tools/regression/pthread/unwind/cond_wait_cancel2.cpp (revision e04b953e48e773903edee543f90af3cd38b7d4a0)
1*e04b953eSDavid Xu /*
2*e04b953eSDavid Xu  * $FreeBSD$
3*e04b953eSDavid Xu  *
4*e04b953eSDavid Xu  * Test stack unwinding for mixed pthread_cleanup_push/pop and C++
5*e04b953eSDavid Xu  * object, both should work together.
6*e04b953eSDavid Xu  *
7*e04b953eSDavid Xu  */
8*e04b953eSDavid Xu 
9*e04b953eSDavid Xu #include <pthread.h>
10*e04b953eSDavid Xu #include <stdio.h>
11*e04b953eSDavid Xu #include <semaphore.h>
12*e04b953eSDavid Xu #include <unistd.h>
13*e04b953eSDavid Xu 
14*e04b953eSDavid Xu #include "Test.cpp"
15*e04b953eSDavid Xu 
16*e04b953eSDavid Xu pthread_mutex_t mtx;
17*e04b953eSDavid Xu pthread_cond_t cv;
18*e04b953eSDavid Xu 
19*e04b953eSDavid Xu void f()
20*e04b953eSDavid Xu {
21*e04b953eSDavid Xu 	Test t;
22*e04b953eSDavid Xu 
23*e04b953eSDavid Xu 	pthread_mutex_lock(&mtx);
24*e04b953eSDavid Xu 	pthread_cond_wait(&cv, &mtx);
25*e04b953eSDavid Xu 	pthread_mutex_unlock(&mtx);
26*e04b953eSDavid Xu 	printf("Bug, thread shouldn't be here.\n");
27*e04b953eSDavid Xu }
28*e04b953eSDavid Xu 
29*e04b953eSDavid Xu void g()
30*e04b953eSDavid Xu {
31*e04b953eSDavid Xu 	f();
32*e04b953eSDavid Xu }
33*e04b953eSDavid Xu 
34*e04b953eSDavid Xu void *
35*e04b953eSDavid Xu thr(void *arg)
36*e04b953eSDavid Xu {
37*e04b953eSDavid Xu 	pthread_cleanup_push(cleanup_handler, NULL);
38*e04b953eSDavid Xu 	g();
39*e04b953eSDavid Xu 	pthread_cleanup_pop(0);
40*e04b953eSDavid Xu 	return (0);
41*e04b953eSDavid Xu }
42*e04b953eSDavid Xu 
43*e04b953eSDavid Xu int
44*e04b953eSDavid Xu main()
45*e04b953eSDavid Xu {
46*e04b953eSDavid Xu 	pthread_t td;
47*e04b953eSDavid Xu 
48*e04b953eSDavid Xu 	pthread_mutex_init(&mtx, NULL);
49*e04b953eSDavid Xu 	pthread_cond_init(&cv, NULL);
50*e04b953eSDavid Xu 	pthread_create(&td, NULL, thr, NULL);
51*e04b953eSDavid Xu 	sleep(1);
52*e04b953eSDavid Xu 	pthread_cancel(td);
53*e04b953eSDavid Xu 	pthread_join(td, NULL);
54*e04b953eSDavid Xu 	check_destruct2();
55*e04b953eSDavid Xu 	return (0);
56*e04b953eSDavid Xu }
57