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