summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/LoadBalancer
diff options
context:
space:
mode:
authorOssama Othman <ossama-othman@users.noreply.github.com>2002-10-02 17:00:04 +0000
committerOssama Othman <ossama-othman@users.noreply.github.com>2002-10-02 17:00:04 +0000
commitae37d1e31adeb73d62a113aea6d59dd12473ffaf (patch)
tree1a34787850712a995108fc818a12eab257957d1f /TAO/orbsvcs/LoadBalancer
parent0b89a32b122e51be30f38d9807380c3fa7b642f9 (diff)
downloadATCD-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.bor2
-rw-r--r--TAO/orbsvcs/LoadBalancer/LoadMonitor.cpp63
-rw-r--r--TAO/orbsvcs/LoadBalancer/LoadMonitor.dsp16
-rw-r--r--TAO/orbsvcs/LoadBalancer/Makefile.LoadMonitor6
-rw-r--r--TAO/orbsvcs/LoadBalancer/Monitor_Signal_Handler.cpp51
-rw-r--r--TAO/orbsvcs/LoadBalancer/Monitor_Signal_Handler.h62
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 */