#include <SigHandler.h>
Inheritance diagram for ASSA::SigHandler:
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_. | |
EventHandler * | handler (int signum_, EventHandler *new_) |
Set new event handler for signal signum_ and return an existing one. | |
EventHandler * | handler (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 EventHandler * | m_signal_handlers [NSIG] |
Static array that stores one user-defined event handler pointer for every signal. |
Definition at line 49 of file SigHandler.h.
|
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.
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 }
|
|
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 }
|
|
Set new event handler for signal signum_ and return an existing one.
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 }
|
|
Check that signum_ is in valid range.
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 }
|
|
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.
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 }
|
|
Remove EventHandler associated with signum_. Also, install new disposition and return an old one (if given).
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 }
|
|
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(). |