diff options
Diffstat (limited to 'ACE/examples/NT_Service/ntsvc.cpp')
-rw-r--r-- | ACE/examples/NT_Service/ntsvc.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/ACE/examples/NT_Service/ntsvc.cpp b/ACE/examples/NT_Service/ntsvc.cpp new file mode 100644 index 00000000000..f21dec5dad7 --- /dev/null +++ b/ACE/examples/NT_Service/ntsvc.cpp @@ -0,0 +1,113 @@ +// $Id$ + +// ============================================================================ +// +// = LIBRARY +// examples/NT_Service +// +// = FILENAME +// ntsvc.cpp +// +// = DESCRIPTION +// This is the implementation of the NT service. It beeps every 2 +// seconds until the service is stopped. +// +// = AUTHOR +// Gonzalo Diethelm <gonzo@cs.wustl.edu> +// and Steve Huston <shuston@riverace.com> +// +// ============================================================================ + +#include "ace/Reactor.h" +#include "ntsvc.h" + +Service::Service (void) +{ + // Remember the Reactor instance. + reactor (ACE_Reactor::instance ()); +} + +Service::~Service (void) +{ + if (ACE_Reactor::instance ()->cancel_timer(this) == -1) + ACE_ERROR ((LM_ERROR, + "Service::~Service failed to cancel_timer.\n")); +} + +// This method is called when the service gets a control request. It +// handles requests for stop and shutdown by calling terminate (). +// All others get handled by calling up to inherited::handle_control. + +void +Service::handle_control (DWORD control_code) +{ + if (control_code == SERVICE_CONTROL_SHUTDOWN + || control_code == SERVICE_CONTROL_STOP) + { + report_status (SERVICE_STOP_PENDING); + + ACE_DEBUG ((LM_INFO, + ACE_TEXT ("Service control stop requested\n"))); + stop_ = 1; + reactor ()->notify (this, + ACE_Event_Handler::EXCEPT_MASK); + } + else + inherited::handle_control (control_code); +} + +// This is just here to be the target of the notify from above... it +// doesn't do anything except aid on popping the reactor off its wait +// and causing a drop out of handle_events. + +int +Service::handle_exception (ACE_HANDLE) +{ + return 0; +} + +// Beep every two seconds. This is what this NT service does... + +int +Service::handle_timeout (const ACE_Time_Value &tv, + const void *) +{ + ACE_UNUSED_ARG (tv); + MessageBeep (MB_OK); + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%T (%t): Beep...\n"))); + return 0; +} + +// This is the main processing function for the Service. It sets up +// the initial configuration and runs the event loop until a shutdown +// request is received. + +int +Service::svc (void) +{ + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Service::svc\n"))); + + // As an NT service, we come in here in a different thread than the + // one which created the reactor. So in order to do anything, we + // need to own the reactor. If we are not a service, report_status + // will return -1. + if (report_status (SERVICE_RUNNING) == 0) + reactor ()->owner (ACE_Thread::self ()); + + this->stop_ = 0; + + // Schedule a timer every two seconds. + ACE_Time_Value tv (2, 0); + ACE_Reactor::instance ()->schedule_timer (this, 0, tv, tv); + + while (!this->stop_) + reactor ()->handle_events (); + + // Cleanly terminate connections, terminate threads. + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Shutting down\n"))); + reactor ()->cancel_timer (this); + return 0; +} + |