summaryrefslogtreecommitdiff
path: root/ACE/ace/Signal.h
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/ace/Signal.h')
-rw-r--r--ACE/ace/Signal.h267
1 files changed, 267 insertions, 0 deletions
diff --git a/ACE/ace/Signal.h b/ACE/ace/Signal.h
new file mode 100644
index 00000000000..edb091c1cbd
--- /dev/null
+++ b/ACE/ace/Signal.h
@@ -0,0 +1,267 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Signal.h
+ *
+ * $Id$
+ *
+ * @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:
+ // = Initialization and termination methods.
+ /// 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 <signo> to the set.
+ int sig_add (int signo);
+
+ /// Deletes the individual signal specified by <signo> from the set.
+ int sig_del (int signo);
+
+ /// Checks whether the signal specified by <signo> is in the set.
+ int is_member (int signo) const;
+
+ /// Returns a pointer to the underlying <sigset_t>.
+ operator sigset_t *();
+
+ /// Returns a copy of the underlying <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 <sigaction> struct but doesn't
+ /// register for signal handling via the <sigaction> function.
+ ACE_Sig_Action (ACE_SignalHandler handler,
+ sigset_t *sigmask = 0,
+ int flags = 0);
+
+ /// Assigns the various fields of a <sigaction> struct but doesn't
+ /// register for signal handling via the <sigaction> function.
+ ACE_Sig_Action (ACE_SignalHandler handler,
+ const ACE_Sig_Set &sigmask,
+ int flags = 0);
+
+ /**
+ * Assigns the various fields of a <sigaction> struct and registers
+ * the <handler> to process signal <signum> via the <sigaction>
+ * function.
+ */
+ ACE_Sig_Action (ACE_SignalHandler handler,
+ int signum,
+ sigset_t *sigmask = 0,
+ int flags = 0);
+
+ /**
+ * Assigns the various fields of a <sigaction> struct and registers
+ * the <handler> to process signal <signum> via the <sigaction>
+ * function.
+ */
+ ACE_Sig_Action (ACE_SignalHandler handler,
+ int signum,
+ const ACE_Sig_Set &sigmask,
+ int flags = 0);
+
+
+ // @@ The next two methods have a parameter as "signalss". Please do
+ // not change the argument name as "signals". This causes the
+ // following problem as reported by
+ // <James.Briggs@dsto.defence.gov.au>.
+
+ // In the file Signal.h two of the functions have and argument name
+ // of signals. signals is a Qt macro (to do with their meta object
+ // stuff.
+ // We could as well have it as "signal", but I am nost sure whether
+ // that would cause a problem with something else - Bala <bala@cs>
+
+ /**
+ * Assigns the various fields of a <sigaction> struct and registers
+ * the <handler> to process all <signals> via the <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 <sigaction> struct and registers
+ * the <handler> to process all <signals> via the <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 <this> as the current disposition and store old
+ /// disposition into <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 spcific 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 */