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 \
pth_barrier \
pth_barrier_reinit \
pth_broadcast \
+ pth_cancel_locked \
pth_cond_race \
pth_create_chain \
pth_detached \
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
--- /dev/null
+/** Cancel a thread that holds a lock on a mutex. */
+
+
+#include <assert.h>
+#include <pthread.h>
+#include <stdio.h>
+
+
+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;
+}
--- /dev/null
+
+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)