1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Initialize several kinds of mutexes and lock each mutex twice. 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Note: locking a regular mutex twice causes a deadlock. 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define _GNU_SOURCE 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <unistd.h> 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <pthread.h> 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "../../config.h" 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void lock_twice(pthread_mutex_t* const p) 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (pthread_mutex_trylock(p) != 0) 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "first lock call failed !\n"); 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (pthread_mutex_trylock(p) != 0) 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "second lock call failed !\n"); 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (pthread_mutex_unlock(p) != 0) 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "first unlock call failed !\n"); 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (pthread_mutex_unlock(p) != 0) 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "second unlock call failed !\n"); 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char** argv) 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(HAVE_PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutex_t m = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "Recursive mutex (statically initialized).\n"); 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown lock_twice(&m); 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutex_destroy(&m); 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(HAVE_PTHREAD_MUTEX_RECURSIVE_NP) 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutex_t m; 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutexattr_t attr; 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "\nRecursive mutex (initialized via mutex attributes).\n"); 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutexattr_init(&attr); 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP); 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutex_init(&m, &attr); 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutexattr_destroy(&attr); 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown lock_twice(&m); 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutex_destroy(&m); 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(HAVE_PTHREAD_MUTEX_ERRORCHECK_NP) 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutex_t m; 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutexattr_t attr; 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "\nError checking mutex.\n"); 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutexattr_init(&attr); 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK_NP); 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutex_init(&m, &attr); 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutexattr_destroy(&attr); 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown lock_twice(&m); 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutex_destroy(&m); 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "\nNon-recursive mutex.\n"); 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown lock_twice(&m); 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "\nDone.\n"); 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 76