ROOT logo
// $Id: Mountain.h 2394 2010-06-27 21:37:17Z 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_Mountain_H
#define GledCore_Mountain_H

#include <Glasses/Eventor.h>
#include <Gled/GThread.h>
#include <Gled/GMutex.h>
#include <Gled/GCondition.h>
#include <Gled/GTime.h>

class Mountain;

struct DancerInfo
{
  GThread*		fThread;
  Eventor*		fEventor;
  Mountain*		fMountain;
  Operator::Arg* 	fOpArg;

  bool			fSuspended;
  bool			fSleeping;
  bool			fShouldSuspend;
  bool			fShouldExit;

  DancerInfo(GThread* t, Eventor* e, Mountain* m) :
    fThread(t), fEventor(e), fMountain(m), fOpArg(0),
    fSuspended(false), fSleeping(false),
    fShouldSuspend(false), fShouldExit(false)
  {}

  ~DancerInfo() {}
};

#ifndef __CINT__
typedef hash_map<Eventor*, DancerInfo*>			hEv2DI_t;
typedef hash_map<Eventor*, DancerInfo*>::iterator	hEv2DI_i;
#endif


class Mountain
{
private:
  GMutex		hStageLock;
  GCondition		hSuspendCond;
  bool			bInSuspend;
  UInt_t		hSuspendCount;

protected:
#ifndef __CINT__
  hEv2DI_t		hOnStage;
#endif
  Saturn*		mSaturn;	// X{g}

  void stop_thread(DancerInfo* di);

public:
  Mountain(Saturn* s) : hStageLock(GMutex::recursive), mSaturn(s)
  { bInSuspend = false; }
  virtual ~Mountain() {}

  // Eventor request handling
  void Start(Eventor* e, bool suspend_immediately=false);
  void Stop(Eventor* e);
  void Suspend(Eventor* e);
  void Resume(Eventor* e);
  void Cancel(Eventor* e);

  DancerInfo* UnregisterThread(Eventor* e);
  void WipeThread(Eventor* e);

  // Suspension mechanism
  Int_t SuspendAll();
  void 	ResumeAll();
  void 	ConsiderSuspend(DancerInfo* di);

  // Shutdown ... kill all threads
  void Shutdown();

  static void  DancerCooler(DancerInfo* di);
  static void* DancerBeat(DancerInfo* di);

#include "Mountain.h7"
  ClassDef(Mountain, 0);
}; // endclass Mountain

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