1*e04b953eSDavid Xu /* $FreeBSD$ */
2*e04b953eSDavid Xu /* try to catch thread exiting, and rethrow the exception */
3*e04b953eSDavid Xu 
4*e04b953eSDavid Xu #include <pthread.h>
5*e04b953eSDavid Xu #include <stdio.h>
6*e04b953eSDavid Xu #include <stdlib.h>
7*e04b953eSDavid Xu 
8*e04b953eSDavid Xu int caught;
9*e04b953eSDavid Xu 
10*e04b953eSDavid Xu void *
thr_routine(void * arg)11*e04b953eSDavid Xu thr_routine(void *arg)
12*e04b953eSDavid Xu {
13*e04b953eSDavid Xu 	try {
14*e04b953eSDavid Xu 		pthread_exit(NULL);
15*e04b953eSDavid Xu 	} catch (...) {
16*e04b953eSDavid Xu 		caught = 1;
17*e04b953eSDavid Xu 		printf("thread exiting exception caught\n");
18*e04b953eSDavid Xu 		/* rethrow */
19*e04b953eSDavid Xu 		throw;
20*e04b953eSDavid Xu 	}
21*e04b953eSDavid Xu }
22*e04b953eSDavid Xu 
23*e04b953eSDavid Xu int
main()24*e04b953eSDavid Xu main()
25*e04b953eSDavid Xu {
26*e04b953eSDavid Xu 	pthread_t td;
27*e04b953eSDavid Xu 
28*e04b953eSDavid Xu 	pthread_create(&td, NULL, thr_routine, NULL);
29*e04b953eSDavid Xu 	pthread_join(td, NULL);
30*e04b953eSDavid Xu 	if (caught)
31*e04b953eSDavid Xu 		printf("OK\n");
32*e04b953eSDavid Xu 	else
33*e04b953eSDavid Xu 		printf("failure\n");
34*e04b953eSDavid Xu 	return (0);
35*e04b953eSDavid Xu }
36