ROOT logo
// @(#)root/base:$Id: TSysEvtHandler.h 21455 2007-12-18 15:44:33Z rdm $
// Author: Fons Rademakers   16/09/95

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TSysEvtHandler
#define ROOT_TSysEvtHandler


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TSysEvtHandler                                                       //
//                                                                      //
// Abstract base class for handling system events.                      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TObject
#include "TObject.h"
#endif
#ifndef ROOT_TQObject
#include "TQObject.h"
#endif


class TSysEvtHandler : public TObject, public TQObject {

private:
   Bool_t   fIsActive;    // kTRUE if handler is active, kFALSE if not active

   void  *GetSender() { return this; }  //used to set gTQSender

public:
   TSysEvtHandler() : fIsActive(kTRUE) { }
   virtual ~TSysEvtHandler() { }

   void             Activate();
   void             DeActivate();
   Bool_t           IsActive() const { return fIsActive; }

   virtual void     Add()    = 0;
   virtual void     Remove() = 0;
   virtual Bool_t   Notify() = 0;

   virtual void     Activated()   { Emit("Activated()"); }   //*SIGNAL*
   virtual void     DeActivated() { Emit("DeActivated()"); } //*SIGNAL*
   virtual void     Notified()    { Emit("Notified()"); }    //*SIGNAL*
   virtual void     Added()       { Emit("Added()"); }       //*SIGNAL*
   virtual void     Removed()     { Emit("Removed()"); }     //*SIGNAL*

   ClassDef(TSysEvtHandler,0)  //ABC for handling system events
};


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TFileHandler                                                         //
//                                                                      //
// Handles events on file descriptors.                                  //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

class TFileHandler : public TSysEvtHandler {

protected:
   int  fFileNum;     //File descriptor
   int  fMask;        //Event interest mask, either bit 1 (read), 2 (write) or both can be set
   int  fReadyMask;   //Readiness mask, either bit 1 (read), 2 (write) or both can be set

   TFileHandler(): fFileNum(-1), fMask(0), fReadyMask(0) { }

public:
   enum { kRead = 1, kWrite = 2 };

   TFileHandler(int fd, int mask);
   virtual ~TFileHandler() { Remove(); }
   int             GetFd() const { return fFileNum; }
   void            SetFd(int fd) { fFileNum = fd; }
   virtual Bool_t  Notify();
   virtual Bool_t  ReadNotify();
   virtual Bool_t  WriteNotify();
   virtual Bool_t  HasReadInterest();
   virtual Bool_t  HasWriteInterest();
   virtual void    SetInterest(Int_t mask);
   virtual void    ResetReadyMask() { fReadyMask = 0; }
   virtual void    SetReadReady() { fReadyMask |= 0x1; }
   virtual void    SetWriteReady() { fReadyMask |= 0x2; }
   virtual Bool_t  IsReadReady() const { return (fReadyMask & 0x1) == 0x1; }
   virtual Bool_t  IsWriteReady() const { return (fReadyMask & 0x2) == 0x2; }
   virtual void    Add();
   virtual void    Remove();

   ClassDef(TFileHandler,0)  //Handles events on file descriptors
};


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TSignalHandler                                                       //
//                                                                      //
// Handles signals.                                                     //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

enum ESignals {
   kSigBus,
   kSigSegmentationViolation,
   kSigSystem,
   kSigPipe,
   kSigIllegalInstruction,
   kSigQuit,
   kSigInterrupt,
   kSigWindowChanged,
   kSigAlarm,
   kSigChild,
   kSigUrgent,
   kSigFloatingException,
   kSigTermination,
   kSigUser1,
   kSigUser2
};


class TSignalHandler : public TSysEvtHandler {

protected:
   ESignals    fSignal;   //Signal to be handled
   Bool_t      fSync;     //Synchronous or a-synchronous signal
   Int_t       fDelay;    //Delay handling of signal (use fDelay in Notify())

