ROOT logo
// $Id: GCondition.cxx 2088 2008-11-23 20:26: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::TimedWaitMS(UInt_t wait_ms)
{
  // Performs timedwait ... mutex should be locked upon calling this method.
  // Time given in mili-seconds.
  // Returns 1 for time-out, 0 for other cases.

  struct timeval now;
  struct timespec timeout;

  gettimeofday(&now, 0);
  int mus_add = now.tv_usec + 1000*wait_ms;
  timeout.tv_sec = now.tv_sec + mus_add/1000000;
  timeout.tv_nsec = (mus_add%1000000) * 1000;
  int retcode = pthread_cond_timedwait(&mCond, &mMut, &timeout);
  if(retcode == ETIMEDOUT) {
    return 1;
  } else {
    return 0;
  }
}

Int_t GCondition::TimedWaitMuS(UInt_t wait_mus)
{
  // Performs timedwait ... mutex should be locked upon calling this method.
  // Time given in micro-seconds.
  // Returns 1 for time-out, 0 for other cases.

  struct timeval now;
  struct timespec timeout;

  gettimeofday(&now, 0);
  int mus_add = now.tv_usec + wait_mus;
  timeout.tv_sec = now.tv_sec + mus_add/1000000;
  timeout.tv_nsec = (mus_add%1000000) * 1000;
  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
 GCondition.cxx:112
 GCondition.cxx:113
 GCondition.cxx:114
 GCondition.cxx:115
 GCondition.cxx:116
 GCondition.cxx:117
 GCondition.cxx:118
 GCondition.cxx:119
 GCondition.cxx:120
 GCondition.cxx:121
 GCondition.cxx:122
 GCondition.cxx:123