ROOT logo
// $Id: GSpinLock.cxx 2382 2010-05-30 10:29:19Z 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/.

#include "GSpinLock.h"
#include <Gled/GledTypes.h>
#include <errno.h>

//______________________________________________________________________________
//
// POSIX spin-lock wrapper class.
//

ClassImp(GSpinLock);

GSpinLock::GSpinLock()
{
#ifdef __APPLE__
  mSpinLock = 0;
#else
  int ret = pthread_spin_init(&mSpinLock, PTHREAD_PROCESS_PRIVATE);
  if (ret) {
    perror("GSpinLock::GSpinLock");
  }
#endif
}

GSpinLock::~GSpinLock()
{
#ifndef __APPLE__
  int ret = pthread_spin_destroy(&mSpinLock);
  if (ret) {
    perror("GSpinLock::~GSpinLock");
  }
#endif
}

GSpinLock::Lock_e GSpinLock::Lock()
{
#ifdef __APPLE__
  OSSpinLockLock(&mSpinLock);
  return ok;
#else
  int ret = pthread_spin_lock(&mSpinLock);
  switch (ret) {
  case 0:	return ok;
  case EDEADLK:	return deadlock;
  default:	return bad_init;
  }
#endif
}

GSpinLock::Lock_e GSpinLock::TryLock()
{
#ifdef __APPLE__
  return OSSpinLockTry(&mSpinLock) ? ok : busy;
#else
  int ret = pthread_spin_trylock(&mSpinLock);
  switch (ret) {
  case 0:	return ok;
  case EBUSY:	return busy;
  default:	return bad_init;
  }
#endif
}

GSpinLock::Lock_e GSpinLock::Unlock()
{
#ifdef __APPLE__
  OSSpinLockUnlock(&mSpinLock);
  return ok;
#else
  int ret = pthread_spin_unlock(&mSpinLock);
  switch(ret) {
  case 0:	return ok;
  case EPERM:	return perm_fail;
  default:	return bad_init;
  }
#endif
}
 GSpinLock.cxx:1
 GSpinLock.cxx:2
 GSpinLock.cxx:3
 GSpinLock.cxx:4
 GSpinLock.cxx:5
 GSpinLock.cxx:6
 GSpinLock.cxx:7
 GSpinLock.cxx:8
 GSpinLock.cxx:9
 GSpinLock.cxx:10
 GSpinLock.cxx:11
 GSpinLock.cxx:12
 GSpinLock.cxx:13
 GSpinLock.cxx:14
 GSpinLock.cxx:15
 GSpinLock.cxx:16
 GSpinLock.cxx:17
 GSpinLock.cxx:18
 GSpinLock.cxx:19
 GSpinLock.cxx:20
 GSpinLock.cxx:21
 GSpinLock.cxx:22
 GSpinLock.cxx:23
 GSpinLock.cxx:24
 GSpinLock.cxx:25
 GSpinLock.cxx:26
 GSpinLock.cxx:27
 GSpinLock.cxx:28
 GSpinLock.cxx:29
 GSpinLock.cxx:30
 GSpinLock.cxx:31
 GSpinLock.cxx:32
 GSpinLock.cxx:33
 GSpinLock.cxx:34
 GSpinLock.cxx:35
 GSpinLock.cxx:36
 GSpinLock.cxx:37
 GSpinLock.cxx:38
 GSpinLock.cxx:39
 GSpinLock.cxx:40
 GSpinLock.cxx:41
 GSpinLock.cxx:42
 GSpinLock.cxx:43
 GSpinLock.cxx:44
 GSpinLock.cxx:45
 GSpinLock.cxx:46
 GSpinLock.cxx:47
 GSpinLock.cxx:48
 GSpinLock.cxx:49
 GSpinLock.cxx:50
 GSpinLock.cxx:51
 GSpinLock.cxx:52
 GSpinLock.cxx:53
 GSpinLock.cxx:54
 GSpinLock.cxx:55
 GSpinLock.cxx:56
 GSpinLock.cxx:57
 GSpinLock.cxx:58
 GSpinLock.cxx:59
 GSpinLock.cxx:60
 GSpinLock.cxx:61
 GSpinLock.cxx:62
 GSpinLock.cxx:63
 GSpinLock.cxx:64
 GSpinLock.cxx:65
 GSpinLock.cxx:66
 GSpinLock.cxx:67
 GSpinLock.cxx:68
 GSpinLock.cxx:69
 GSpinLock.cxx:70
 GSpinLock.cxx:71
 GSpinLock.cxx:72
 GSpinLock.cxx:73
 GSpinLock.cxx:74
 GSpinLock.cxx:75
 GSpinLock.cxx:76
 GSpinLock.cxx:77
 GSpinLock.cxx:78
 GSpinLock.cxx:79
 GSpinLock.cxx:80
 GSpinLock.cxx:81
 GSpinLock.cxx:82