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