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