summaryrefslogtreecommitdiff
path: root/ACE/examples/APG/ThreadManagement/Signals.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/examples/APG/ThreadManagement/Signals.cpp')
-rw-r--r--ACE/examples/APG/ThreadManagement/Signals.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/ACE/examples/APG/ThreadManagement/Signals.cpp b/ACE/examples/APG/ThreadManagement/Signals.cpp
new file mode 100644
index 00000000000..85547ed3249
--- /dev/null
+++ b/ACE/examples/APG/ThreadManagement/Signals.cpp
@@ -0,0 +1,93 @@
+// $Id$
+
+#include "ace/config-lite.h"
+#if defined (ACE_HAS_THREADS)
+
+#include "ace/OS_NS_time.h"
+#include "ace/OS_NS_unistd.h"
+#include "ace/Task.h"
+#include "ace/Log_Msg.h"
+#include "ace/Signal.h"
+#include "ace/Sig_Handler.h"
+
+// Listing 1 code/ch13
+class SignalableTask : public ACE_Task<ACE_MT_SYNCH>
+{
+public:
+ virtual int handle_signal (int signum,
+ siginfo_t * = 0,
+ ucontext_t * = 0)
+ {
+ if (signum == SIGUSR1)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%t) received a %S signal\n"),
+ signum));
+ handle_alert ();
+ }
+ return 0;
+ }
+
+ virtual int svc (void)
+ {
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) Starting thread\n")));
+
+ while (1)
+ {
+ ACE_Message_Block* mb = 0;
+ ACE_Time_Value tv (0, 1000);
+ tv += ACE_OS::time (0);
+ int result = this->getq (mb, &tv);
+ if (result == -1 && errno == EWOULDBLOCK)
+ continue;
+ else
+ process_message (mb);
+ }
+
+ ACE_NOTREACHED (return 0);
+ }
+
+ void handle_alert ();
+ void process_message (ACE_Message_Block *mb);
+};
+// Listing 1
+
+void
+SignalableTask::process_message (ACE_Message_Block *)
+{
+}
+
+void
+SignalableTask::handle_alert ()
+{
+}
+
+// Listing 2 code/ch13
+int ACE_TMAIN (int, ACE_TCHAR *[])
+{
+ SignalableTask handler;
+ handler.activate (THR_NEW_LWP | THR_JOINABLE , 5);
+
+ ACE_Sig_Handler sh;
+ sh.register_handler (SIGUSR1, &handler);
+
+ ACE_OS::sleep (1);
+
+ ACE_Thread_Manager::instance () ->
+ kill_grp (handler.grp_id (), SIGUSR1);
+ handler.wait ();
+ return 0;
+}
+// Listing 2
+
+#else
+#include "ace/OS_main.h"
+#include "ace/OS_NS_stdio.h"
+
+int ACE_TMAIN (int, ACE_TCHAR *[])
+{
+ ACE_OS::puts (ACE_TEXT ("This example requires threads."));
+ return 0;
+}
+
+#endif /* ACE_HAS_THREADS */