1b411202f9ff33a587558e2e836626bc7eb9db183sewardj 2b411202f9ff33a587558e2e836626bc7eb9db183sewardj/* Needed for older glibcs (2.3 and older, at least) who don't 3b411202f9ff33a587558e2e836626bc7eb9db183sewardj otherwise "know" about pthread_rwlock_anything or about 4b411202f9ff33a587558e2e836626bc7eb9db183sewardj PTHREAD_MUTEX_RECURSIVE (amongst things). */ 5b411202f9ff33a587558e2e836626bc7eb9db183sewardj#define _GNU_SOURCE 1 6b411202f9ff33a587558e2e836626bc7eb9db183sewardj 7b411202f9ff33a587558e2e836626bc7eb9db183sewardj#include <stdio.h> 802b13a1023bf6d80d04095e71004d26498758b51tom#include "safe-pthread.h" 9b411202f9ff33a587558e2e836626bc7eb9db183sewardj#include <assert.h> 10b411202f9ff33a587558e2e836626bc7eb9db183sewardj 11b411202f9ff33a587558e2e836626bc7eb9db183sewardj/* Do trivial stuff with a reader-writer lock. */ 12b411202f9ff33a587558e2e836626bc7eb9db183sewardj 13b411202f9ff33a587558e2e836626bc7eb9db183sewardjint main ( void ) 14b411202f9ff33a587558e2e836626bc7eb9db183sewardj{ 15b411202f9ff33a587558e2e836626bc7eb9db183sewardj int r; 16b411202f9ff33a587558e2e836626bc7eb9db183sewardj pthread_rwlock_t rwl; 17b411202f9ff33a587558e2e836626bc7eb9db183sewardj 18b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_rwlock_init( &rwl, NULL ); assert(r == 0); 19b411202f9ff33a587558e2e836626bc7eb9db183sewardj 20b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_rwlock_wrlock( &rwl ); assert(r == 0); 21b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_rwlock_unlock( &rwl ); assert(r == 0); 22b411202f9ff33a587558e2e836626bc7eb9db183sewardj 23b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_rwlock_rdlock( &rwl ); assert(r == 0); 24b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_rwlock_rdlock( &rwl ); assert(r == 0); 25b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_rwlock_unlock( &rwl ); assert(r == 0); 26b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_rwlock_unlock( &rwl ); assert(r == 0); 27b411202f9ff33a587558e2e836626bc7eb9db183sewardj 28b411202f9ff33a587558e2e836626bc7eb9db183sewardj /* this should fail - lock is unowned now */ 298eb8bab992e3998c33770b0cdb16059a8b918a06sewardj r = pthread_rwlock_unlock( &rwl ); 308eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#if defined(VGO_darwin) || defined(VGO_solaris) 318eb8bab992e3998c33770b0cdb16059a8b918a06sewardj assert(r != 0); 328eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#else 338eb8bab992e3998c33770b0cdb16059a8b918a06sewardj assert(r == 0); 348eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#endif 35b411202f9ff33a587558e2e836626bc7eb9db183sewardj 36b411202f9ff33a587558e2e836626bc7eb9db183sewardj r = pthread_rwlock_destroy( &rwl ); assert(r == 0); 37b411202f9ff33a587558e2e836626bc7eb9db183sewardj 38b411202f9ff33a587558e2e836626bc7eb9db183sewardj return 0; 39b411202f9ff33a587558e2e836626bc7eb9db183sewardj} 40