1213155Sdavidxu/* 2213155Sdavidxu * $FreeBSD$ 3213155Sdavidxu * 4213155Sdavidxu * Test stack unwinding for mixed pthread_cleanup_push/pop and C++ 5213155Sdavidxu * object, both should work together. 6213155Sdavidxu * 7213155Sdavidxu */ 8213155Sdavidxu 9213155Sdavidxu#include <pthread.h> 10213155Sdavidxu#include <stdio.h> 11213155Sdavidxu#include <semaphore.h> 12213155Sdavidxu#include <unistd.h> 13213155Sdavidxu 14213155Sdavidxu#include "Test.cpp" 15213155Sdavidxu 16213155Sdavidxupthread_mutex_t mtx; 17213155Sdavidxupthread_cond_t cv; 18213155Sdavidxu 19213155Sdavidxuvoid f() 20213155Sdavidxu{ 21213155Sdavidxu Test t; 22213155Sdavidxu 23213155Sdavidxu pthread_mutex_lock(&mtx); 24213155Sdavidxu pthread_cond_wait(&cv, &mtx); 25213155Sdavidxu pthread_mutex_unlock(&mtx); 26213155Sdavidxu printf("Bug, thread shouldn't be here.\n"); 27213155Sdavidxu} 28213155Sdavidxu 29213155Sdavidxuvoid g() 30213155Sdavidxu{ 31213155Sdavidxu f(); 32213155Sdavidxu} 33213155Sdavidxu 34213155Sdavidxuvoid * 35213155Sdavidxuthr(void *arg) 36213155Sdavidxu{ 37213155Sdavidxu pthread_cleanup_push(cleanup_handler, NULL); 38213155Sdavidxu g(); 39213155Sdavidxu pthread_cleanup_pop(0); 40213155Sdavidxu return (0); 41213155Sdavidxu} 42213155Sdavidxu 43213155Sdavidxuint 44213155Sdavidxumain() 45213155Sdavidxu{ 46213155Sdavidxu pthread_t td; 47213155Sdavidxu 48213155Sdavidxu pthread_mutex_init(&mtx, NULL); 49213155Sdavidxu pthread_cond_init(&cv, NULL); 50213155Sdavidxu pthread_create(&td, NULL, thr, NULL); 51213155Sdavidxu sleep(1); 52213155Sdavidxu pthread_cancel(td); 53213155Sdavidxu pthread_join(td, NULL); 54213155Sdavidxu check_destruct2(); 55213155Sdavidxu return (0); 56213155Sdavidxu} 57