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 Xuthr_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 Xumain() 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