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