From: Bart Van Assche Date: Tue, 19 May 2009 17:54:29 +0000 (+0000) Subject: Merged trunk revisions 9851, 9852 and 9986: fixed DRD assertion failure triggered... X-Git-Tag: svn/VALGRIND_3_4_1~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=154bd4202d444bb078b24572378d56b303ade942;p=thirdparty%2Fvalgrind.git Merged trunk revisions 9851, 9852 and 9986: fixed DRD assertion failure triggered by mutex reinitialization and added regression test. git-svn-id: svn://svn.valgrind.org/valgrind/branches/VALGRIND_3_4_BRANCH@9987 --- diff --git a/drd/drd_mutex.c b/drd/drd_mutex.c index c3e7b4e1f2..fc3b8af14a 100644 --- a/drd/drd_mutex.c +++ b/drd/drd_mutex.c @@ -189,6 +189,7 @@ mutex_init(const Addr mutex, const MutexT mutex_type) VG_(get_IP)(vg_tid), "Mutex reinitialization", &MEI); + p->mutex_type = mutex_type; return p; } p = mutex_get_or_allocate(mutex, mutex_type); diff --git a/drd/tests/Makefile.am b/drd/tests/Makefile.am index 8033dd6e70..d123d4bfdc 100644 --- a/drd/tests/Makefile.am +++ b/drd/tests/Makefile.am @@ -22,8 +22,8 @@ EXTRA_DIST = \ atomic_var.vgtest \ bar_bad.stderr.exp \ bar_bad.vgtest \ - bar_trivial.stdout.exp \ bar_trivial.stderr.exp \ + bar_trivial.stdout.exp \ bar_trivial.vgtest \ boost_thread.stderr.exp \ boost_thread.vgtest \ @@ -109,8 +109,10 @@ EXTRA_DIST = \ pth_detached_sem.vgtest \ pth_inconsistent_cond_wait.stderr.exp \ pth_inconsistent_cond_wait.vgtest \ - pth_process_shared_mutex.vgtest \ + pth_mutex_reinit.stderr.exp \ + pth_mutex_reinit.vgtest \ pth_process_shared_mutex.stderr.exp \ + pth_process_shared_mutex.vgtest \ pth_spinlock.stderr.exp \ pth_spinlock.vgtest \ qt4_mutex.stderr.exp \ @@ -230,8 +232,9 @@ check_PROGRAMS = \ pth_create_chain \ pth_detached \ pth_detached_sem \ - pth_process_shared_mutex \ pth_inconsistent_cond_wait \ + pth_mutex_reinit \ + pth_process_shared_mutex \ pth_spinlock \ recursive_mutex \ rwlock_race \ @@ -357,6 +360,9 @@ pth_detached_sem_LDADD = -lpthread pth_inconsistent_cond_wait_SOURCES = pth_inconsistent_cond_wait.c pth_inconsistent_cond_wait_LDADD = -lpthread +pth_mutex_reinit_SOURCES = pth_mutex_reinit.c +pth_mutex_reinit_LDADD = -lpthread + pth_process_shared_mutex_SOURCES = pth_process_shared_mutex.c pth_process_shared_mutex_LDADD = -lpthread diff --git a/drd/tests/pth_mutex_reinit.c b/drd/tests/pth_mutex_reinit.c new file mode 100644 index 0000000000..1c72e819df --- /dev/null +++ b/drd/tests/pth_mutex_reinit.c @@ -0,0 +1,36 @@ +/* Test program that triggers mutex reinitialization. */ + + +#define _GNU_SOURCE + +#include +#include +#include +#include + + +int main(int argc, char** argv) +{ + pthread_mutex_t m; + pthread_mutexattr_t attr; + + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL); + pthread_mutex_init(&m, &attr); + pthread_mutexattr_destroy(&attr); + pthread_mutex_lock(&m); + pthread_mutex_unlock(&m); + + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&m, &attr); + pthread_mutexattr_destroy(&attr); + pthread_mutex_lock(&m); + pthread_mutex_unlock(&m); + + pthread_mutex_destroy(&m); + + fprintf(stderr, "Done.\n"); + + return 0; +} diff --git a/drd/tests/pth_mutex_reinit.stderr.exp b/drd/tests/pth_mutex_reinit.stderr.exp new file mode 100644 index 0000000000..b8ad85ea8d --- /dev/null +++ b/drd/tests/pth_mutex_reinit.stderr.exp @@ -0,0 +1,10 @@ + +Mutex reinitialization: mutex 0x........, recursion count 0, owner 1. + at 0x........: pthread_mutex_init (drd_pthread_intercepts.c:?) + by 0x........: main (pth_mutex_reinit.c:?) +mutex 0x........ was first observed at: + at 0x........: pthread_mutex_init (drd_pthread_intercepts.c:?) + by 0x........: main (pth_mutex_reinit.c:?) +Done. + +ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) diff --git a/drd/tests/pth_mutex_reinit.vgtest b/drd/tests/pth_mutex_reinit.vgtest new file mode 100644 index 0000000000..df78455564 --- /dev/null +++ b/drd/tests/pth_mutex_reinit.vgtest @@ -0,0 +1,3 @@ +prereq: test -e pth_mutex_reinit && ./supported_libpthread +vgopts: --var-info=yes --check-stack-var=yes +prog: pth_mutex_reinit