summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/Notify/Supplier.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Notify/Supplier.cpp')
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Supplier.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Supplier.cpp b/TAO/orbsvcs/orbsvcs/Notify/Supplier.cpp
index d760d336730..e4cde846df6 100644
--- a/TAO/orbsvcs/orbsvcs/Notify/Supplier.cpp
+++ b/TAO/orbsvcs/orbsvcs/Notify/Supplier.cpp
@@ -1,6 +1,11 @@
// $Id$
+#include "tao/corba.h"
+#include "orbsvcs/Time_Utilities.h"
+#include "orbsvcs/Notify/Properties.h"
#include "orbsvcs/Notify/Supplier.h"
+#include "tao/debug.h"
+#include "tao/Messaging/Messaging_TypesC.h"
#if ! defined (__ACE_INLINE__)
#include "orbsvcs/Notify/Supplier.inl"
@@ -11,6 +16,10 @@ ACE_RCSID(Notify, TAO_Notify_Supplier, "$Id$")
#include "orbsvcs/Notify/ProxyConsumer.h"
#include "orbsvcs/Notify/Proxy.h"
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
TAO_BEGIN_VERSIONED_NAMESPACE_DECL
TAO_Notify_Supplier::TAO_Notify_Supplier (TAO_Notify_ProxyConsumer* proxy)
@@ -37,4 +46,89 @@ TAO_Notify_Supplier::dispatch_updates_i (
this->subscribe_->subscription_change (added, removed);
}
+
+
+bool
+TAO_Notify_Supplier::is_alive (bool allow_nil_supplier)
+{
+ bool status = false;
+ CORBA::Object_var supplier = this->get_supplier ();
+ if (CORBA::is_nil (supplier.in ()))
+ {
+ // The supplier may not connected or the supplier did
+ // not provide a callback. In this case, the liveliness
+ // check should return true so it will be validated in
+ // next period.
+ if (allow_nil_supplier)
+ return true;
+ else
+ return status;
+ }
+
+ CORBA::PolicyList policy_list;
+ try
+ {
+ bool do_liveliness_check = false;
+ ACE_Time_Value now = ACE_OS::gettimeofday ();
+ ACE_Time_Value last_ping = proxy_->last_ping();
+ if (CORBA::is_nil (this->rtt_obj_.in ()))
+ {
+ // We need to determine if the supplier on the other end is still
+ // alive. Since we may be in an upcall from the owner of the
+ // original supplier, we have to put a timeout on the call in case
+ // the client side is not processing ORB requests at this time. In
+ // the event that the timeout exception occurs, we will assume that
+ // the original supplier is still around. If we get any other
+ // exception we will say that the original supplier is not
+ // available anymore.
+ TimeBase::TimeT timeout = 10000000;
+ CORBA::Any timeout_any;
+ timeout_any <<= timeout;
+
+ policy_list.length (1);
+ policy_list[0] = TAO_Notify_PROPERTIES::instance()->orb()->
+ create_policy (
+ Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE,
+ timeout_any);
+ rtt_obj_ =
+ supplier->_set_policy_overrides (policy_list,
+ CORBA::ADD_OVERRIDE);
+
+ // Clean up the policy that was allocated in the try/catch
+ for (CORBA::ULong i = 0; i < policy_list.length (); i++)
+ policy_list[i]->destroy ();
+
+ do_liveliness_check
+ = (last_ping == ACE_Time_Value::zero ? true
+ : now - last_ping >= TAO_Notify_PROPERTIES::instance()->validate_client_delay ());
+ }
+ else
+ do_liveliness_check =
+ now - last_ping >= TAO_Notify_PROPERTIES::instance()->validate_client_interval ();
+
+ if (CORBA::is_nil (rtt_obj_.in ()))
+ status = false;
+ else if (do_liveliness_check || allow_nil_supplier)
+ {
+ this->proxy_->last_ping (now);
+ status = !rtt_obj_->_non_existent ();
+ }
+ else
+ status = true;
+ }
+ catch (CORBA::TIMEOUT&)
+ {
+ status = true;
+ }
+ catch (CORBA::Exception& ex)
+ {
+ if (DEBUG_LEVEL > 0)
+ {
+ ex._tao_print_exception ("TAO_Notify_Supplier::is_alive: false");
+ }
+ }
+
+ return status;
+}
+
TAO_END_VERSIONED_NAMESPACE_DECL