ASSA::SigHandler Class Reference

#include <SigHandler.h>

Inheritance diagram for ASSA::SigHandler:

Inheritance graph
[legend]
Collaboration diagram for ASSA::SigHandler:

Collaboration graph
[legend]
List of all members.

Public Member Functions

virtual int install (int signum_, EventHandler *new_hand_, SigAction *new_disp_=0, EventHandler **old_hand_=0, SigAction *old_disp_=0)
 Add new signal handler and new disposition for the signal.
virtual int remove (int signum_, EventHandler *eh_=0, SigAction *new_disp_=0, SigAction *old_disp_=0)
 Remove EventHandler associated with signum_.
EventHandlerhandler (int signum_, EventHandler *new_)
 Set new event handler for signal signum_ and return an existing one.
EventHandlerhandler (int signum_)
 Retrieve current event handler for signum_.

Static Public Member Functions

static void dispatch (int signum_)
 Here is the heart of SigHandler class.

Protected Member Functions

int in_range (int signum_)
 Check that signum_ is in valid range.

Static Private Attributes

static EventHandlerm_signal_handlers [NSIG]
 Static array that stores one user-defined event handler pointer for every signal.

Detailed Description

Definition at line 49 of file SigHandler.h.


Member Function Documentation

void SigHandler::dispatch int  signum_  )  [static]
 

Here is the heart of SigHandler class.

This callback function is really registered with OS to catch all of the signals EventHandlers have been installed for. dispatch () catches the signal and then calls sends the signal to the appropriate EventHandler object.

Parameters:
signum_ signal delivered by OS.
Returns:
0 on success, -1 on error

Reimplemented in ASSA::SigHandlers.

Definition at line 130 of file SigHandler.cpp.

References ASSA::EventHandler::handle_signal(), m_signal_handlers, ASSA::SIGHAND, and trace_with_mask.

Referenced by install().

00131 {
00132     trace_with_mask("SigHandler::dispatch", SIGHAND);
00133   
00134     /*--- save errno ---*/
00135     int my_errno = errno;
00136 
00137     EventHandler *eh = m_signal_handlers[signum_];
00138 
00139     if (eh != 0 && eh->handle_signal(signum_) == -1) {
00140         /*--- 
00141           we are in trouble, fall back to defaults 
00142           ---*/
00143         SigAction defact((C_SIG_HANDLER) SIG_DFL);
00144         m_signal_handlers[signum_] = 0;
00145         defact.register_action(signum_);
00146     }
00147     /*--- restore errno ---*/
00148     errno = my_errno;
00149 }

EventHandler * SigHandler::handler int  signum_  ) 
 

Retrieve current event handler for signum_.

Definition at line 58 of file SigHandler.cpp.

References in_range(), m_signal_handlers, ASSA::SIGHAND, and trace_with_mask.

00059 {
00060     trace_with_mask("SigHandler::handler", SIGHAND);
00061 
00062     if ( in_range (signum_) == -1 ) 
00063         return 0;
00064 
00065     return m_signal_handlers[signum_];
00066 }

EventHandler * SigHandler::handler int  signum_,
EventHandler new_
 

Set new event handler for signal signum_ and return an existing one.

Returns:
Pointer to the old event handler, or 0 if signum_ is out of range.

Definition at line 42 of file SigHandler.cpp.

References in_range(), m_signal_handlers, ASSA::SIGHAND, and trace_with_mask.

Referenced by install().

00043 {
00044     trace_with_mask("SigHandler::handler(int, EH*)", SIGHAND);
00045     
00046 
00047     if (in_range(signum_) == -1)
00048         return 0;
00049 
00050     EventHandler* oh = m_signal_handlers[signum_];
00051     m_signal_handlers[signum_] = newh_;
00052 
00053     return oh;
00054 }

int SigHandler::in_range int  signum_  )  [protected]
 

Check that signum_ is in valid range.

Returns:
0 if in range; -1 otherwise.

Definition at line 27 of file SigHandler.cpp.

References DL, ASSA::SIGHAND, and trace_with_mask.

Referenced by handler(), ASSA::SigHandlers::install(), install(), ASSA::SigHandlers::remove(), and remove().

