diff options
author | Ossama Othman <ossama-othman@users.noreply.github.com> | 2002-10-02 17:00:04 +0000 |
---|---|---|
committer | Ossama Othman <ossama-othman@users.noreply.github.com> | 2002-10-02 17:00:04 +0000 |
commit | ae37d1e31adeb73d62a113aea6d59dd12473ffaf (patch) | |
tree | 1a34787850712a995108fc818a12eab257957d1f /TAO/orbsvcs/LoadBalancer | |
parent | 0b89a32b122e51be30f38d9807380c3fa7b642f9 (diff) | |
download | ATCD-ae37d1e31adeb73d62a113aea6d59dd12473ffaf.tar.gz |
ChangeLogTag:Tue Oct 1 23:27:48 2002 Ossama Othman <ossama@uci.edu>
Diffstat (limited to 'TAO/orbsvcs/LoadBalancer')
-rw-r--r-- | TAO/orbsvcs/LoadBalancer/LoadMonitor.bor | 2 | ||||
-rw-r--r-- | TAO/orbsvcs/LoadBalancer/LoadMonitor.cpp | 63 | ||||
-rw-r--r-- | TAO/orbsvcs/LoadBalancer/LoadMonitor.dsp | 16 | ||||
-rw-r--r-- | TAO/orbsvcs/LoadBalancer/Makefile.LoadMonitor | 6 | ||||
-rw-r--r-- | TAO/orbsvcs/LoadBalancer/Monitor_Signal_Handler.cpp | 51 | ||||
-rw-r--r-- | TAO/orbsvcs/LoadBalancer/Monitor_Signal_Handler.h | 62 |
6 files changed, 179 insertions, 21 deletions
diff --git a/TAO/orbsvcs/LoadBalancer/LoadMonitor.bor b/TAO/orbsvcs/LoadBalancer/LoadMonitor.bor index 2e459f603e6..e5a38b8ebaf 100644 --- a/TAO/orbsvcs/LoadBalancer/LoadMonitor.bor +++ b/TAO/orbsvcs/LoadBalancer/LoadMonitor.bor @@ -13,6 +13,8 @@ NAME = LoadMonitor OBJFILES = \ $(OBJDIR)\Push_Handler.obj \ $(OBJDIR)\LoadMonitor.obj + $(OBJDIR)\Signal_Handler.obj \ + $(OBJDIR)\Monitor_Signal_Handler.obj CFLAGS = \ diff --git a/TAO/orbsvcs/LoadBalancer/LoadMonitor.cpp b/TAO/orbsvcs/LoadBalancer/LoadMonitor.cpp index bdac3d44b17..dcf5af5dffd 100644 --- a/TAO/orbsvcs/LoadBalancer/LoadMonitor.cpp +++ b/TAO/orbsvcs/LoadBalancer/LoadMonitor.cpp @@ -1,4 +1,5 @@ #include "Push_Handler.h" +#include "Monitor_Signal_Handler.h" #include "orbsvcs/LoadBalancing/LB_CPU_Monitor.h" @@ -98,7 +99,8 @@ parse_args (int argc, } CosLoadBalancing::LoadMonitor_ptr -get_load_monitor (CORBA::ORB_ptr orb +get_load_monitor (CORBA::ORB_ptr orb, + PortableServer::POA_ptr root_poa ACE_ENV_ARG_DECL) { if (::custom_monitor_ior != 0) @@ -115,17 +117,6 @@ get_load_monitor (CORBA::ORB_ptr orb { // The POA is only needed for the built-in load monitors since // they must be activated. - - CORBA::Object_var obj = - orb->resolve_initial_references ("RootPOA" - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (CosLoadBalancing::LoadMonitor::_nil ()); - - PortableServer::POA_var root_poa = - PortableServer::POA::_narrow (obj.in () - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (CosLoadBalancing::LoadMonitor::_nil ()); - PortableServer::POAManager_var poa_manager = root_poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER); ACE_CHECK_RETURN (CosLoadBalancing::LoadMonitor::_nil ()); @@ -180,12 +171,12 @@ register_load_monitor (CosLoadBalancing::LoadManager_ptr manager, long & timer_id ACE_ENV_ARG_DECL) { - PortableGroup::Location_var location = - monitor->the_location (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK; - if (ACE_OS::strcasecmp (::mstyle, "PULL") == 0) { + PortableGroup::Location_var location = + monitor->the_location (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + manager->register_load_monitor (monitor, location.in () ACE_ENV_ARG_PARAMETER); @@ -240,8 +231,20 @@ ACE_TMAIN (int argc, ACE_TCHAR *argv[]) ACE_ENV_ARG_PARAMETER); ACE_TRY_CHECK; + CORBA::Object_var obj = + orb->resolve_initial_references ("RootPOA" + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + PortableServer::POA_var root_poa = + PortableServer::POA::_narrow (obj.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CosLoadBalancing::LoadMonitor_var load_monitor = - ::get_load_monitor (orb.in () + ::get_load_monitor (orb.in (), + root_poa.in () ACE_ENV_ARG_PARAMETER); ACE_TRY_CHECK; @@ -251,9 +254,8 @@ ACE_TMAIN (int argc, ACE_TCHAR *argv[]) // The "LoadManager" reference should have already been // registered with the ORB by its ORBInitializer. - CORBA::Object_var obj = - orb->resolve_initial_references ("LoadManager" - ACE_ENV_ARG_PARAMETER); + obj = orb->resolve_initial_references ("LoadManager" + ACE_ENV_ARG_PARAMETER); ACE_TRY_CHECK; CosLoadBalancing::LoadManager_var load_manager = @@ -279,6 +281,27 @@ ACE_TMAIN (int argc, ACE_TCHAR *argv[]) ACE_ENV_ARG_PARAMETER); ACE_TRY_CHECK; + CosLoadBalancing::LoadManager_ptr tmp;; + + if (timer_id == -1) + tmp = load_manager.in (); // PULL monitoring + else + tmp = CosLoadBalancing::LoadManager::_nil (); // PUSH + // monitoring + + // Activate/register the signal handler that (attempts) to + // ensure graceful shutdown of the LoadMonitor so that + // LoadMonitors registered with the LoadManager can be + // deregistered. + TAO_LB_Monitor_Signal_Handler signal_handler ( + orb.in (), + root_poa.in (), + tmp, + location.in ()); + + if (signal_handler.activate () != 0) + return -1; + orb->run (ACE_ENV_SINGLE_ARG_PARAMETER); ACE_TRY_CHECK; diff --git a/TAO/orbsvcs/LoadBalancer/LoadMonitor.dsp b/TAO/orbsvcs/LoadBalancer/LoadMonitor.dsp index 47e5f764d49..f5d626ac8b9 100644 --- a/TAO/orbsvcs/LoadBalancer/LoadMonitor.dsp +++ b/TAO/orbsvcs/LoadBalancer/LoadMonitor.dsp @@ -93,16 +93,32 @@ SOURCE=.\LoadMonitor.cpp # End Source File
# Begin Source File
+SOURCE=.\Monitor_Signal_Handler.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\Push_Handler.cpp
# End Source File
+# Begin Source File
+
+SOURCE=.\Signal_Handler.cpp
+# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h"
# Begin Source File
+SOURCE=.\Monitor_Signal_Handler.h
+# End Source File
+# Begin Source File
+
SOURCE=.\Push_Handler.h
# End Source File
+# Begin Source File
+
+SOURCE=.\Signal_Handler.h
+# End Source File
# End Group
# End Target
# End Project
diff --git a/TAO/orbsvcs/LoadBalancer/Makefile.LoadMonitor b/TAO/orbsvcs/LoadBalancer/Makefile.LoadMonitor index b63c3b0efae..e710ca6d01d 100644 --- a/TAO/orbsvcs/LoadBalancer/Makefile.LoadMonitor +++ b/TAO/orbsvcs/LoadBalancer/Makefile.LoadMonitor @@ -12,7 +12,11 @@ ifndef TAO_ROOT TAO_ROOT = $(ACE_ROOT)/TAO endif -SRC = LoadMonitor.cpp Push_Handler.cpp +SRC = \ + LoadMonitor.cpp \ + Push_Handler.cpp \ + Signal_Handler.cpp \ + Monitor_Signal_Handler.cpp LDLIBS = \ -lTAO_CosLoadBalancing \ diff --git a/TAO/orbsvcs/LoadBalancer/Monitor_Signal_Handler.cpp b/TAO/orbsvcs/LoadBalancer/Monitor_Signal_Handler.cpp new file mode 100644 index 00000000000..3153f62e98a --- /dev/null +++ b/TAO/orbsvcs/LoadBalancer/Monitor_Signal_Handler.cpp @@ -0,0 +1,51 @@ +#include "Monitor_Signal_Handler.h" + + +ACE_RCSID (LoadBalancer, + Monitor_Signal_Handler, + "$Id$") + + +TAO_LB_Monitor_Signal_Handler::TAO_LB_Monitor_Signal_Handler ( + CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + CosLoadBalancing::LoadManager_ptr load_manager, + const PortableGroup::Location & location) + : TAO_LB_Signal_Handler (orb, poa), + load_manager_ (CosLoadBalancing::LoadManager::_duplicate (load_manager)), + location_ (location) +{ +} + + +int +TAO_LB_Monitor_Signal_Handler::perform_cleanup (int signum) +{ + ACE_DECLARE_NEW_CORBA_ENV; + ACE_TRY + { + // Deregister the LoadMonitor from the LoadManager in the PULL + // load monitoring case. + if (!CORBA::is_nil (this->load_manager_.in ())) + { + this->load_manager_->remove_load_monitor (this->location_ + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + } + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, + "Caught exception"); + + ACE_ERROR_RETURN ((LM_ERROR, + "Problem during LoadMonitor cleanup " + "initiated by signal %d.\n", + signum), + -1); + } + ACE_ENDTRY; + ACE_CHECK_RETURN (-1); + + return this->TAO_LB_Signal_Handler::perform_cleanup (signum); +} diff --git a/TAO/orbsvcs/LoadBalancer/Monitor_Signal_Handler.h b/TAO/orbsvcs/LoadBalancer/Monitor_Signal_Handler.h new file mode 100644 index 00000000000..aee41ca5e76 --- /dev/null +++ b/TAO/orbsvcs/LoadBalancer/Monitor_Signal_Handler.h @@ -0,0 +1,62 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file Monitor_Signal_Handler.h + * + * $Id$ + * + * @author Ossama Othman <ossama@uci.edu> + */ +//============================================================================= + + +#ifndef TAO_LB_MONITOR_SIGNAL_HANDLER_H +#define TAO_LB_MONITOR_SIGNAL_HANDLER_H + +#include "Signal_Handler.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "orbsvcs/CosLoadBalancingC.h" + + +/** + * @class TAO_LB_Monitor_Signal_Handler + * + * @brief LoadMonitor-specific signal handler. + * + * This class simply builds on the TAO_LB_Signal_Handler class to add + * some LoadMonitor-specific cleanup. + */ +class TAO_LB_Monitor_Signal_Handler : public TAO_LB_Signal_Handler +{ +public: + + /// Constructor. + TAO_LB_Monitor_Signal_Handler ( + CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + CosLoadBalancing::LoadManager_ptr load_manager, + const PortableGroup::Location & location); + +protected: + + /// Template method that initiates the cleanup process. + virtual int perform_cleanup (int signum); + +private: + + /// Reference to the LoadManager with which the LoadMonitor is + /// registered. + CosLoadBalancing::LoadManager_var load_manager_; + + /// Reference to the location the LoadMonitor resides at. + const PortableGroup::Location & location_; + +}; + + +#endif /* TAO_LB_MONITOR_SIGNAL_HANDLER_H */ |