summaryrefslogtreecommitdiff
path: root/ACE/examples/C++NPv1/Thread_Per_Connection_Logging_Server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/examples/C++NPv1/Thread_Per_Connection_Logging_Server.cpp')
-rw-r--r--ACE/examples/C++NPv1/Thread_Per_Connection_Logging_Server.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/ACE/examples/C++NPv1/Thread_Per_Connection_Logging_Server.cpp b/ACE/examples/C++NPv1/Thread_Per_Connection_Logging_Server.cpp
new file mode 100644
index 00000000000..bcf836acf7e
--- /dev/null
+++ b/ACE/examples/C++NPv1/Thread_Per_Connection_Logging_Server.cpp
@@ -0,0 +1,93 @@
+/*
+** $Id$
+**
+** Copyright 2001 Addison Wesley. All Rights Reserved.
+*/
+
+#include "ace/Auto_Ptr.h"
+#include "ace/FILE_IO.h"
+#include "ace/Log_Msg.h"
+#include "ace/Signal.h"
+#include "ace/Thread_Manager.h"
+
+#include "Thread_Per_Connection_Logging_Server.h"
+#include "Logging_Handler.h"
+
+#include <errno.h>
+
+namespace {
+ extern "C" void sigterm_handler (int /* signum */) { /* No-op. */ }
+}
+
+
+ACE_THR_FUNC_RETURN Thread_Per_Connection_Logging_Server::run_svc (void *arg)
+{
+ auto_ptr<Thread_Args> thread_args (static_cast<Thread_Args *> (arg));
+
+ thread_args->this_->handle_data (&thread_args->logging_peer_);
+ thread_args->logging_peer_.close ();
+ return 0; // Return value is ignored
+}
+
+
+int
+Thread_Per_Connection_Logging_Server::handle_connections ()
+{
+ auto_ptr<Thread_Args> thread_args (new Thread_Args (this));
+
+ if (acceptor ().accept (thread_args->logging_peer_) == -1)
+ return -1;
+ if (ACE_Thread_Manager::instance ()->spawn (
+ // Pointer to function entry point.
+ Thread_Per_Connection_Logging_Server::run_svc,
+ // <run_svc> parameter.
+ static_cast<void *> (thread_args.get ()),
+ THR_DETACHED | THR_SCOPE_SYSTEM) == -1)
+ return -1;
+ thread_args.release (); // Spawned thread now owns memory
+ return 0;
+}
+
+
+int
+Thread_Per_Connection_Logging_Server::handle_data (ACE_SOCK_Stream *client)
+{
+ ACE_FILE_IO log_file;
+ // Client's hostname is logfile name.
+ make_log_file (log_file, client);
+
+ // Place the connection into blocking mode since this
+ // thread isn't doing anything except handling this client.
+ client->disable (ACE_NONBLOCK);
+
+ Logging_Handler logging_handler (log_file, *client);
+
+ // Keep handling log records until client closes connection
+ // or this thread is asked to cancel itself.
+ ACE_Thread_Manager *mgr = ACE_Thread_Manager::instance ();
+ ACE_thread_t me = ACE_Thread::self ();
+ while (!mgr->testcancel (me) &&
+ logging_handler.log_record () != -1)
+ continue;
+
+ log_file.close ();
+ return 0;
+}
+
+
+int ACE_TMAIN (int argc, ACE_TCHAR *argv[])
+{
+ // Register to receive the <SIGTERM> signal.
+ ACE_Sig_Action sa ((ACE_SignalHandler) sigterm_handler,
+ SIGTERM);
+
+ Thread_Per_Connection_Logging_Server server;
+
+ if (server.run (argc, argv) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "server.run()"), 1);
+
+ // Cooperative thread cancellation and barrier synchronization.
+ ACE_Thread_Manager::instance ()->cancel_all ();
+ return ACE_Thread_Manager::instance ()->wait ();
+}
+