ROOT logo
// $Id: GCondition.cxx 2764 2012-06-09 03:17:46Z 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/.


//______________________________________________________________________
// GCondition
//
// pthread condition variable + mutex.
// Lock/Unlock for Signal() and Broadcast() is made automatically,
// for wait operations it *must* be called from outside.

#include "GCondition.h"

#include <errno.h>
#include <sys/time.h>
#include <unistd.h>

//______________________________________________________________________________
//
// POSIX condition-variable wrapper class.
//
// Inherits from GMutex so that is automatically associated with this
// condition. So, simply lock/unlock the condition variable object to
// ensure that no signals are missed.
//

ClassImp(GCondition);

/**************************************************************************/

GCondition::GCondition(GMutex::Init_e e) : GMutex(e)
{
  pthread_cond_init(&mCond, 0);
}

GCondition::~GCondition()
{
  pthread_cond_destroy(&mCond);
}

/**************************************************************************/

Int_t GCondition::Wait()
{
  // Performs wait ... mutex should be locked upon calling this method.

  int ret = pthread_cond_wait(&mCond, &mMut);
  return ret;
}

Int_t GCondition::TimedWait(GTime time)
{
  // Performs timedwait for interval time.
  // Mutex should be locked upon calling this method.
  // Returns 1 for time-out, 0 for other cases.

  return TimedWaitUntil(time + GTime::Now());
}

Int_t GCondition::TimedWaitUntil(GTime time)
{
  // Performs timedwait until time.
  // Mutex should be locked upon calling this method.
  // Returns 1 for time-out, 0 for other cases.

  struct timespec timeout;
  timeout.tv_sec  = time.GetSec();
  timeout.tv_nsec = time.GetNSec();

  int retcode = pthread_cond_timedwait(&mCond, &mMut, &timeout);
  if (retcode == ETIMEDOUT)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}

Int_t GCondition::Signal()
{
  int ret = pthread_cond_signal(&mCond);
  return ret;
}

Int_t GCondition::Broadcast()
{
  int ret = pthread_cond_broadcast(&mCond);
  return ret;
}

Int_t GCondition::LockSignal()
{
  Lock();
  int ret = pthread_cond_signal(&mCond);
  Unlock();
  return ret;
}

Int_t GCondition::LockBroadcast()
{
  Lock();
  int ret = pthread_cond_broadcast(&mCond);
  Unlock();
  return ret;
}

 GCondition.cxx:1
 GCondition.cxx:2
 GCondition.cxx:3
 GCondition.cxx:4
 GCondition.cxx:5
 GCondition.cxx:6
 GCondition.cxx:7
 GCondition.cxx:8
 GCondition.cxx:9
 GCondition.cxx:10
 GCondition.cxx:11
 GCondition.cxx:12
 GCondition.cxx:13
 GCondition.cxx:14
 GCondition.cxx:15
 GCondition.cxx:16
 GCondition.cxx:17
 GCondition.cxx:18
 GCondition.cxx:19
 GCondition.cxx:20
 GCondition.cxx:21
 GCondition.cxx:22
 GCondition.cxx:23
 GCondition.cxx:24
 GCondition.cxx:25
 GCondition.cxx:26
 GCondition.cxx:27
 GCondition.cxx:28
 GCondition.cxx:29
 GCondition.cxx:30
 GCondition.cxx:31
 GCondition.cxx:32
 GCondition.cxx:33
 GCondition.cxx:34
 GCondition.cxx:35
 GCondition.cxx:36
 GCondition.cxx:37
 GCondition.cxx:38
 GCondition.cxx:39
 GCondition.cxx:40
 GCondition.cxx:41
 GCondition.cxx:42
 GCondition.cxx:43
 GCondition.cxx:44
 GCondition.cxx:45
 GCondition.cxx:46
 GCondition.cxx:47
 GCondition.cxx:48
 GCondition.cxx:49
 GCondition.cxx:50
 GCondition.cxx:51
 GCondition.cxx:52
 GCondition.cxx:53
 GCondition.cxx:54
 GCondition.cxx:55
 GCondition.cxx:56
 GCondition.cxx:57
 GCondition.cxx:58
 GCondition.cxx:59
 GCondition.cxx:60
 GCondition.cxx:61
 GCondition.cxx:62
 GCondition.cxx:63
 GCondition.cxx:64
 GCondition.cxx:65
 GCondition.cxx:66
 GCondition.cxx:67
 GCondition.cxx:68
 GCondition.cxx:69
 GCondition.cxx:70
 GCondition.cxx:71
 GCondition.cxx:72
 GCondition.cxx:73
 GCondition.cxx:74
 GCondition.cxx:75
 GCondition.cxx:76
 GCondition.cxx:77
 GCondition.cxx:78
 GCondition.cxx:79
 GCondition.cxx:80
 GCondition.cxx:81
 GCondition.cxx:82
 GCondition.cxx:83
 GCondition.cxx:84
 GCondition.cxx:85
 GCondition.cxx:86
 GCondition.cxx:87
 GCondition.cxx:88
 GCondition.cxx:89
 GCondition.cxx:90
 GCondition.cxx:91
 GCondition.cxx:92
 GCondition.cxx:93
 GCondition.cxx:94
 GCondition.cxx:95
 GCondition.cxx:96
 GCondition.cxx:97
 GCondition.cxx:98
 GCondition.cxx:99
 GCondition.cxx:100
 GCondition.cxx:101
 GCondition.cxx:102
 GCondition.cxx:103
 GCondition.cxx:104
 GCondition.cxx:105
 GCondition.cxx:106
 GCondition.cxx:107
 GCondition.cxx:108
 GCondition.cxx:109
 GCondition.cxx:110
 GCondition.cxx:111