| |
| /* Do simple things with a recursive mutex. */ |
| |
| /* 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 <stdio.h> |
| #include <stdlib.h> |
| #include <assert.h> |
| #include <pthread.h> |
| |
| void nearly_main ( void ) |
| { |
| pthread_mutex_t mx1; |
| pthread_mutexattr_t attr; |
| int r; |
| |
| r = pthread_mutexattr_init( &attr ); |
| assert(r==0); |
| r = pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE ); |
| assert(r==0); |
| r = pthread_mutex_init( &mx1, &attr ); |
| assert(r==0); |
| |
| fprintf(stderr, "before lock #1\n"); |
| r = pthread_mutex_lock( &mx1 ); assert(r == 0); |
| fprintf(stderr, "before lock #2\n"); |
| r = pthread_mutex_lock( &mx1 ); assert(r == 0); |
| fprintf(stderr, "before lock #3\n"); |
| r = pthread_mutex_lock( &mx1 ); assert(r == 0); |
| |
| fprintf(stderr, "before unlock #1\n"); |
| r = pthread_mutex_unlock( &mx1 ); assert(r == 0); |
| fprintf(stderr, "before unlock #2\n"); |
| r = pthread_mutex_unlock( &mx1 ); assert(r == 0); |
| fprintf(stderr, "before unlock #3\n"); |
| r = pthread_mutex_unlock( &mx1 ); assert(r == 0); |
| |
| fprintf(stderr, "before unlock #4\n"); |
| r = pthread_mutex_unlock( &mx1 ); /* FAILS: assert(r == 0); */ |
| } |
| |
| int main ( void ) |
| { |
| nearly_main(); |
| return 0; |
| } |