Index: coregrind/vg_include.h =================================================================== RCS file: /home/kde/valgrind/coregrind/vg_include.h,v retrieving revision 1.199 diff -u -3 -p -r1.199 vg_include.h --- coregrind/vg_include.h 30 Jun 2004 17:34:30 -0000 1.199 +++ coregrind/vg_include.h 1 Jul 2004 12:30:38 -0000 @@ -464,6 +464,7 @@ extern Bool VG_(is_inside_segment_mmapd #define VG_USERREQ__PTHREAD_KILL 0x301A #define VG_USERREQ__PTHREAD_YIELD 0x301B #define VG_USERREQ__PTHREAD_KEY_VALIDATE 0x301C +#define VG_USERREQ__PTHREAD_COND_DESTROY 0x301D #define VG_USERREQ__CLEANUP_PUSH 0x3020 #define VG_USERREQ__CLEANUP_POP 0x3021 Index: coregrind/vg_libpthread.c =================================================================== RCS file: /home/kde/valgrind/coregrind/vg_libpthread.c,v retrieving revision 1.157 diff -u -3 -p -r1.157 vg_libpthread.c --- coregrind/vg_libpthread.c 27 Jun 2004 13:26:44 -0000 1.157 +++ coregrind/vg_libpthread.c 1 Jul 2004 12:30:38 -0000 @@ -1403,12 +1403,15 @@ int pthread_cond_init( pthread_cond_t *c int pthread_cond_destroy(pthread_cond_t *cond) { - /* should check that no threads are waiting on this CV */ - static int moans = N_MOANS; - if (moans-- > 0) - kludged("pthread_cond_destroy", - "(it doesn't check if the cond is waited on)" ); - return 0; + int res; + vg_pthread_cond_t* vg_cond; + CONVERT(cond, cond, vg_cond); + + ensure_valgrind("pthread_cond_destroy"); + VALGRIND_MAGIC_SEQUENCE(res, 0 /* default */, + VG_USERREQ__PTHREAD_COND_DESTROY, + cond, 0, 0, 0); + return res; } /* --------------------------------------------------- Index: coregrind/vg_scheduler.c =================================================================== RCS file: /home/kde/valgrind/coregrind/vg_scheduler.c,v retrieving revision 1.154 diff -u -3 -p -r1.154 vg_scheduler.c --- coregrind/vg_scheduler.c 27 Jun 2004 17:37:19 -0000 1.154 +++ coregrind/vg_scheduler.c 1 Jul 2004 12:30:38 -0000 @@ -2545,6 +2545,21 @@ void do_pthread_cond_signal_or_broadcast SET_PTHREQ_RETVAL(tid, 0); /* success */ } +// There are no resources to release, only thing we have to do is return +// EBUSY if any threads are still waiting on the condvar. +static +void do_pthread_cond_destroy ( ThreadId tid, vg_pthread_cond_t* cond ) +{ + int i; + for (i = 1; i < VG_N_THREADS; i++) { + if (cond == VG_(threads)[tid].associated_cv) { + SET_PTHREQ_RETVAL(tid, EBUSY); + return; + } + } + SET_PTHREQ_RETVAL(tid, 0); /* success */ +} + /* ----------------------------------------------------------- THREAD SPECIFIC DATA @@ -3123,6 +3138,12 @@ void do_client_request ( ThreadId tid ) (vg_pthread_cond_t *)(arg[1]) ); break; + case VG_USERREQ__PTHREAD_COND_DESTROY: + do_pthread_cond_destroy( + tid, + (vg_pthread_cond_t *)(arg[1]) ); + break; + case VG_USERREQ__PTHREAD_KEY_VALIDATE: do_pthread_key_validate ( tid, (pthread_key_t)(arg[1]) );