summaryrefslogtreecommitdiff
path: root/ACE/apps/JAWS3/jaws3/Signal_Task.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/apps/JAWS3/jaws3/Signal_Task.cpp')
-rw-r--r--ACE/apps/JAWS3/jaws3/Signal_Task.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/ACE/apps/JAWS3/jaws3/Signal_Task.cpp b/ACE/apps/JAWS3/jaws3/Signal_Task.cpp
new file mode 100644
index 00000000000..24c79eec032
--- /dev/null
+++ b/ACE/apps/JAWS3/jaws3/Signal_Task.cpp
@@ -0,0 +1,83 @@
+// $Id$
+
+#include "ace/OS_NS_signal.h"
+#include "ace/OS_NS_Thread.h"
+#include "ace/Thread.h"
+
+#ifndef JAWS_BUILD_DLL
+#define JAWS_BUILD_DLL
+#endif
+
+#include "jaws3/Signal_Task.h"
+#include "jaws3/Event_Dispatcher.h"
+#include "jaws3/THYBRID_Concurrency.h"
+#include "jaws3/TPOOL_Concurrency.h"
+#include "jaws3/TPR_Concurrency.h"
+
+
+ACE_THR_FUNC_RETURN
+JAWS_Signal_Task_function (void *)
+{
+ int done = 0;
+
+ while (! done)
+ {
+ int signo = ACE_OS::sigwait (JAWS_Signal_Task::instance ()->sigset ());
+
+ switch (signo)
+ {
+ case SIGINT:
+ case SIGTERM:
+
+ JAWS_Concurrency::instance ()->shutdown ();
+ JAWS_Event_Dispatcher::end_event_loop ();
+
+ done = 1;
+
+ break;
+# if !defined (ACE_WIN32)
+ case SIGHUP:
+ // In the future, re-read jaws.conf and svc.conf,
+ // and then reset the JAWS singletons.
+ // For now, just ignore it.
+ break;
+
+ case SIGPIPE:
+#endif // !defined (ACE_WIN32)
+ default:
+ break;
+
+ }
+
+ }
+
+ return 0;
+}
+
+
+JAWS_Signal_Task::JAWS_Signal_Task (void)
+{
+ // Set our signal mask.
+ this->sigset_.empty_set ();
+
+ this->sigset_.sig_add (SIGINT);
+ this->sigset_.sig_add (SIGTERM);
+ this->sigset_.sig_add (SIGPIPE);
+
+#if 0
+ this->sigset_.fill_set ();
+#endif
+
+ ACE_OS::sigprocmask (SIG_BLOCK, this->sigset_, 0);
+
+ int result;
+ result = ACE_Thread::spawn ( JAWS_Signal_Task_function
+ , 0
+ , THR_BOUND
+ );
+ if (result < 0)
+ {
+ ACE_ERROR ((LM_ERROR, "%p\n", "ACE_Thread::spawn"));
+ return;
+ }
+}