summaryrefslogtreecommitdiff
path: root/ACE/examples/C++NPv1/Reactive_Logging_Server.h
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/examples/C++NPv1/Reactive_Logging_Server.h')
-rw-r--r--ACE/examples/C++NPv1/Reactive_Logging_Server.h80
1 files changed, 80 insertions, 0 deletions
diff --git a/ACE/examples/C++NPv1/Reactive_Logging_Server.h b/ACE/examples/C++NPv1/Reactive_Logging_Server.h
new file mode 100644
index 00000000000..e7558a16e34
--- /dev/null
+++ b/ACE/examples/C++NPv1/Reactive_Logging_Server.h
@@ -0,0 +1,80 @@
+/*
+** $Id$
+**
+** Copyright 2001 Addison Wesley. All Rights Reserved.
+*/
+
+#ifndef _REACTIVE_LOGGING_SERVER_H
+#define _REACTIVE_LOGGING_SERVER_H
+
+#include "ace/INET_Addr.h"
+#include "ace/SOCK_Acceptor.h"
+#include "ace/SOCK_Stream.h"
+#include "ace/Log_Record.h"
+#include "ace/Handle_Set.h"
+#include "ace/Basic_Types.h"
+#include "ace/os_include/os_fcntl.h"
+#include "Iterative_Logging_Server.h"
+
+class Reactive_Logging_Server : public Iterative_Logging_Server
+{
+protected:
+ // Keep track of the acceptor socket handle and all the
+ // connected stream socket handles.
+ ACE_Handle_Set master_handle_set_;
+
+ // Keep track of handles marked as active by <select>.
+ ACE_Handle_Set active_handles_;
+
+ virtual int open (u_short logger_port) {
+ Iterative_Logging_Server::open (logger_port);
+ master_handle_set_.set_bit (acceptor ().get_handle ());
+ acceptor ().enable (ACE_NONBLOCK);
+ return 0;
+ }
+
+ virtual int wait_for_multiple_events () {
+ active_handles_ = master_handle_set_;
+ int width = (int)active_handles_.max_set () + 1;
+ if (select (width,
+ active_handles_.fdset (),
+ 0, // no write_fds
+ 0, // no except_fds
+ 0) == -1) // no timeout
+ return -1;
+ active_handles_.sync
+ ((ACE_HANDLE) ((intptr_t) active_handles_.max_set () + 1));
+ return 0;
+ }
+
+ virtual int handle_connections () {
+ if (active_handles_.is_set (acceptor ().get_handle ())) {
+ while (acceptor ().accept (logging_handler ().peer ()) == 0)
+ master_handle_set_.set_bit
+ (logging_handler ().peer ().get_handle ());
+
+ // Remove acceptor handle from further consideration.
+ active_handles_.clr_bit (acceptor ().get_handle ());
+ }
+ return 0;
+ }
+
+ virtual int handle_data (ACE_SOCK_Stream *) {
+ ACE_Handle_Set_Iterator peer_iterator (active_handles_);
+
+ for (ACE_HANDLE handle;
+ (handle = peer_iterator ()) != ACE_INVALID_HANDLE;
+ ) {
+ logging_handler ().peer ().set_handle (handle);
+ if (logging_handler ().log_record () == -1) {
+ // Handle connection shutdown or comm failure.
+ master_handle_set_.clr_bit (handle);
+ logging_handler ().close ();
+ }
+ }
+ return 0;
+ }
+
+};
+
+#endif /* _REACTIVE_LOGGING_SERVER_H */