From 16489e15ef87f9ccb258f4524a6ad07f3b100489 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Sat, 27 Sep 2008 12:26:17 +0000 Subject: [PATCH] Added the pth_cancel_locked test. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@8635 --- drd/tests/Makefile.am | 6 +++ drd/tests/pth_cancel_locked.c | 51 ++++++++++++++++++++++++++ drd/tests/pth_cancel_locked.stderr.exp | 10 +++++ drd/tests/pth_cancel_locked.vgtest | 2 + 4 files changed, 69 insertions(+) create mode 100644 drd/tests/pth_cancel_locked.c create mode 100644 drd/tests/pth_cancel_locked.stderr.exp create mode 100644 drd/tests/pth_cancel_locked.vgtest diff --git a/drd/tests/Makefile.am b/drd/tests/Makefile.am index 8dce8bc88c..bf98e10cc7 100644 --- a/drd/tests/Makefile.am +++ b/drd/tests/Makefile.am @@ -74,6 +74,8 @@ EXTRA_DIST = \ pth_barrier_reinit.vgtest \ pth_broadcast.stderr.exp \ pth_broadcast.vgtest \ + pth_cancel_locked.stderr.exp \ + pth_cancel_locked.vgtest \ pth_cond_race.stderr.exp \ pth_cond_race.vgtest \ pth_cond_race2.stderr.exp \ @@ -203,6 +205,7 @@ check_PROGRAMS = \ pth_barrier \ pth_barrier_reinit \ pth_broadcast \ + pth_cancel_locked \ pth_cond_race \ pth_create_chain \ pth_detached \ @@ -299,6 +302,9 @@ pth_barrier_reinit_LDADD = -lpthread pth_broadcast_SOURCES = pth_broadcast.c pth_broadcast_LDADD = -lpthread +pth_cancel_locked_SOURCES = pth_cancel_locked.c +pth_cancel_locked_LDADD = -lpthread + pth_cond_race_SOURCES = pth_cond_race.c pth_cond_race_LDADD = -lpthread diff --git a/drd/tests/pth_cancel_locked.c b/drd/tests/pth_cancel_locked.c new file mode 100644 index 0000000000..86c15b8cbf --- /dev/null +++ b/drd/tests/pth_cancel_locked.c @@ -0,0 +1,51 @@ +/** Cancel a thread that holds a lock on a mutex. */ + + +#include +#include +#include + + +pthread_cond_t s_cond; +pthread_mutex_t s_mutex1; +pthread_mutex_t s_mutex2; + + +static void* thread(void* arg) +{ + /* Lock s_mutex2. */ + pthread_mutex_lock(&s_mutex2); + /* Inform the main thread that s_mutex2 has been locked, and wait for pthread_cancel(). */ + pthread_mutex_lock(&s_mutex1); + pthread_cond_signal(&s_cond); + pthread_cond_wait(&s_cond, &s_mutex1); + return 0; +} + +int main(int argc, char** argv) +{ + pthread_t tid; + + /* Initialize synchronization objects. */ + pthread_cond_init(&s_cond, 0); + pthread_mutex_init(&s_mutex1, 0); + pthread_mutex_init(&s_mutex2, 0); + + /* Create thread. */ + pthread_mutex_lock(&s_mutex1); + pthread_create(&tid, 0, &thread, 0); + + /* Wait until the created thread has locked s_mutex2. */ + pthread_cond_wait(&s_cond, &s_mutex1); + pthread_mutex_unlock(&s_mutex1); + + /* Cancel the created thread. */ + pthread_cancel(tid); + + /* Join the created thread. */ + pthread_join(tid, 0); + + fprintf(stderr, "Test finished.\n"); + + return 0; +} diff --git a/drd/tests/pth_cancel_locked.stderr.exp b/drd/tests/pth_cancel_locked.stderr.exp new file mode 100644 index 0000000000..ea32d4a7e6 --- /dev/null +++ b/drd/tests/pth_cancel_locked.stderr.exp @@ -0,0 +1,10 @@ + +Mutex still locked at thread exit: mutex 0x........, recursion count 1, owner 2. + at 0x........: pthread_join (drd_pthread_intercepts.c:?) + by 0x........: main (pth_cancel_locked.c:?) +mutex 0x........ was first observed at: + at 0x........: pthread_mutex_init (drd_pthread_intercepts.c:?) + by 0x........: main (pth_cancel_locked.c:?) +Test finished. + +ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) diff --git a/drd/tests/pth_cancel_locked.vgtest b/drd/tests/pth_cancel_locked.vgtest new file mode 100644 index 0000000000..b09e38e241 --- /dev/null +++ b/drd/tests/pth_cancel_locked.vgtest @@ -0,0 +1,2 @@ +prereq: ./supported_libpthread +prog: pth_cancel_locked -- 2.47.2