libassa  3.5.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
Public Member Functions | Static Public Member Functions | Protected Member Functions | Static Private Attributes
ASSA::SigHandler Class Reference

#include <SigHandler.h>

Inheritance diagram for ASSA::SigHandler:
ASSA::SigHandlers

List of all members.

Public Member Functions

virtual ~SigHandler ()
 No-op virtual destructor.
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.


Constructor & Destructor Documentation

virtual ASSA::SigHandler::~SigHandler ( ) [inline, virtual]

No-op virtual destructor.

Definition at line 54 of file SigHandler.h.

{ /* no-op */ }

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::SigAction::register_action(), ASSA::SIGHAND, and trace_with_mask.

Referenced by install().

{
    trace_with_mask("SigHandler::dispatch", SIGHAND);
  
    /*--- save errno ---*/
    int my_errno = errno;

    EventHandler *eh = m_signal_handlers[signum_];

    if (eh != 0 && eh->handle_signal(signum_) == -1) {
        /*--- 
          we are in trouble, fall back to defaults 
          ---*/
        SigAction defact((C_SIG_HANDLER) SIG_DFL);
        m_signal_handlers[signum_] = 0;
        defact.register_action(signum_);
    }
    /*--- restore errno ---*/
    errno = my_errno;
}
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().

{
    trace_with_mask("SigHandler::handler(int, EH*)", SIGHAND);
    

    if (in_range(signum_) == -1)
        return 0;

    EventHandler* oh = m_signal_handlers[signum_];
    m_signal_handlers[signum_] = newh_;

    return oh;
}
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.

{
    trace_with_mask("SigHandler::handler", SIGHAND);

    if ( in_range (signum_) == -1 ) 
        return 0;

    return m_signal_handlers[signum_];
}
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(), install(), ASSA::SigHandlers::install(), remove(), and ASSA::SigHandlers::remove().

{
    trace_with_mask("SigHandler::in_range", SIGHAND);

    if ( signum_ >= 1 && signum_ < NSIG) {
        return 0;
    }
    else {
        DL((SIGHAND,"signum_ %d is out of range [1;%d]\n", NSIG));
        return -1;
    }
}
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(), handler(), ASSA::SigAction::handler(), in_range(), ASSA::SigAction::register_action(), ASSA::SigAction::retrieve_action(), ASSA::SIGHAND, and trace_with_mask.

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

{
    trace_with_mask("SigHandler::install", SIGHAND);

    if (in_range (signum_) == -1) 
        return -1;

    /*--- replace old Event Handler ptr with new one in my internal 
      dispatch table, returning the old one.
      ---*/
    EventHandler* eh = handler(signum_, new_hand_);
    
    /*--- if I am given place to store, save old handler ---*/
    if (old_hand_ != 0) 
        *old_hand_ = eh;
    
    /*--- retrieve old disposition ---*/
    if (old_disp_ != 0) {
        old_disp_->retrieve_action (signum_);
        old_disp_->handler ((C_SIG_HANDLER) SIG_DFL);
    }
    
    /*--- if new disposition is NULL, use null action instead ---*/
    SigAction null_sa;  
    
    if (new_disp_ == 0) 
        new_disp_ = &null_sa;
    
    /*--- install my dispatcher ---*/
    new_disp_->handler((C_SIG_HANDLER) SigHandler::dispatch);
    
    return new_disp_->register_action(signum_, old_disp_);
}
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().

{
    trace_with_mask("SigHandler::remove", SIGHAND);

    if (in_range(signum_) == -1) 
        return -1;
    /*--- 
      We need default disposition here if user forgot to give us one.
      ---*/
    SigAction sa ((C_SIG_HANDLER) SIG_DFL);

    if (new_disp_ == 0) {
        new_disp_ = &sa;
    }

    m_signal_handlers[signum_] = 0;
    
    return new_disp_->register_action (signum_, old_disp_);
}

Member Data Documentation

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

Definition at line 127 of file SigHandler.h.

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


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines