Author: bart Date: 2008-02-28 08:30:43 +0000 (Thu, 28 Feb 2008) New Revision: 7497
Log: Added support for recognizing invalid mutexes. Modified: trunk/exp-drd/drd_clientreq.h trunk/exp-drd/drd_intercepts.c trunk/exp-drd/drd_mutex.c trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp trunk/exp-drd/tests/tc20_verifywrap.stderr.exp Modified: trunk/exp-drd/drd_clientreq.h =================================================================== --- trunk/exp-drd/drd_clientreq.h 2008-02-28 07:36:04 UTC (rev 7496) +++ trunk/exp-drd/drd_clientreq.h 2008-02-28 08:30:43 UTC (rev 7497) @@ -119,6 +119,7 @@ typedef enum { + mutex_type_invalid_mutex = 0, mutex_type_recursive_mutex = 1, mutex_type_errorcheck_mutex = 2, mutex_type_default_mutex = 3, Modified: trunk/exp-drd/drd_intercepts.c =================================================================== --- trunk/exp-drd/drd_intercepts.c 2008-02-28 07:36:04 UTC (rev 7496) +++ trunk/exp-drd/drd_intercepts.c 2008-02-28 08:30:43 UTC (rev 7497) @@ -100,18 +100,8 @@ case PTHREAD_MUTEX_DEFAULT: case PTHREAD_MUTEX_ADAPTIVE_NP: return mutex_type_default_mutex; -#if 0 - case -1: - printf("Warning: changed mutex type from -1 into %d\n", - mutex_type_default_mutex); - return mutex_type_default_mutex; -#endif } -#if 0 - printf("mutex->__data.__kind = %d\n", kind); - assert(0); -#endif - return mutex_type_default_mutex; + return mutex_type_invalid_mutex; } static MutexT mutex_type(pthread_mutex_t* mutex) Modified: trunk/exp-drd/drd_mutex.c =================================================================== --- trunk/exp-drd/drd_mutex.c 2008-02-28 07:36:04 UTC (rev 7496) +++ trunk/exp-drd/drd_mutex.c 2008-02-28 08:30:43 UTC (rev 7497) @@ -251,12 +251,15 @@ */ void mutex_pre_lock(const Addr mutex, const SizeT size, MutexT mutex_type) { - struct mutex_info* p = mutex_get(mutex); + struct mutex_info* p; + + p = mutex_get(mutex); if (p == 0) { mutex_init(mutex, size, mutex_type); p = mutex_get(mutex); } + tl_assert(p); if (p->owner == thread_get_running_tid() @@ -295,6 +298,16 @@ p ? p->owner : VG_INVALID_THREADID); } + if (mutex_type == mutex_type_invalid_mutex) + { + GenericErrInfo GEI; + VG_(maybe_record_error)(VG_(get_running_tid)(), + GenericErr, + VG_(get_IP)(VG_(get_running_tid)()), + "Invalid mutex", + &GEI); + } + if (p == 0) { GenericErrInfo GEI; @@ -368,6 +381,16 @@ p->owner); } + if (mutex_type == mutex_type_invalid_mutex) + { + GenericErrInfo GEI; + VG_(maybe_record_error)(VG_(get_running_tid)(), + GenericErr, + VG_(get_IP)(VG_(get_running_tid)()), + "Invalid mutex", + &GEI); + } + if (p == 0) { GenericErrInfo GEI; @@ -448,6 +471,8 @@ { switch (mt) { + case mutex_type_invalid_mutex: + return "invalid mutex"; case mutex_type_recursive_mutex: return "recursive mutex"; case mutex_type_errorcheck_mutex: Modified: trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp =================================================================== --- trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp 2008-02-28 07:36:04 UTC (rev 7496) +++ trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp 2008-02-28 08:30:43 UTC (rev 7497) @@ -13,6 +13,11 @@ by 0x........: clone (in /...libc...) Thread 1: +Invalid mutex + at 0x........: pthread_mutex_unlock (drd_intercepts.c:?) + by 0x........: nearly_main (tc09_bad_unlock.c:41) + by 0x........: main (tc09_bad_unlock.c:49) + Not a mutex at 0x........: pthread_mutex_unlock (drd_intercepts.c:?) by 0x........: nearly_main (tc09_bad_unlock.c:41) @@ -32,9 +37,14 @@ by 0x........: clone (in /...libc...) Thread 1: +Invalid mutex + at 0x........: pthread_mutex_unlock (drd_intercepts.c:?) + by 0x........: nearly_main (tc09_bad_unlock.c:41) + by 0x........: main (tc09_bad_unlock.c:50) + Not a mutex at 0x........: pthread_mutex_unlock (drd_intercepts.c:?) by 0x........: nearly_main (tc09_bad_unlock.c:41) by 0x........: main (tc09_bad_unlock.c:50) -ERROR SUMMARY: 6 errors from 6 contexts (suppressed: 0 from 0) +ERROR SUMMARY: 8 errors from 8 contexts (suppressed: 0 from 0) Modified: trunk/exp-drd/tests/tc20_verifywrap.stderr.exp =================================================================== --- trunk/exp-drd/tests/tc20_verifywrap.stderr.exp 2008-02-28 07:36:04 UTC (rev 7496) +++ trunk/exp-drd/tests/tc20_verifywrap.stderr.exp 2008-02-28 08:30:43 UTC (rev 7497) @@ -24,6 +24,10 @@ at 0x........: pthread_mutex_destroy (drd_intercepts.c:?) by 0x........: main (tc20_verifywrap.c:102) +Invalid mutex + at 0x........: pthread_mutex_unlock (drd_intercepts.c:?) + by 0x........: main (tc20_verifywrap.c:125) + Mutex not locked: address 0x........, recursion count 0, owner 0. at 0x........: pthread_mutex_unlock (drd_intercepts.c:?) by 0x........: main (tc20_verifywrap.c:125) @@ -67,4 +71,4 @@ Destroying locked mutex: address 0x........, recursion count 1, owner 1. at 0x........: main (tc20_verifywrap.c:261) -ERROR SUMMARY: 6 errors from 6 contexts (suppressed: 0 from 0) +ERROR SUMMARY: 7 errors from 7 contexts (suppressed: 0 from 0) ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Valgrind-developers mailing list Valgrind-developers@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/valgrind-developers