Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TSysEvtHandler.h
Go to the documentation of this file.
1 // @(#)root/base:$Id$
2 // Author: Fons Rademakers 16/09/95
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_TSysEvtHandler
13 #define ROOT_TSysEvtHandler
14 
15 
16 //////////////////////////////////////////////////////////////////////////
17 // //
18 // TSysEvtHandler //
19 // //
20 // Abstract base class for handling system events. //
21 // //
22 //////////////////////////////////////////////////////////////////////////
23 
24 #include "TObject.h"
25 #include "TQObject.h"
26 
27 
28 class TSysEvtHandler : public TObject, public TQObject {
29 
30 private:
31  Bool_t fIsActive; // kTRUE if handler is active, kFALSE if not active
32 
33  void *GetSender() { return this; } //used to set gTQSender
34 
35 public:
36  TSysEvtHandler() : fIsActive(kTRUE) { }
37  virtual ~TSysEvtHandler() { }
38 
39  void Activate();
40  void DeActivate();
41  Bool_t IsActive() const { return fIsActive; }
42 
43  virtual void Add() = 0;
44  virtual void Remove() = 0;
45  virtual Bool_t Notify() = 0;
46 
47  virtual void Activated() { Emit("Activated()"); } //*SIGNAL*
48  virtual void DeActivated() { Emit("DeActivated()"); } //*SIGNAL*
49  virtual void Notified() { Emit("Notified()"); } //*SIGNAL*
50  virtual void Added() { Emit("Added()"); } //*SIGNAL*
51  virtual void Removed() { Emit("Removed()"); } //*SIGNAL*
52 
53  ClassDef(TSysEvtHandler,0) //ABC for handling system events
54 };
55 
56 
57 //////////////////////////////////////////////////////////////////////////
58 // //
59 // TFileHandler //
60 // //
61 // Handles events on file descriptors. //
62 // //
63 //////////////////////////////////////////////////////////////////////////
64 
65 class TFileHandler : public TSysEvtHandler {
66 
67 protected:
68  int fFileNum; //File descriptor
69  int fMask; //Event interest mask, either bit 1 (read), 2 (write) or both can be set
70  int fReadyMask; //Readiness mask, either bit 1 (read), 2 (write) or both can be set
71 
72  TFileHandler(): fFileNum(-1), fMask(0), fReadyMask(0) { }
73 
74 public:
75  enum { kRead = 1, kWrite = 2 };
76 
77  TFileHandler(int fd, int mask);
78  virtual ~TFileHandler() { Remove(); }
79  int GetFd() const { return fFileNum; }
80  void SetFd(int fd) { fFileNum = fd; }
81  virtual Bool_t Notify();
82  virtual Bool_t ReadNotify();
83  virtual Bool_t WriteNotify();
84  virtual Bool_t HasReadInterest();
85  virtual Bool_t HasWriteInterest();
86  virtual void SetInterest(Int_t mask);
87  virtual void ResetReadyMask() { fReadyMask = 0; }
88  virtual void SetReadReady() { fReadyMask |= 0x1; }
89  virtual void SetWriteReady() { fReadyMask |= 0x2; }
90  virtual Bool_t IsReadReady() const { return (fReadyMask & 0x1) == 0x1; }
91  virtual Bool_t IsWriteReady() const { return (fReadyMask & 0x2) == 0x2; }
92  virtual void Add();
93  virtual void Remove();
94 
95  ClassDef(TFileHandler,0) //Handles events on file descriptors
96 };
97 
98 
99 //////////////////////////////////////////////////////////////////////////
100 // //
101 // TSignalHandler //
102 // //
103 // Handles signals. //
104 // //
105 //////////////////////////////////////////////////////////////////////////
106 
107 enum ESignals {
108  kSigBus,
109  kSigSegmentationViolation,
110  kSigSystem,
111  kSigPipe,
112  kSigIllegalInstruction,
113  kSigQuit,
114  kSigInterrupt,
115  kSigWindowChanged,
116  kSigAlarm,
117  kSigChild,
118  kSigUrgent,
119  kSigFloatingException,
120  kSigTermination,
121  kSigUser1,
122  kSigUser2
123 };
124 
125 
126 class TSignalHandler : public TSysEvtHandler {
127 
128 protected:
129  ESignals fSignal; //Signal to be handled
130  Bool_t fSync; //Synchronous or a-synchronous signal
131  Int_t fDelay; //Delay handling of signal (use fDelay in Notify())
132 
133  TSignalHandler(): fSignal((ESignals)-1), fSync(kTRUE), fDelay(0) { }
134 
135 public:
136  TSignalHandler(ESignals sig, Bool_t sync = kTRUE);
137  virtual ~TSignalHandler() { Remove(); }
138  void Delay() { fDelay = 1; }
139  void HandleDelayedSignal();
140  ESignals GetSignal() const { return fSignal; }
141  void SetSignal(ESignals sig) { fSignal = sig; }
142  Bool_t IsSync() const { return fSync; }
143  Bool_t IsAsync() const { return !fSync; }
144  virtual Bool_t Notify();
145  virtual void Add();
146  virtual void Remove();
147 
148  ClassDef(TSignalHandler,0) //Signal event handler
149 };
150 
151 inline void TSignalHandler::HandleDelayedSignal()
152 {
153  if (fDelay > 1) {
154  fDelay = 0;
155  Notify();
156  } else
157  fDelay = 0;
158 }
159 
160 
161 //////////////////////////////////////////////////////////////////////////
162 // //
163 // TStdExceptionHandler //
164 // //
165 // Handles standard C++ exceptions. //
166 // //
167 //////////////////////////////////////////////////////////////////////////
168 
169 namespace std { class exception; }
170 
171 class TStdExceptionHandler : public TSysEvtHandler {
172 
173 public:
174  enum EStatus { kSEProceed, kSEHandled, kSEAbort };
175 
176  TStdExceptionHandler();
177  virtual ~TStdExceptionHandler() { }
178 
179  virtual void Add();
180  virtual void Remove();
181  virtual Bool_t Notify();
182 
183  virtual EStatus Handle(std::exception& exc) = 0;
184 
185  ClassDef(TStdExceptionHandler,0) //C++ exception handler
186 };
187 
188 #endif