diff options
Diffstat (limited to 'ACE/examples/C++NPv2/WFMO_Reactor_Logging_Server.cpp')
-rw-r--r-- | ACE/examples/C++NPv2/WFMO_Reactor_Logging_Server.cpp | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/ACE/examples/C++NPv2/WFMO_Reactor_Logging_Server.cpp b/ACE/examples/C++NPv2/WFMO_Reactor_Logging_Server.cpp new file mode 100644 index 00000000000..2174cd20412 --- /dev/null +++ b/ACE/examples/C++NPv2/WFMO_Reactor_Logging_Server.cpp @@ -0,0 +1,145 @@ +/* +** $Id$ +** +** Copyright 2002 Addison Wesley. All Rights Reserved. +*/ + +#include "ace/config-all.h" + +#if defined (ACE_WIN32) + +#include "ace/Reactor.h" +#include "ace/WFMO_Reactor.h" +#include "ace/Thread_Manager.h" +#include "ace/OS_NS_string.h" + +#include "Reactor_Logging_Server_T.h" +#include "Logging_Acceptor_Ex.h" +#include "Logging_Event_Handler_Ex.h" + +class Quit_Handler : public ACE_Event_Handler { +private: + ACE_Manual_Event quit_seen_; + +public: + Quit_Handler (ACE_Reactor *r) : ACE_Event_Handler (r) { + SetConsoleMode (ACE_STDIN, ENABLE_LINE_INPUT + | ENABLE_ECHO_INPUT + | ENABLE_PROCESSED_INPUT); + if (reactor ()->register_handler + (this, quit_seen_.handle ()) == -1 + || ACE_Event_Handler::register_stdin_handler + (this, r, ACE_Thread_Manager::instance ()) == -1) + r->end_reactor_event_loop (); + } + + ~Quit_Handler () { + ACE_Event_Handler::remove_stdin_handler + (reactor (), ACE_Thread_Manager::instance ()); + reactor ()->remove_handler (quit_seen_.handle (), + ACE_Event_Handler::DONT_CALL); + } + + virtual int handle_input (ACE_HANDLE h) { + CHAR user_input[BUFSIZ]; + DWORD count; + if (!ReadFile (h, user_input, BUFSIZ, &count, 0)) + return -1; + + user_input[count] = '\0'; + if (ACE_OS::strncmp (user_input, "quit", 4) == 0) + return -1; + return 0; + } + + virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask) { + quit_seen_.signal (); + return 0; + } + + virtual int handle_signal (int, siginfo_t *, ucontext_t *) { + reactor ()->end_reactor_event_loop (); + return 0; + } +}; + + +class Logging_Event_Handler_WFMO : public Logging_Event_Handler_Ex +{ +public: + Logging_Event_Handler_WFMO (ACE_Reactor *r) + : Logging_Event_Handler_Ex (r) {} + +protected: + int handle_input (ACE_HANDLE) { + ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, monitor, lock_, -1); + return logging_handler_.log_record (); + } + + ACE_Thread_Mutex lock_; // Serialize threads in thread pool. +}; + + +class Logging_Acceptor_WFMO : public Logging_Acceptor_Ex +{ +public: + // Simple constructor to pass ACE_Reactor to base class. + Logging_Acceptor_WFMO (ACE_Reactor *r = ACE_Reactor::instance ()) + : Logging_Acceptor_Ex (r) {}; + +protected: + virtual int handle_input (ACE_HANDLE) { + Logging_Event_Handler_WFMO *peer_handler = 0; + ACE_NEW_RETURN (peer_handler, + Logging_Event_Handler_WFMO (reactor ()), + -1); + + if (acceptor_.accept (peer_handler->peer ()) == -1) { + delete peer_handler; + return -1; + } else if (peer_handler->open () == -1) { + peer_handler->handle_close (); + return -1; + } + return 0; + } +}; + + +static ACE_THR_FUNC_RETURN event_loop (void *arg) { + ACE_Reactor *reactor = static_cast<ACE_Reactor *> (arg); + + reactor->owner (ACE_OS::thr_self ()); + reactor->run_reactor_event_loop (); + return 0; +} + + +typedef Reactor_Logging_Server<Logging_Acceptor_WFMO> + Server_Logging_Daemon; + + +int main (int argc, char *argv[]) +{ + const size_t N_THREADS = 4; + ACE_WFMO_Reactor wfmo_reactor; + ACE_Reactor reactor (&wfmo_reactor); + + Server_Logging_Daemon *server; + // Ignore argv[0]... + --argc; ++argv; + ACE_NEW_RETURN (server, + Server_Logging_Daemon (argc, argv, &reactor), + 1); + Quit_Handler quit_handler (&reactor); + ACE_Thread_Manager::instance ()->spawn_n + (N_THREADS, event_loop, &reactor); + return ACE_Thread_Manager::instance ()->wait (); +} + +#else /* !ACE_WIN32 */ +int main (int, char *[]) +{ + return 0; +} +#endif /* ACE_WIN32 */ |