////////////////////////////////////////////////////////////
//
//     	Declaration of classes
//	AMutexAttributes, AMutex, AFunctionLock
//
//      Copyright 2001 
//
////////////////////////////////////////////////////////////

#ifndef __MUTEX_H__
#define __MUTEX_H__

#include <pthread.h>
 
      // AMutexAttributes

class AMutex;


class AMutexAttributes 
{
friend class AMutex;
public:

	int status;
	
	AMutexAttributes();
	
	~AMutexAttributes();
	
	// for POSIX kernel threads default PTHREAD_MUTEX_DEFAULT
      	int set_type(int z); 	
	
      	
      	int set_shared(); // used with many processes
      	             	
        // default PTHREAD_PRIO_NONE
      	int set_protocol(int z); 
  
      	int set_ceiling(int z);
      	  
  
private:

	pthread_mutexattr_t attributes;       
};


	// AMutex
	
class ACondition;

class AMutex 
{
friend int AWait(ACondition& condition,AMutex& mutex);
friend int AWait(ACondition& condition,AMutex& mutex,unsigned timeout_milliseconds);
AMutex(const AMutex& z);		// forbidden
AMutex& operator=(const AMutex& z);	// forbidden
public:

	int status;

    	// default attributes
    	AMutex();
	
	AMutex(const AMutexAttributes& z);
	
	~AMutex();
      
      	int trylock();
      	
	int lock();
      
	int unlock();
	
private:

	pthread_mutex_t  mutex; 	 	    
};


	// AFunctionLock

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

	AFunctionLock(AMutex& c):mutex(&c)
	{ if(mutex) mutex->lock(); }
	
	~AFunctionLock()
	{ if(mutex) mutex->unlock(); }

private:

        AMutex * mutex;
};


#endif