#ifndef GledCore_GMutex_H
#define GledCore_GMutex_H
#include <Rtypes.h>
#ifndef __CINT__
#include <pthread.h>
#endif
class ZGlass;
class GMutex
{
protected:
#ifndef __CINT__
  pthread_mutex_t	mMut;	
#endif
public:
  enum Init_e { fast, recursive, error_checking };
  enum Lock_e { ok=0, bad_init, deadlock, busy, perm_fail };
  GMutex(Init_e e=fast);
  ~GMutex();
  Lock_e Lock();
  Lock_e TryLock();
  Lock_e Unlock();
#ifndef __CINT__
#include "GMutex.h7"
#endif
  ClassDefNV(GMutex, 0);
}; 
class GMutexHolder
{
  GMutex& mMutex;
public:
  GMutexHolder(GMutex& m) : mMutex(m) { mMutex.Lock();   }
  virtual ~GMutexHolder()             { mMutex.Unlock(); }
  ClassDef(GMutexHolder, 0);
};
class GMutexAntiHolder
{
  GMutex& mMutex;
public:
  GMutexAntiHolder(GMutex& m) : mMutex(m) { mMutex.Unlock();   }
  virtual ~GMutexAntiHolder()             { mMutex.Lock(); }
  ClassDef(GMutexAntiHolder, 0);
};
class GLensReadHolder
{
  ZGlass* mLens;
public:
  GLensReadHolder(ZGlass* lens);
  virtual ~GLensReadHolder();
  ClassDef(GLensReadHolder, 0);
};
class GLensWriteHolder
{
  ZGlass* mLens;
public:
  GLensWriteHolder(ZGlass* lens);
  virtual ~GLensWriteHolder();
  ClassDef(GLensWriteHolder, 0);
};
#endif