////////////////////////////////////////////////////////////
//
//     	Implementation of classes
//	ARWLockAttributes, ARWLock
//
//      Copyright 2001 
//
////////////////////////////////////////////////////////////



#include "ARWLock.h"


pthread_rwlock_t RWLockPattern = PTHREAD_RWLOCK_INITIALIZER;


	// ARWLockAttributes

ARWLockAttributes::ARWLockAttributes()
{ 
   	
    	 status = ::pthread_rwlockattr_init(&attributes); 
}
    
ARWLockAttributes::~ARWLockAttributes()
{ 
    	
    	  if(!status) ::pthread_rwlockattr_destroy(&attributes); 
}

    	
int ARWLockAttributes::set_shared()
{ 
	if(status) return -1;
    	  
	return ::pthread_rwlockattr_setpshared(&attributes,PTHREAD_PROCESS_SHARED); 
}


     	  

	// ARWLock
	
ARWLock::ARWLock():status(0)
{ 
	
	  rwlock = RWLockPattern;
	  
	  status = ::pthread_rwlock_init(&rwlock,0);

}

ARWLock::ARWLock(const ARWLockAttributes& z)
{
	rwlock = RWLockPattern;
	
	status = ::pthread_rwlock_init(&rwlock,&z.attributes);
}
	
	
ARWLock::~ARWLock()
{ 
	if(!status) 
		::pthread_rwlock_destroy(&rwlock); 
}
      
int ARWLock::try_read_lock()
{ 
	if(status) return -1;
	
      	return ::pthread_rwlock_tryrdlock(&rwlock); 
}
      	
int ARWLock::read_lock()
{ 
	if(status) return -1;
	
	return ::pthread_rwlock_rdlock(&rwlock); 
}

int ARWLock::try_write_lock()
{ 
	if(status) return -1;
	
      	return ::pthread_rwlock_trywrlock(&rwlock); 
}
      	
int ARWLock::write_lock()
{ 
	if(status) return -1;
	
	return ::pthread_rwlock_wrlock(&rwlock); 
}
      
int ARWLock::unlock()
{ 
	if(status) return -1;
	
	return ::pthread_rwlock_unlock(&rwlock); 
}