Public Member Functions | Private Attributes

ipc_Shutdown Class Reference

Helper class to shut down on signal. More...

#include <ipc_shutdown.h>

Inheritance diagram for ipc_Shutdown:
Inheritance graph
[legend]
Collaboration diagram for ipc_Shutdown:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 ipc_Shutdown (bool a_shutdownCorbaOnSignal)
virtual void * RunUndetached (void *arg)

Private Attributes

 log_CLASSID_m
const bool m_shutdownCorbaOnSignal

Detailed Description

Helper class to shut down on signal.

Definition at line 46 of file ipc_shutdown.h.


Constructor & Destructor Documentation

ipc_Shutdown::ipc_Shutdown ( bool  a_shutdownCorbaOnSignal  ) 

Definition at line 66 of file ipc_shutdown.cpp.

References log_FUNC_A_m, sem_finalize, sem_hup, sem_signal, and sem_stop.

    : m_shutdownCorbaOnSignal(a_shutdownCorbaOnSignal) {

    log_FUNC_A_m(ipc_Shutdown,
        "shutdown = " << (a_shutdownCorbaOnSignal? "Yes" : "No"));

    sem_init(&sem_signal, 0, 0);
    sem_init(&sem_hup, 0, 0);
    sem_init(&sem_finalize, 0, 0);
    sem_init(&sem_stop, 0, 0);

    {
        struct sigaction action;
        action.sa_handler = SignalHandler;
        sigemptyset(&action.sa_mask);
        action.sa_flags = 0;

#if 0 // -------------------------------------------------

//#define SIGHUP          1       /* Hangup (POSIX).  */
//#define SIGINT          2       /* Interrupt (ANSI).  */
#define SIGQUIT         3       /* Quit (POSIX).  */
#define SIGILL          4       /* Illegal instruction (ANSI).  */
#define SIGTRAP         5       /* Trace trap (POSIX).  */
#define SIGABRT         6       /* Abort (ANSI).  */
#define SIGIOT          6       /* IOT trap (4.2 BSD).  */
#define SIGBUS          7       /* BUS error (4.2 BSD).  */
#define SIGFPE          8       /* Floating-point exception (ANSI).  */
#define SIGUSR1         10      /* User-defined signal 1 (POSIX).  */
#define SIGSEGV         11      /* Segmentation violation (ANSI).  */
#define SIGUSR2         12      /* User-defined signal 2 (POSIX).  */
#define SIGPIPE         13      /* Broken pipe (POSIX).  */
#define SIGALRM         14      /* Alarm clock (POSIX).  */
//#define SIGTERM         15      /* Termination (ANSI).  */
#define SIGSTKFLT       16      /* Stack fault.  */
#define SIGCLD          SIGCHLD /* Same as SIGCHLD (System V).  */
#define SIGCHLD         17      /* Child status has changed (POSIX).  */
#define SIGCONT         18      /* Continue (POSIX).  */
#define SIGSTOP         19      /* Stop, unblockable (POSIX).  */
#define SIGTSTP         20      /* Keyboard stop (POSIX).  */
#define SIGTTIN         21      /* Background read from tty (POSIX).  */
#define SIGTTOU         22      /* Background write to tty (POSIX).  */
#define SIGURG          23      /* Urgent condition on socket (4.2 BSD).  */
#define SIGXCPU         24      /* CPU limit exceeded (4.2 BSD).  */
#define SIGXFSZ         25      /* File size limit exceeded (4.2 BSD).  */
#define SIGVTALRM       26      /* Virtual alarm clock (4.2 BSD).  */
#define SIGPROF         27      /* Profiling alarm clock (4.2 BSD).  */
#define SIGWINCH        28      /* Window size change (4.3 BSD, Sun).  */
#define SIGPOLL         SIGIO   /* Pollable event occurred (System V).  */
#define SIGIO           29      /* I/O now possible (4.2 BSD).  */
#define SIGPWR          30      /* Power failure restart (System V).  */
#define SIGSYS          31      /* Bad system call.  */

#endif // -------------------------------------------------

        sigaction(SIGHUP, &action, 0);
        sigaction(SIGINT, &action, 0);
        sigaction(SIGTERM, &action, 0);
    }
}


Member Function Documentation

void * ipc_Shutdown::RunUndetached ( void *  arg  )  [virtual]

Reimplemented from cmn_Thread.

Definition at line 127 of file ipc_shutdown.cpp.

References dbg_LOW, log_DBG_m, log_FUNC_m, m_shutdownCorbaOnSignal, ipc_Corba::RemoveMajorServant(), sem_finalize, sem_hup, sem_signal, and sem_stop.

                                           {
    log_FUNC_m(RunUndetached);

    for (;;) {
        sem_wait(&sem_signal);
        log_DBG_m(dbg_LOW, "Got semaphore.");

        if (sem_trywait(&sem_stop) == 0) {
            log_DBG_m(dbg_LOW, "Got signal to stop the thread.");
            break;
        };

        if (sem_trywait(&sem_hup) == 0) {
            log_DBG_m(dbg_LOW, "Got SIGHUP.");
            if (m_shutdownCorbaOnSignal) {
                // do whatever you need to do here on SIGHUP (reconfigure, etc.)
                ipc_Corba::RemoveMajorServant();
            }
            else {
                log_DBG_m(dbg_LOW, "NOTE: CORBA will not be shut down. Signal will be ignored.");
            }
        }

        if (sem_trywait(&sem_finalize) == 0) {
            log_DBG_m(dbg_LOW, "Got INIT/SIGTERM.");
            if (m_shutdownCorbaOnSignal) {
                ipc_Corba::RemoveMajorServant();
            }
            else {
                log_DBG_m(dbg_LOW, "NOTE: CORBA will not be shut down. Signal will be ignored.");
            }
            break;
        };
    };
    return NULL;
}

Here is the call graph for this function:


Member Data Documentation

Reimplemented from cmn_Thread.

Definition at line 52 of file ipc_shutdown.h.

Definition at line 54 of file ipc_shutdown.h.

Referenced by RunUndetached().


The documentation for this class was generated from the following files: