| |
| /* 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 <pthread.h> |
| #include <assert.h> |
| |
| #if defined(VGO_darwin) |
| #define OS_IS_DARWIN 1 |
| #else |
| #define OS_IS_DARWIN 0 |
| #endif |
| |
| /* Do trivial stuff with a reader-writer lock. */ |
| |
| int main ( void ) |
| { |
| int r; |
| pthread_rwlock_t rwl; |
| |
| r = pthread_rwlock_init( &rwl, NULL ); assert(r == 0); |
| |
| r = pthread_rwlock_wrlock( &rwl ); assert(r == 0); |
| r = pthread_rwlock_unlock( &rwl ); assert(r == 0); |
| |
| r = pthread_rwlock_rdlock( &rwl ); assert(r == 0); |
| r = pthread_rwlock_rdlock( &rwl ); assert(r == 0); |
| r = pthread_rwlock_unlock( &rwl ); assert(r == 0); |
| r = pthread_rwlock_unlock( &rwl ); assert(r == 0); |
| |
| /* this should fail - lock is unowned now */ |
| r = pthread_rwlock_unlock( &rwl ); assert(OS_IS_DARWIN || r == 0); |
| |
| r = pthread_rwlock_destroy( &rwl ); assert(r == 0); |
| |
| return 0; |
| } |