00028 {
00029     trace_with_mask("SigHandler::in_range", SIGHAND);
00030 
00031     if ( signum_ >= 1 && signum_ < NSIG) {
00032         return 0;
00033     }
00034     else {
00035         DL((SIGHAND,"signum_ %d is out of range [1;%d]\n", NSIG));
00036         return -1;
00037     }
00038 }

int SigHandler::install int  signum_,
EventHandler new_hand_,
SigAction new_disp_ = 0,
EventHandler **  old_hand_ = 0,
SigAction old_disp_ = 0
[virtual]
 

Add new signal handler and new disposition for the signal.

Note that although new_disp_ might keep C-like handler for the action, new_hand_ will really be handling delivered signal. In other words, new_disp_.sa_handler is ignored.

Parameters:
signum_ signal number new disposition is installed for.
new_hand_ pointer to new EventHandler that will be handling the signal
new_disp_ new disposition to use in handling the signal
old_hand_ return old handler for the signal
old_disp_ return old disposition for the signal
Returns:
0 on success, -1 on error

Reimplemented in ASSA::SigHandlers.

Definition at line 70 of file SigHandler.cpp.

References dispatch(), ASSA::SigAction::handler(), handler(), in_range(), ASSA::SigAction::register_action(), ASSA::SigAction::retrieve_action(), ASSA::SIGHAND, and trace_with_mask.

Referenced by ASSA::Fork::Fork().

00072 {
00073     trace_with_mask("SigHandler::install", SIGHAND);
00074 
00075     if (in_range (signum_) == -1) 
00076         return -1;
00077 
00078     /*--- replace old Event Handler ptr with new one in my internal 
00079       dispatch table, returning the old one.
00080       ---*/
00081     EventHandler* eh = handler(signum_, new_hand_);
00082     
00083     /*--- if I am given place to store, save old handler ---*/
00084     if (old_hand_ != 0) 
00085         *old_hand_ = eh;
00086     
00087     /*--- retrieve old disposition ---*/
00088     if (old_disp_ != 0) {
00089         old_disp_->retrieve_action (signum_);
00090         old_disp_->handler ((C_SIG_HANDLER) SIG_DFL);
00091     }
00092     
00093     /*--- if new disposition is NULL, use null action instead ---*/
00094     SigAction null_sa;  
00095     
00096     if (new_disp_ == 0) 
00097         new_disp_ = &null_sa;
00098     
00099     /*--- install my dispatcher ---*/
00100     new_disp_->handler((C_SIG_HANDLER) SigHandler::dispatch);
00101     
00102     return new_disp_->register_action(signum_, old_disp_);
00103 }

int SigHandler::remove int  signum_,
EventHandler eh_ = 0,
SigAction new_disp_ = 0,
SigAction old_disp_ = 0
[virtual]
 

Remove EventHandler associated with signum_.

Also, install new disposition and return an old one (if given).

Parameters:
signum_ signal number new disposition is installed for.
eh_ pointer to EventHandler that is uninstalled. If eh_ is 0 (by default), all event handlers associated with signum_ will be removed.
new_disp_ new disposition to use in handling the signal
old_disp_ return old disposition for the signal
Returns:
0 on success, -1 on error

Reimplemented in ASSA::SigHandlers.

Definition at line 107 of file SigHandler.cpp.

References in_range(), m_signal_handlers, ASSA::SigAction::register_action(), ASSA::SIGHAND, and trace_with_mask.

Referenced by ASSA::Fork::Fork().

00109 {
00110     trace_with_mask("SigHandler::remove", SIGHAND);
00111 
00112     if (in_range(signum_) == -1) 
00113         return -1;
00114     /*--- 
00115       We need default disposition here if user forgot to give us one.
00116       ---*/
00117     SigAction sa ((C_SIG_HANDLER) SIG_DFL);
00118 
00119     if (new_disp_ == 0) {
00120         new_disp_ = &sa;
00121     }
00122 
00123     m_signal_handlers[signum_] = 0;
00124     
00125     return new_disp_->register_action (signum_, old_disp_);
00126 }


Member Data Documentation

EventHandler * SigHandler::m_signal_handlers [static, private]
 

Static array that stores one user-defined event handler pointer for every signal.

Definition at line 123 of file SigHandler.h.

Referenced by dispatch(), handler(), and remove().


The documentation for this class was generated from the following files:
Generated on Sun Aug 13 15:08:21 2006 for libassa by  doxygen 1.4.6