   TSignalHandler(): fSignal((ESignals)-1), fSync(kTRUE), fDelay(0) { }

public:
   TSignalHandler(ESignals sig, Bool_t sync = kTRUE);
   virtual ~TSignalHandler() { Remove(); }
   void           Delay() { fDelay = 1; }
   void           HandleDelayedSignal();
   ESignals       GetSignal() const { return fSignal; }
   void           SetSignal(ESignals sig) { fSignal = sig; }
   Bool_t         IsSync() const { return fSync; }
   Bool_t         IsAsync() const { return !fSync; }
   virtual Bool_t Notify();
   virtual void   Add();
   virtual void   Remove();

   ClassDef(TSignalHandler,0)  //Signal event handler
};

inline void TSignalHandler::HandleDelayedSignal()
{
   if (fDelay > 1) {
      fDelay = 0;
      Notify();
   } else
      fDelay = 0;
}


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TStdExceptionHandler                                                 //
//                                                                      //
// Handles standard C++ exceptions.                                     //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

namespace std { class exception; }

class TStdExceptionHandler : public TSysEvtHandler {

public:
   enum EStatus { kSEProceed, kSEHandled, kSEAbort };

   TStdExceptionHandler();
   virtual ~TStdExceptionHandler() { }

   virtual void     Add();
   virtual void     Remove();
   virtual Bool_t   Notify();

   virtual EStatus  Handle(std::exception& exc) = 0;

   ClassDef(TStdExceptionHandler,0)  //C++ exception handler
};

