From e87a6ce4ce4a63a58d2e1fd66ea7188393b5ecf3 Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Tue, 22 Oct 2002 04:30:35 +0000 Subject: [PATCH] Partially merge patch from Jeremy Fitzhardinge: 13-track-condvar-mutex This fixes mutex lock/unlock tracking. In particular, it gets tracking of mutex ownership over condition variables correct. I didn't take the bits to do with vg_tid_currently_in_baseBlock's value when baseBlock is empty. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@1252 --- coregrind/vg_scheduler.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/coregrind/vg_scheduler.c b/coregrind/vg_scheduler.c index 95063cc2f..60eb0b83d 100644 --- a/coregrind/vg_scheduler.c +++ b/coregrind/vg_scheduler.c @@ -2318,6 +2318,8 @@ void release_one_thread_waiting_on_mutex ( pthread_mutex_t* mutex, break; } + VG_TRACK( post_mutex_unlock, (ThreadId)mutex->__m_owner, mutex ); + vg_assert(i <= VG_N_THREADS); if (i == VG_N_THREADS) { /* Nobody else is waiting on it. */ @@ -2333,6 +2335,8 @@ void release_one_thread_waiting_on_mutex ( pthread_mutex_t* mutex, VG_(threads)[i].associated_mx = NULL; /* m_edx already holds pth_mx_lock() success (0) */ + VG_TRACK( post_mutex_lock, (ThreadId)i, mutex); + if (VG_(clo_trace_pthread_level) >= 1) { VG_(sprintf)(msg_buf, "%s mx %p: RESUME", caller, mutex ); @@ -2520,8 +2524,6 @@ void do_pthread_mutex_unlock ( ThreadId tid, vg_assert(mutex->__m_count == 1); vg_assert((ThreadId)mutex->__m_owner == tid); - VG_TRACK( post_mutex_unlock, tid, mutex); - /* Release at max one thread waiting on this mutex. */ release_one_thread_waiting_on_mutex ( mutex, "pthread_mutex_lock" ); @@ -2584,6 +2586,8 @@ void do_pthread_cond_timedwait_TIMEOUT ( ThreadId tid ) mx->__m_owner = (_pthread_descr)tid; mx->__m_count = 1; + VG_TRACK( post_mutex_lock, tid, mx ); + if (VG_(clo_trace_pthread_level) >= 1) { VG_(sprintf)(msg_buf, "pthread_cond_timedwai cv %p: TIMEOUT with mx %p", @@ -2649,6 +2653,8 @@ void release_N_threads_waiting_on_cond ( pthread_cond_t* cond, mx->__m_count = 1; /* .m_edx already holds pth_cond_wait success value (0) */ + VG_TRACK( post_mutex_lock, i, mx ); + if (VG_(clo_trace_pthread_level) >= 1) { VG_(sprintf)(msg_buf, "%s cv %p: RESUME with mx %p", caller, cond, mx );