* winsup.api/pthread/rwlock2.c: Ditto. * winsup.api/pthread/rwlock3.c: Ditto. * winsup.api/pthread/rwlock4.c: Ditto. * winsup.api/pthread/rwlock5.c: Ditto. * winsup.api/pthread/rwlock6.c: Ditto.
		
			
				
	
	
		
			70 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * rwlock6.c
 | 
						|
 *
 | 
						|
 * Check writer and reader locking
 | 
						|
 *
 | 
						|
 * Depends on API functions:
 | 
						|
 *      pthread_rwlock_rdlock()
 | 
						|
 *      pthread_rwlock_wrlock()
 | 
						|
 *      pthread_rwlock_unlock()
 | 
						|
 */
 | 
						|
 | 
						|
#include "test.h"
 | 
						|
 | 
						|
static pthread_rwlock_t rwlock1 = PTHREAD_RWLOCK_INITIALIZER;
 | 
						|
 | 
						|
static int bankAccount = 0;
 | 
						|
 | 
						|
void * wrfunc(void * arg)
 | 
						|
{
 | 
						|
  int ba;
 | 
						|
 | 
						|
  assert(pthread_rwlock_wrlock(&rwlock1) == 0);
 | 
						|
  Sleep(2000);
 | 
						|
  bankAccount += 10;
 | 
						|
  ba = bankAccount;
 | 
						|
  assert(pthread_rwlock_unlock(&rwlock1) == 0);
 | 
						|
 | 
						|
  return ((void *) ba);
 | 
						|
}
 | 
						|
 | 
						|
void * rdfunc(void * arg)
 | 
						|
{
 | 
						|
  int ba;
 | 
						|
 | 
						|
  assert(pthread_rwlock_rdlock(&rwlock1) == 0);
 | 
						|
  ba = bankAccount;
 | 
						|
  assert(pthread_rwlock_unlock(&rwlock1) == 0);
 | 
						|
 | 
						|
  return ((void *) ba);
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
main()
 | 
						|
{
 | 
						|
  pthread_t wrt1;
 | 
						|
  pthread_t wrt2;
 | 
						|
  pthread_t rdt;
 | 
						|
  int wr1Result = 0;
 | 
						|
  int wr2Result = 0;
 | 
						|
  int rdResult = 0;
 | 
						|
 | 
						|
  bankAccount = 0;
 | 
						|
 | 
						|
  assert(pthread_create(&wrt1, NULL, wrfunc, NULL) == 0);
 | 
						|
  Sleep(500);
 | 
						|
  assert(pthread_create(&rdt, NULL, rdfunc, NULL) == 0);
 | 
						|
  Sleep(500);
 | 
						|
  assert(pthread_create(&wrt2, NULL, wrfunc, NULL) == 0);
 | 
						|
 | 
						|
  assert(pthread_join(wrt1, (void **) &wr1Result) == 0);
 | 
						|
  assert(pthread_join(rdt, (void **) &rdResult) == 0);
 | 
						|
  assert(pthread_join(wrt2, (void **) &wr2Result) == 0);
 | 
						|
 | 
						|
  assert(wr1Result == 10);
 | 
						|
  assert(rdResult == 20);
 | 
						|
  assert(wr2Result == 20);
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 |