1#include <stdio.h>
2#include <pthread.h>
3#include <errno.h>
4// test program from johan.walles (bug 295590)
5// This test verifies that helgrind detects (and does not crash) when
6// the guest application wrongly destroys a cond var being waited
7// upon.
8pthread_mutex_t mutex;
9pthread_cond_t cond;
10pthread_t thread;
11int ready = 0;
12
13void *ThreadFunction(void *ptr)
14{
15   pthread_mutex_lock(&mutex);
16   ready = 1;
17   pthread_cond_signal(&cond);
18   pthread_cond_destroy(&cond); // ERROR!!!
19   pthread_mutex_unlock(&mutex);
20   return NULL;
21}
22
23int main()
24{
25   pthread_mutex_init(&mutex, NULL);
26   pthread_cond_init(&cond, NULL);
27
28   pthread_mutex_lock(&mutex);
29   pthread_create(&thread, NULL, ThreadFunction, (void*) NULL);
30   while (!ready) { // to insure ourselves against spurious wakeups
31      pthread_cond_wait(&cond, &mutex);
32   }
33   pthread_mutex_unlock(&mutex);
34
35   pthread_join(thread, NULL);
36   pthread_mutex_destroy(&mutex);
37   printf("finished\n");
38   return 0;
39}
40