mxw_wotlk_azerothcore/deps/acelite/ace/Signal.h

253 lines
6.7 KiB
C++

// -*- C++ -*-
//=============================================================================
/**
* @file Signal.h
*
* @author Douglas C. Schmidt <schmidt@cs.wustl.edu>
*/
//=============================================================================
#ifndef ACE_SIGNAL_H
#define ACE_SIGNAL_H
#include /**/ "ace/pre.h"
#include /**/ "ace/config-lite.h"
#if defined (ACE_DONT_INCLUDE_ACE_SIGNAL_H)
# error ace/Signal.h was #included instead of signal.h by ace/OS_NS_signal.h: fix!!!!
#endif /* ACE_DONT_INCLUDE_ACE_SIGNAL_H */
#include /**/ "ace/ACE_export.h"
#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
#include "ace/OS_NS_signal.h"
/// Type of the extended signal handler.
typedef void (*ACE_Sig_Handler_Ex) (int, siginfo_t *siginfo, ucontext_t *ucontext);
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
/**
* @class ACE_Sig_Set
*
* @brief Provide a C++ wrapper for the C sigset_t interface.
*
* Handle signals via a more elegant C++ interface (e.g.,
* doesn't require the use of global variables or global
* functions in an application).
*/
class ACE_Export ACE_Sig_Set
{
public:
/// Initialize <sigset_> with @a sigset. If @a sigset == 0 then fill
/// the set.
ACE_Sig_Set (sigset_t *sigset);
/// Initialize <sigset_> with @a sigset. If @a sigset == 0 then fill
/// the set.
ACE_Sig_Set (ACE_Sig_Set *sigset);
/// If @a fill == 0 then initialize the <sigset_> to be empty, else
/// full.
ACE_Sig_Set (int fill = 0);
~ACE_Sig_Set (void);
/// Create a set that excludes all signals defined by the system.
int empty_set (void);
/// Create a set that includes all signals defined by the system.
int fill_set (void);
/// Adds the individual signal specified by @a signo to the set.
int sig_add (int signo);
/// Deletes the individual signal specified by @a signo from the set.
int sig_del (int signo);
/// Checks whether the signal specified by @a signo is in the set.
int is_member (int signo) const;
/// Returns a pointer to the underlying @c sigset_t.
operator sigset_t *();
/// Returns a copy of the underlying @c sigset_t.
sigset_t sigset (void) const;
/// Dump the state of an object.
void dump (void) const;
/// Declare the dynamic allocation hooks.
ACE_ALLOC_HOOK_DECLARE;
private:
/// Set of signals.
sigset_t sigset_;
};
/**
* @class ACE_Sig_Action
*
* @brief C++ wrapper facade for the @c sigaction struct.
*/
class ACE_Export ACE_Sig_Action
{
public:
// = Initialization methods.
/// Default constructor. Initializes everything to 0.
ACE_Sig_Action (void);
/// Assigns the various fields of a @c sigaction struct but doesn't
/// register for signal handling via the @c sigaction function.
ACE_Sig_Action (ACE_SignalHandler handler,
sigset_t *sigmask = 0,
int flags = 0);
/// Assigns the various fields of a @c sigaction struct but doesn't
/// register for signal handling via the @c sigaction function.
ACE_Sig_Action (ACE_SignalHandler handler,
const ACE_Sig_Set &sigmask,
int flags = 0);
/**
* Assigns the various fields of a @c sigaction struct and registers
* the @a handler to process signal @a signum via the @c sigaction
* function.
*/
ACE_Sig_Action (ACE_SignalHandler handler,
int signum,
sigset_t *sigmask = 0,
int flags = 0);
/**
* Assigns the various fields of a @c sigaction struct and registers
* the @a handler to process signal @a signum via the @c sigaction
* function.
*/
ACE_Sig_Action (ACE_SignalHandler handler,
int signum,
const ACE_Sig_Set &sigmask,
int flags = 0);
/**
* Assigns the various fields of a @c sigaction struct and registers
* the @a handler to process all @a signalss via the @c sigaction
* function.
*/
ACE_Sig_Action (const ACE_Sig_Set &signalss,
ACE_SignalHandler handler,
const ACE_Sig_Set &sigmask,
int flags = 0);
/**
* Assigns the various fields of a @c sigaction struct and registers
* the @a handler to process all @a signalss via the @c sigaction
* function.
*/
ACE_Sig_Action (const ACE_Sig_Set &signalss,
ACE_SignalHandler handler,
sigset_t *sigmask = 0,
int flags = 0);
/// Copy constructor.
ACE_Sig_Action (const ACE_Sig_Action &s);
/// Default dtor.
~ACE_Sig_Action (void);
// = Signal action management.
/// Register @c this as the current disposition and store old
/// disposition into @a oaction if it is non-NULL.
int register_action (int signum,
ACE_Sig_Action *oaction = 0);
/// Assign the value of @a oaction to @c this and make it become the
/// new signal disposition.
int restore_action (int signum,
ACE_Sig_Action &oaction);
/// Retrieve the current disposition into @c this.
int retrieve_action (int signum);
/// Set current signal action.
void set (struct sigaction *);
/// Get current signal action.
struct sigaction *get (void);
operator struct sigaction *();
/// Set current signal flags.
void flags (int);
/// Get current signal flags.
int flags (void);
/// Set current signal mask.
void mask (sigset_t *);
void mask (ACE_Sig_Set &);
/// Get current signal mask.
sigset_t *mask (void);
/// Set current signal handler (pointer to function).
void handler (ACE_SignalHandler);
/// Get current signal handler (pointer to function).
ACE_SignalHandler handler (void);
/// Dump the state of an object.
void dump (void) const;
/// Declare the dynamic allocation hooks.
ACE_ALLOC_HOOK_DECLARE;
private:
/// Controls signal behavior.
struct sigaction sa_;
};
/**
* @class ACE_Sig_Guard
*
* @brief Hold signals in MASK for duration of a C++ statement block.
* Note that a "0" for mask causes all signals to be held.
*/
class ACE_Export ACE_Sig_Guard
{
public:
// = Initialization and termination methods.
/// This is kind of conditional Guard, needed when guard should be
/// activated only when a specific condition met. When condition ==
/// true (default), Guard is activated
ACE_Sig_Guard (ACE_Sig_Set *mask = 0, bool condition = true);
/// Restore blocked signals.
~ACE_Sig_Guard (void);
/// Dump the state of an object.
void dump (void) const;
/// Declare the dynamic allocation hooks.
ACE_ALLOC_HOOK_DECLARE;
private:
/// Original signal mask.
ACE_Sig_Set omask_;
/// Guard Condition
bool condition_;
};
ACE_END_VERSIONED_NAMESPACE_DECL
#if defined (__ACE_INLINE__)
#include "ace/Signal.inl"
#endif /* __ACE_INLINE__ */
#include /**/ "ace/post.h"
#endif /* ACE_SIGNAL_HANDLER_H */