#endif
 TSysEvtHandler.h:1
 TSysEvtHandler.h:2
 TSysEvtHandler.h:3
 TSysEvtHandler.h:4
 TSysEvtHandler.h:5
 TSysEvtHandler.h:6
 TSysEvtHandler.h:7
 TSysEvtHandler.h:8
 TSysEvtHandler.h:9
 TSysEvtHandler.h:10
 TSysEvtHandler.h:11
 TSysEvtHandler.h:12
 TSysEvtHandler.h:13
 TSysEvtHandler.h:14
 TSysEvtHandler.h:15
 TSysEvtHandler.h:16
 TSysEvtHandler.h:17
 TSysEvtHandler.h:18
 TSysEvtHandler.h:19
 TSysEvtHandler.h:20
 TSysEvtHandler.h:21
 TSysEvtHandler.h:22
 TSysEvtHandler.h:23
 TSysEvtHandler.h:24
 TSysEvtHandler.h:25
 TSysEvtHandler.h:26
 TSysEvtHandler.h:27
 TSysEvtHandler.h:28
 TSysEvtHandler.h:29
 TSysEvtHandler.h:30
 TSysEvtHandler.h:31
 TSysEvtHandler.h:32
 TSysEvtHandler.h:33
 TSysEvtHandler.h:34
 TSysEvtHandler.h:35
 TSysEvtHandler.h:36
 TSysEvtHandler.h:37
 TSysEvtHandler.h:38
 TSysEvtHandler.h:39
 TSysEvtHandler.h:40
 TSysEvtHandler.h:41
 TSysEvtHandler.h:42
 TSysEvtHandler.h:43
 TSysEvtHandler.h:44
 TSysEvtHandler.h:45
 TSysEvtHandler.h:46
 TSysEvtHandler.h:47
 TSysEvtHandler.h:48
 TSysEvtHandler.h:49
 TSysEvtHandler.h:50
 TSysEvtHandler.h:51
 TSysEvtHandler.h:52
 TSysEvtHandler.h:53
 TSysEvtHandler.h:54
 TSysEvtHandler.h:55
 TSysEvtHandler.h:56
 TSysEvtHandler.h:57
 TSysEvtHandler.h:58
 TSysEvtHandler.h:59
 TSysEvtHandler.h:60
 TSysEvtHandler.h:61
 TSysEvtHandler.h:62
 TSysEvtHandler.h:63
 TSysEvtHandler.h:64
 TSysEvtHandler.h:65
 TSysEvtHandler.h:66
 TSysEvtHandler.h:67
 TSysEvtHandler.h:68
 TSysEvtHandler.h:69
 TSysEvtHandler.h:70
 TSysEvtHandler.h:71
 TSysEvtHandler.h:72
 TSysEvtHandler.h:73
 TSysEvtHandler.h:74
 TSysEvtHandler.h:75
 TSysEvtHandler.h:76
 TSysEvtHandler.h:77
 TSysEvtHandler.h:78
 TSysEvtHandler.h:79
 TSysEvtHandler.h:80
 TSysEvtHandler.h:81
 TSysEvtHandler.h:82
 TSysEvtHandler.h:83
 TSysEvtHandler.h:84
 TSysEvtHandler.h:85
 TSysEvtHandler.h:86
 TSysEvtHandler.h:87
 TSysEvtHandler.h:88
 TSysEvtHandler.h:89
 TSysEvtHandler.h:90
 TSysEvtHandler.h:91
 TSysEvtHandler.h:92
 TSysEvtHandler.h:93
 TSysEvtHandler.h:94
 TSysEvtHandler.h:95
 TSysEvtHandler.h:96
 TSysEvtHandler.h:97
 TSysEvtHandler.h:98
 TSysEvtHandler.h:99
 TSysEvtHandler.h:100
 TSysEvtHandler.h:101
 TSysEvtHandler.h:102
 TSysEvtHandler.h:103
 TSysEvtHandler.h:104
 TSysEvtHandler.h:105
 TSysEvtHandler.h:106
 TSysEvtHandler.h:107
 TSysEvtHandler.h:108
 TSysEvtHandler.h:109
 TSysEvtHandler.h:110
 TSysEvtHandler.h:111
 TSysEvtHandler.h:112
 TSysEvtHandler.h:113
 TSysEvtHandler.h:114
 TSysEvtHandler.h:115
 TSysEvtHandler.h:116
 TSysEvtHandler.h:117
 TSysEvtHandler.h:118
 TSysEvtHandler.h:119
 TSysEvtHandler.h:120
 TSysEvtHandler.h:121
 TSysEvtHandler.h:122
 TSysEvtHandler.h:123
 TSysEvtHandler.h:124
 TSysEvtHandler.h:125
 TSysEvtHandler.h:126
 TSysEvtHandler.h:127
 TSysEvtHandler.h:128
 TSysEvtHandler.h:129
 TSysEvtHandler.h:130
 TSysEvtHandler.h:131
 TSysEvtHandler.h:132
 TSysEvtHandler.h:133
 TSysEvtHandler.h:134
 TSysEvtHandler.h:135
 TSysEvtHandler.h:136
 TSysEvtHandler.h:137
 TSysEvtHandler.h:138
 TSysEvtHandler.h:139
 TSysEvtHandler.h:140
 TSysEvtHandler.h:141
 TSysEvtHandler.h:142
 TSysEvtHandler.h:143
 TSysEvtHandler.h:144
 TSysEvtHandler.h:145
 TSysEvtHandler.h:146
 TSysEvtHandler.h:147
 TSysEvtHandler.h:148
 TSysEvtHandler.h:149
 TSysEvtHandler.h:150
 TSysEvtHandler.h:151
 TSysEvtHandler.h:152
 TSysEvtHandler.h:153
 TSysEvtHandler.h:154
 TSysEvtHandler.h:155
 TSysEvtHandler.h:156
 TSysEvtHandler.h:157
 TSysEvtHandler.h:158
 TSysEvtHandler.h:159
 TSysEvtHandler.h:160
 TSysEvtHandler.h:161
 TSysEvtHandler.h:162
 TSysEvtHandler.h:163
 TSysEvtHandler.h:164
 TSysEvtHandler.h:165
 TSysEvtHandler.h:166
 TSysEvtHandler.h:167
 TSysEvtHandler.h:168
 TSysEvtHandler.h:169
 TSysEvtHandler.h:170
 TSysEvtHandler.h:171
 TSysEvtHandler.h:172
 TSysEvtHandler.h:173
 TSysEvtHandler.h:174
 TSysEvtHandler.h:175
 TSysEvtHandler.h:176
 TSysEvtHandler.h:177
 TSysEvtHandler.h:178
 TSysEvtHandler.h:179
 TSysEvtHandler.h:180
 TSysEvtHandler.h:181
 TSysEvtHandler.h:182
 TSysEvtHandler.h:183
 TSysEvtHandler.h:184
 TSysEvtHandler.h:185
 TSysEvtHandler.h:186
 TSysEvtHandler.h:187
 TSysEvtHandler.h:188
 TSysEvtHandler.h:189
 TSysEvtHandler.h:190
 TSysEvtHandler.h:191
 TSysEvtHandler.h:192