////////////////////////////////////////////////////////////
//
// 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);
}