ROOT logo
// $Id: GSpinLock.h 2451 2010-09-29 20:58:29Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#ifndef GledCore_GSpinLock_H
#define GledCore_GSpinLock_H

#include <Rtypes.h>
#ifndef __CINT__
 #ifdef __APPLE__
  #include <libkern/OSAtomic.h>
 #else
  #include <pthread.h>
 #endif
#endif

/**************************************************************************/
// GSpinLock
/**************************************************************************/

class GSpinLock
{
protected:
#ifndef __CINT__
 #ifdef __APPLE__
  OSSpinLock            mSpinLock;
 #else
  pthread_spinlock_t	mSpinLock;
 #endif
#endif

public:
  enum Lock_e { ok=0, bad_init, deadlock, busy, perm_fail };

  GSpinLock();
  ~GSpinLock();

  Lock_e Lock();
  Lock_e TryLock();
  Lock_e Unlock();

  ClassDefNV(GSpinLock, 0);
}; // endclass GSpinLock


/**************************************************************************/
// GSpinLockHolder / AntiHolder
/**************************************************************************/

class GSpinLockHolder
{
  GSpinLock& mMutex;
public:
  GSpinLockHolder(GSpinLock& m) : mMutex(m) { mMutex.Lock();   }
  virtual ~GSpinLockHolder()                { mMutex.Unlock(); }

  ClassDef(GSpinLockHolder, 0);
};

// Usability of AntiHolder limited to cases when you're sure
// the mutex is locked exactly once.

class GSpinLockAntiHolder
{
  GSpinLock& mMutex;
public:
  GSpinLockAntiHolder(GSpinLock& m) : mMutex(m) { mMutex.Unlock();   }
  virtual ~GSpinLockAntiHolder()             { mMutex.Lock(); }

  ClassDef(GSpinLockAntiHolder, 0);
};

#endif
 GSpinLock.h:1
 GSpinLock.h:2
 GSpinLock.h:3
 GSpinLock.h:4
 GSpinLock.h:5
 GSpinLock.h:6
 GSpinLock.h:7
 GSpinLock.h:8
 GSpinLock.h:9
 GSpinLock.h:10
 GSpinLock.h:11
 GSpinLock.h:12
 GSpinLock.h:13
 GSpinLock.h:14
 GSpinLock.h:15
 GSpinLock.h:16
 GSpinLock.h:17
 GSpinLock.h:18
 GSpinLock.h:19
 GSpinLock.h:20
 GSpinLock.h:21
 GSpinLock.h:22
 GSpinLock.h:23
 GSpinLock.h:24
 GSpinLock.h:25
 GSpinLock.h:26
 GSpinLock.h:27
 GSpinLock.h:28
 GSpinLock.h:29
 GSpinLock.h:30
 GSpinLock.h:31
 GSpinLock.h:32
 GSpinLock.h:33
 GSpinLock.h:34
 GSpinLock.h:35
 GSpinLock.h:36
 GSpinLock.h:37
 GSpinLock.h:38
 GSpinLock.h:39
 GSpinLock.h:40
 GSpinLock.h:41
 GSpinLock.h:42
 GSpinLock.h:43
 GSpinLock.h:44
 GSpinLock.h:45
 GSpinLock.h:46
 GSpinLock.h:47
 GSpinLock.h:48
 GSpinLock.h:49
 GSpinLock.h:50
 GSpinLock.h:51
 GSpinLock.h:52
 GSpinLock.h:53
 GSpinLock.h:54
 GSpinLock.h:55
 GSpinLock.h:56
 GSpinLock.h:57
 GSpinLock.h:58
 GSpinLock.h:59
 GSpinLock.h:60
 GSpinLock.h:61
 GSpinLock.h:62
 GSpinLock.h:63
 GSpinLock.h:64
 GSpinLock.h:65
 GSpinLock.h:66
 GSpinLock.h:67
 GSpinLock.h:68
 GSpinLock.h:69
 GSpinLock.h:70
 GSpinLock.h:71
 GSpinLock.h:72
 GSpinLock.h:73
 GSpinLock.h:74
 GSpinLock.h:75