diff options
Diffstat (limited to 'ACE/examples/Service_Configurator/Misc/Timer_Service.cpp')
-rw-r--r-- | ACE/examples/Service_Configurator/Misc/Timer_Service.cpp | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/ACE/examples/Service_Configurator/Misc/Timer_Service.cpp b/ACE/examples/Service_Configurator/Misc/Timer_Service.cpp new file mode 100644 index 00000000000..82ace8f657c --- /dev/null +++ b/ACE/examples/Service_Configurator/Misc/Timer_Service.cpp @@ -0,0 +1,135 @@ +// $Id$ + +#include "ace/OS_NS_string.h" +#include "Timer_Service.h" +#include "ace/Log_Msg.h" + +ACE_RCSID(Misc, Timer_Service, "$Id$") + +Timer_Service_1::Timer_Service_1 (void) +{ + ACE_OS::strcpy (this->name_, + ACE_TEXT ("Timer_Service_1")); +} + +int +Timer_Service_1::init (int argc, ACE_TCHAR *argv[]) +{ + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("in Timer_Service::init, argv[0] = %s, argc == %d\n"), + argv[0], argc)); + + // Printout the <argv> values for sanity's sake. + for (int i = 0; i < argc; i++) + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("argv[%d] = %s\n"), + i, argv[i])); + + int interval = Timer_Service_1::TIMEOUT; + + if (argc > 1) + { + // If the second argument exists use this as the interval for + // the periodic timer. Otherwise, go off every TIMEOUT seconds. + + interval = ACE_OS::atoi (argv[1]); + + if (interval == 0) + interval = Timer_Service_1::TIMEOUT; + } + + if (argc > 2) + { + // If the third argument exists use it to control the maximum + // number of timeouts. + this->max_timeouts_ = ACE_OS::atoi (argv[2]); + + if (this->max_timeouts_ == 0) + this->max_timeouts_ = Timer_Service_1::MAX_TIMEOUTS; + } + + this->cur_timeouts_ = 0; + + // If the fourth argument exists take this as an indication to + // enable tracing. +#if defined (ACE_HAS_TRACE) + if (argc > 3) + ACE_Trace::start_tracing (); + else + ACE_Trace::stop_tracing (); +#endif /* ACE_HAS_TRACE */ + + // Register the timer to go off in 1 second, and then to go off + // every <interval> seconds. + if (ACE_Reactor::instance ()->schedule_timer + (this, + 0, + ACE_Time_Value (1), + ACE_Time_Value (interval)) == -1) + return -1; + else + return 0; +} + +int +Timer_Service_1::handle_timeout (const ACE_Time_Value &tv, + const void *) +{ + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("(%x) in %s::handle_timeout sec = %d, usec = %d") + ACE_TEXT (" cur_timeouts = %d, max_timeouts = %d\n"), + this, + this->name_, + tv.sec (), + tv.usec (), + this->cur_timeouts_, + this->max_timeouts_)); + + this->cur_timeouts_++; + + if (this->cur_timeouts_ == this->max_timeouts_) + // Shutdown the test. + return -1; + else + return 0; +} + +int +Timer_Service_1::handle_close (ACE_HANDLE, + ACE_Reactor_Mask) +{ + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("closing down the timer test\n"))); + + // Remove ourselves from the timer queue. + ACE_Reactor::instance ()->cancel_timer (this); + + ACE_Reactor::end_event_loop(); + return 0; +} + +Timer_Service_2::Timer_Service_2 (void) +{ + ACE_OS::strcpy (this->name_, + ACE_TEXT ("Timer_Service_2")); +} + +Timer_Service_3::Timer_Service_3 (void) +{ + ACE_OS::strcpy (this->name_, + ACE_TEXT ("Timer_Service_3")); +} + +// Define the object that describes the service. +ACE_STATIC_SVC_DEFINE (Timer_Service_1, + ACE_TEXT ("Timer_Service_1"), + ACE_SVC_OBJ_T, + &ACE_SVC_NAME (Timer_Service_1), + ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ, + 0) + +// The following are "Factories" used by the <ACE_Service_Config> and +// svc.conf file to dynamically initialize the state of the Timer +// Services. +ACE_SVC_FACTORY_DEFINE (Timer_Service_1) +ACE_SVC_FACTORY_DEFINE (Timer_Service_2) +ACE_SVC_FACTORY_DEFINE (Timer_Service_3) |