// Common, groups Unix, Treads
// Copyright 2001 Alexander Liss

//     	Declaration of classes
//	ARWLockAttributes, ARWLock, AReadFunctionLock, AWriteFunctionLock
//
//	useful for cache management


#ifndef __RWLOCK_H__
#define __RWLOCK_H__

#include <pthread.h>


class ARWLock;

class ARWLockAttributes 
{
friend class ARWLock;
public:

	int status;
	
    	ARWLockAttributes();
    
    	~ARWLockAttributes();
    	
    	int set_shared();
    	    	

private:

        pthread_rwlockattr_t attributes;
};


	// ARWLock
	

class ARWLock 
{
ARWLock(const ARWLock& z);		// forbidden
ARWLock& operator=(const ARWLock& z);	// forbidden
public:

	int status;

    	ARWLock();
    	
    	ARWLock(const ARWLockAttributes&);
		
	~ARWLock();
      
      	int try_read_lock();
      	
	int read_lock();
	
	int try_write_lock();
	
	int write_lock();
      
	int unlock();
	
private:

	pthread_rwlock_t  rwlock; 	 	    
};


	// AReadFunctionLock

class AReadFunctionLock
{
AReadFunctionLock(const AReadFunctionLock&);
AReadFunctionLock& operator=(const AReadFunctionLock&);
public:

	AReadFunctionLock(ARWLock& c):rwlock(&c)
	{ if(rwlock) rwlock->read_lock(); }
	
	~AReadFunctionLock()
	{ if(rwlock) rwlock->unlock(); }

private:

        ARWLock * rwlock;
};

	// AWriteFunctionLock

class AWriteFunctionLock
{
AWriteFunctionLock(const AWriteFunctionLock&);
AWriteFunctionLock& operator=(const AWriteFunctionLock&);
public:

	AWriteFunctionLock(ARWLock& c):rwlock(&c)
	{ if(rwlock) rwlock->write_lock(); }
	
	~AWriteFunctionLock()
	{ if(rwlock) rwlock->unlock(); }

private:

        ARWLock * rwlock;
};


#endif