TSysEvtHandler.h

Go to the documentation of this file.
00001 // @(#)root/base:$Id: TSysEvtHandler.h 21455 2007-12-18 15:44:33Z rdm $
00002 // Author: Fons Rademakers   16/09/95
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 #ifndef ROOT_TSysEvtHandler
00013 #define ROOT_TSysEvtHandler
00014 
00015 
00016 //////////////////////////////////////////////////////////////////////////
00017 //                                                                      //
00018 // TSysEvtHandler                                                       //
00019 //                                                                      //
00020 // Abstract base class for handling system events.                      //
00021 //                                                                      //
00022 //////////////////////////////////////////////////////////////////////////
00023 
00024 #ifndef ROOT_TObject
00025 #include "TObject.h"
00026 #endif
00027 #ifndef ROOT_TQObject
00028 #include "TQObject.h"
00029 #endif
00030 
00031 
00032 class TSysEvtHandler : public TObject, public TQObject {
00033 
00034 private:
00035    Bool_t   fIsActive;    // kTRUE if handler is active, kFALSE if not active
00036 
00037    void  *GetSender() { return this; }  //used to set gTQSender
00038 
00039 public:
00040    TSysEvtHandler() : fIsActive(kTRUE) { }
00041    virtual ~TSysEvtHandler() { }
00042 
00043    void             Activate();
00044    void             DeActivate();
00045    Bool_t           IsActive() const { return fIsActive; }
00046 
00047    virtual void     Add()    = 0;
00048    virtual void     Remove() = 0;
00049    virtual Bool_t   Notify() = 0;
00050 
00051    virtual void     Activated()   { Emit("Activated()"); }   //*SIGNAL*
00052    virtual void     DeActivated() { Emit("DeActivated()"); } //*SIGNAL*
00053    virtual void     Notified()    { Emit("Notified()"); }    //*SIGNAL*
00054    virtual void     Added()       { Emit("Added()"); }       //*SIGNAL*
00055    virtual void     Removed()     { Emit("Removed()"); }     //*SIGNAL*
00056 
00057    ClassDef(TSysEvtHandler,0)  //ABC for handling system events
00058 };
00059 
00060 
00061 //////////////////////////////////////////////////////////////////////////
00062 //                                                                      //
00063 // TFileHandler                                                         //
00064 //                                                                      //
00065 // Handles events on file descriptors.                                  //
00066 //                                                                      //
00067 //////////////////////////////////////////////////////////////////////////
00068 
00069 class TFileHandler : public TSysEvtHandler {
00070 
00071 protected:
00072    int  fFileNum;     //File descriptor
00073    int  fMask;        //Event interest mask, either bit 1 (read), 2 (write) or both can be set
00074    int  fReadyMask;   //Readiness mask, either bit 1 (read), 2 (write) or both can be set
00075 
00076    TFileHandler(): fFileNum(-1), fMask(0), fReadyMask(0) { }
00077 
00078 public:
00079    enum { kRead = 1, kWrite = 2 };
00080 
00081    TFileHandler(int fd, int mask);
00082    virtual ~TFileHandler() { Remove(); }
00083    int             GetFd() const { return fFileNum; }
00084    void            SetFd(int fd) { fFileNum = fd; }
00085    virtual Bool_t  Notify();
00086    virtual Bool_t  ReadNotify();
00087    virtual Bool_t  WriteNotify();
00088    virtual Bool_t  HasReadInterest();
00089    virtual Bool_t  HasWriteInterest();
00090    virtual void    SetInterest(Int_t mask);
00091    virtual void    ResetReadyMask() { fReadyMask = 0; }
00092    virtual void    SetReadReady() { fReadyMask |= 0x1; }
00093    virtual void    SetWriteReady() { fReadyMask |= 0x2; }
00094    virtual Bool_t  IsReadReady() const { return (fReadyMask & 0x1) == 0x1; }
00095    virtual Bool_t  IsWriteReady() const { return (fReadyMask & 0x2) == 0x2; }
00096    virtual void    Add();
00097    virtual void    Remove();
00098 
00099    ClassDef(TFileHandler,0)  //Handles events on file descriptors
00100 };
00101 
00102 
00103 //////////////////////////////////////////////////////////////////////////
00104 //                                                                      //
00105 // TSignalHandler                                                       //
00106 //                                                                      //
00107 // Handles signals.                                                     //
00108 //                                                                      //
00109 //////////////////////////////////////////////////////////////////////////
00110 
00111 enum ESignals {
00112    kSigBus,
00113    kSigSegmentationViolation,
00114    kSigSystem,
00115    kSigPipe,
00116    kSigIllegalInstruction,
00117    kSigQuit,
00118    kSigInterrupt,
00119    kSigWindowChanged,
00120    kSigAlarm,
00121    kSigChild,
00122    kSigUrgent,
00123    kSigFloatingException,
00124    kSigTermination,
00125    kSigUser1,
00126    kSigUser2
00127 };
00128 
00129 
00130 class TSignalHandler : public TSysEvtHandler {
00131 
00132 protected:
00133    ESignals    fSignal;   //Signal to be handled
00134    Bool_t      fSync;     //Synchronous or a-synchronous signal
00135    Int_t       fDelay;    //Delay handling of signal (use fDelay in Notify())
00136 
00137    TSignalHandler(): fSignal((ESignals)-1), fSync(kTRUE), fDelay(0) { }
00138 
00139 public:
00140    TSignalHandler(ESignals sig, Bool_t sync = kTRUE);
00141    virtual ~TSignalHandler() { Remove(); }
00142    void           Delay() { fDelay = 1; }
00143    void           HandleDelayedSignal();
00144    ESignals       GetSignal() const { return fSignal; }
00145    void           SetSignal(ESignals sig) { fSignal = sig; }
00146    Bool_t         IsSync() const { return fSync; }
00147    Bool_t         IsAsync() const { return !fSync; }
00148    virtual Bool_t Notify();
00149    virtual void   Add();
00150    virtual void   Remove();
00151 
00152    ClassDef(TSignalHandler,0)  //Signal event handler
00153 };
00154 
00155 inline void TSignalHandler::HandleDelayedSignal()
00156 {
00157    if (fDelay > 1) {
00158       fDelay = 0;
00159       Notify();
00160    } else
00161       fDelay = 0;
00162 }
00163 
00164 
00165 //////////////////////////////////////////////////////////////////////////
00166 //                                                                      //
00167 // TStdExceptionHandler                                                 //
00168 //                                                                      //
00169 // Handles standard C++ exceptions.                                     //
00170 //                                                                      //
00171 //////////////////////////////////////////////////////////////////////////
00172 
00173 namespace std { class exception; }
00174 
00175 class TStdExceptionHandler : public TSysEvtHandler {
00176 
00177 public:
00178    enum EStatus { kSEProceed, kSEHandled, kSEAbort };
00179 
00180    TStdExceptionHandler();
00181    virtual ~TStdExceptionHandler() { }
00182 
00183    virtual void     Add();
00184    virtual void     Remove();
00185    virtual Bool_t   Notify();
00186 
00187    virtual EStatus  Handle(std::exception& exc) = 0;
00188 
00189    ClassDef(TStdExceptionHandler,0)  //C++ exception handler
00190 };
00191 
00192 #endif

Generated on Tue Jul 5 14:10:31 2011 for ROOT_528-00b_version by  doxygen 1.5.1