From: Bart Van Assche Date: Mon, 27 Jul 2009 17:02:52 +0000 (+0000) Subject: - Added more rwlock type checking. X-Git-Tag: svn/VALGRIND_3_5_0~209 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=568200aa4af0cdaa240bbdd6d4d691f936bec5be;p=thirdparty%2Fvalgrind.git - Added more rwlock type checking. - The rwlock_type_checking test should now no longer trigger a sporadic deadlock. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10639 --- diff --git a/drd/drd_rwlock.c b/drd/drd_rwlock.c index 9554e5c7bb..a6edfdd6a5 100644 --- a/drd/drd_rwlock.c +++ b/drd/drd_rwlock.c @@ -330,6 +330,9 @@ struct rwlock_info* DRD_(rwlock_pre_init)(const Addr rwlock, p = DRD_(rwlock_get)(rwlock); + if (p) + drd_rwlock_check_type(p, rwlock_type); + if (p) { const ThreadId vg_tid = VG_(get_running_tid)(); @@ -364,6 +367,8 @@ void DRD_(rwlock_post_destroy)(const Addr rwlock, const RwLockT rwlock_type) return; } + drd_rwlock_check_type(p, rwlock_type); + DRD_(clientobj_remove)(rwlock, ClientRwlock); } @@ -545,6 +550,9 @@ void DRD_(rwlock_pre_unlock)(const Addr rwlock, const RwLockT rwlock_type) &GEI); return; } + + drd_rwlock_check_type(p, rwlock_type); + if (! DRD_(rwlock_is_locked_by)(p, drd_tid)) { RwlockErrInfo REI = { DRD_(thread_get_running_tid)(), p->a1 }; diff --git a/drd/tests/rwlock_type_checking.c b/drd/tests/rwlock_type_checking.c index ddcd5c08f7..e4697afd5d 100644 --- a/drd/tests/rwlock_type_checking.c +++ b/drd/tests/rwlock_type_checking.c @@ -10,6 +10,7 @@ #include #include +#include #include "../../config.h" #include "../../drd/drd.h" @@ -17,14 +18,15 @@ int main(int argc, char** argv) { pthread_rwlock_t posix_rwlock; - int user_defined_rwlock; + pthread_rwlock_t user_defined_rwlock; + memset(&user_defined_rwlock, 0, sizeof(user_defined_rwlock)); ANNOTATE_RWLOCK_CREATE(&user_defined_rwlock); pthread_rwlock_init(&posix_rwlock, 0); - pthread_rwlock_rdlock((pthread_rwlock_t*)&user_defined_rwlock); + pthread_rwlock_init((pthread_rwlock_t*)&user_defined_rwlock, 0); - ANNOTATE_READERLOCK_ACQUIRED(&posix_rwlock); + ANNOTATE_READERLOCK_RELEASED(&posix_rwlock); pthread_rwlock_destroy(&posix_rwlock); ANNOTATE_RWLOCK_DESTROY(&user_defined_rwlock); diff --git a/drd/tests/rwlock_type_checking.stderr.exp b/drd/tests/rwlock_type_checking.stderr.exp index db42de30ac..6c890ac32e 100644 --- a/drd/tests/rwlock_type_checking.stderr.exp +++ b/drd/tests/rwlock_type_checking.stderr.exp @@ -1,6 +1,6 @@ Attempt to use a user-defined rwlock as a POSIX rwlock: rwlock 0x......... - at 0x........: pthread_rwlock_rdlock* (drd_pthread_intercepts.c:?) + at 0x........: pthread_rwlock_init* (drd_pthread_intercepts.c:?) by 0x........: main (rwlock_type_checking.c:?) rwlock 0x........ was first observed at: at 0x........: vgDrdCl_annotate_rwlock (drd.h:?) @@ -12,20 +12,6 @@ Attempt to use a POSIX rwlock as a user-defined rwlock: rwlock 0x......... rwlock 0x........ was first observed at: at 0x........: pthread_rwlock_init* (drd_pthread_intercepts.c:?) by 0x........: main (rwlock_type_checking.c:?) - -Destroying locked rwlock: rwlock 0x......... - at 0x........: pthread_rwlock_destroy* (drd_pthread_intercepts.c:?) - by 0x........: main (rwlock_type_checking.c:?) -rwlock 0x........ was first observed at: - at 0x........: pthread_rwlock_init* (drd_pthread_intercepts.c:?) - by 0x........: main (rwlock_type_checking.c:?) - -Destroying locked rwlock: rwlock 0x......... - at 0x........: vgDrdCl_annotate_rwlock (drd.h:?) - by 0x........: main (rwlock_type_checking.c:?) -rwlock 0x........ was first observed at: - at 0x........: vgDrdCl_annotate_rwlock (drd.h:?) - by 0x........: main (rwlock_type_checking.c:?) Finished. -ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 0 from 0) +ERROR SUMMARY: 4 errors from 2 contexts (suppressed: 0 from 0)