/* Needed for older glibcs (2.3 and older, at least) who don't otherwise "know" about pthread_rwlock_anything or about PTHREAD_MUTEX_RECURSIVE (amongst things). */ #define _GNU_SOURCE 1 #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <unistd.h> /* Test of the mechanism for showing all locks held by a thread. This is like locked_vs_unlocked.c, except that it uses a recursively lockable lock, and one thread holds the lock more than once. Point is to check that the lock showing mechanism shows the lock-number-of-times-held count. */ pthread_mutex_t mx; int x = 0; void* child_fn1 ( void* arg ) { int r; r= pthread_mutex_lock(&mx); assert(!r); r= pthread_mutex_lock(&mx); assert(!r); x = 1; r= pthread_mutex_unlock(&mx); assert(!r); r= pthread_mutex_unlock(&mx); assert(!r); sleep(1); return NULL; } void* child_fn2 ( void* arg ) { sleep(1); x = 1; return NULL; } int main ( int argc, char** argv ) { int r; pthread_t child1, child2; pthread_mutexattr_t attr; r = pthread_mutexattr_init( &attr ); assert(!r); r = pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE ); assert(!r); r= pthread_mutex_init(&mx, &attr); assert(!r); r= pthread_create(&child2, NULL, child_fn2, NULL); assert(!r); r= pthread_create(&child1, NULL, child_fn1, NULL); assert(!r); r= pthread_join(child1, NULL); assert(!r); r= pthread_join(child2, NULL); assert(!r); r= pthread_mutex_destroy(&mx); assert(!r); return 0; }