1b411202f9ff33a587558e2e836626bc7eb9db183sewardj 2b411202f9ff33a587558e2e836626bc7eb9db183sewardj/* Do simple things with a recursive mutex. */ 3b411202f9ff33a587558e2e836626bc7eb9db183sewardj 4b411202f9ff33a587558e2e836626bc7eb9db183sewardj/* Needed for older glibcs (2.3 and older, at least) who don't 5b411202f9ff33a587558e2e836626bc7eb9db183sewardj otherwise "know" about pthread_rwlock_anything or about 6b411202f9ff33a587558e2e836626bc7eb9db183sewardj PTHREAD_MUTEX_RECURSIVE (amongst things). */ 7b411202f9ff33a587558e2e836626bc7eb9db183sewardj#define _GNU_SOURCE 1 8b411202f9ff33a587558e2e836626bc7eb9db183sewardj 9b411202f9ff33a587558e2e836626bc7eb9db183sewardj#include <stdio.h> 10b411202f9ff33a587558e2e836626bc7eb9db183sewardj#include <stdlib.h> 11b411202f9ff33a587558e2e836626bc7eb9db183sewardj#include <assert.h> 12b411202f9ff33a587558e2e836626bc7eb9db183sewardj#include <pthread.h> 13b411202f9ff33a587558e2e836626bc7eb9db183sewardj 14b411202f9ff33a587558e2e836626bc7eb9db183sewardjvoid nearly_main ( void ) 15b411202f9ff33a587558e2e836626bc7eb9db183sewardj{ 16b411202f9ff33a587558e2e836626bc7eb9db183sewardj pthread_mutex_t mx1; 17b411202f9ff33a587558e2e836626bc7eb9db183sewardj pthread_mutexattr_t attr; 18b411202f9ff33a587558e2e836626bc7eb9db183sewardj int r; 19b411202f9ff33a587558e2e836626bc7eb9db183sewardj 20b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_mutexattr_init( &attr ); 21b411202f9ff33a587558e2e836626bc7eb9db183sewardj assert(r==0); 22b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE ); 23b411202f9ff33a587558e2e836626bc7eb9db183sewardj assert(r==0); 24b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_mutex_init( &mx1, &attr ); 25b411202f9ff33a587558e2e836626bc7eb9db183sewardj assert(r==0); 26b411202f9ff33a587558e2e836626bc7eb9db183sewardj 27b411202f9ff33a587558e2e836626bc7eb9db183sewardj fprintf(stderr, "before lock #1\n"); 28b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_mutex_lock( &mx1 ); assert(r == 0); 29b411202f9ff33a587558e2e836626bc7eb9db183sewardj fprintf(stderr, "before lock #2\n"); 30b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_mutex_lock( &mx1 ); assert(r == 0); 31b411202f9ff33a587558e2e836626bc7eb9db183sewardj fprintf(stderr, "before lock #3\n"); 32b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_mutex_lock( &mx1 ); assert(r == 0); 33b411202f9ff33a587558e2e836626bc7eb9db183sewardj 34b411202f9ff33a587558e2e836626bc7eb9db183sewardj fprintf(stderr, "before unlock #1\n"); 35b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_mutex_unlock( &mx1 ); assert(r == 0); 36b411202f9ff33a587558e2e836626bc7eb9db183sewardj fprintf(stderr, "before unlock #2\n"); 37b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_mutex_unlock( &mx1 ); assert(r == 0); 38b411202f9ff33a587558e2e836626bc7eb9db183sewardj fprintf(stderr, "before unlock #3\n"); 39b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_mutex_unlock( &mx1 ); assert(r == 0); 40b411202f9ff33a587558e2e836626bc7eb9db183sewardj 41b411202f9ff33a587558e2e836626bc7eb9db183sewardj fprintf(stderr, "before unlock #4\n"); 42b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_mutex_unlock( &mx1 ); /* FAILS: assert(r == 0); */ 43b411202f9ff33a587558e2e836626bc7eb9db183sewardj} 44b411202f9ff33a587558e2e836626bc7eb9db183sewardj 45b411202f9ff33a587558e2e836626bc7eb9db183sewardjint main ( void ) 46b411202f9ff33a587558e2e836626bc7eb9db183sewardj{ 47b411202f9ff33a587558e2e836626bc7eb9db183sewardj nearly_main(); 48b411202f9ff33a587558e2e836626bc7eb9db183sewardj return 0; 49b411202f9ff33a587558e2e836626bc7eb9db183sewardj} 50