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