diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.cpp')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.cpp | 130 |
1 files changed, 44 insertions, 86 deletions
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.cpp index ad331580af6..a1a47f277b6 100644 --- a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.cpp +++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.cpp @@ -1,27 +1,23 @@ // $Id$ -#include "orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.h" -#include "orbsvcs/FaultTolerance/FT_Service_Callbacks.h" +#include "FT_ClientRequest_Interceptor.h" #include "orbsvcs/FT_CORBA_ORBC.h" #include "tao/CORBA_String.h" #include "tao/debug.h" #include "tao/ORB_Constants.h" #include "tao/CDR.h" -#include "tao/PI/ClientRequestInfo.h" #include "ace/UUID.h" #include "ace/Lock_Adapter_T.h" #include "ace/Lock.h" #include "ace/Synch_Traits.h" +#include "ace/OS_NS_sys_time.h" ACE_RCSID (FaultTolerance, FT_ORBInitializer, "$Id$") - -TAO_BEGIN_VERSIONED_NAMESPACE_DECL - namespace TAO { FT_ClientRequest_Interceptor::FT_ClientRequest_Interceptor (void) @@ -47,6 +43,11 @@ namespace TAO delete this->lock_; } + FT_TSS * + FT_ClientRequest_Interceptor::tss_resources (void) + { + return ACE_TSS_GET (&this->tss_,FT_TSS); + } char * FT_ClientRequest_Interceptor::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) ACE_THROW_SPEC ((CORBA::SystemException)) @@ -103,66 +104,17 @@ namespace TAO ACE_ENV_ARG_DECL_NOT_USED) ACE_THROW_SPEC ((CORBA::SystemException)) { + this->tss_resources ()->clean_flag_ = true; } void FT_ClientRequest_Interceptor::receive_other ( - PortableInterceptor::ClientRequestInfo_ptr ri - ACE_ENV_ARG_DECL) + PortableInterceptor::ClientRequestInfo_ptr + ACE_ENV_ARG_DECL_NOT_USED) ACE_THROW_SPEC ((CORBA::SystemException, PortableInterceptor::ForwardRequest)) { - TAO_ClientRequestInfo* tao_ri = dynamic_cast<TAO_ClientRequestInfo*> (ri); - - if (!tao_ri) - { - ACE_THROW (CORBA::INTERNAL ()); - } - - TimeBase::TimeT expires = tao_ri->tao_ft_expiration_time (); - if (!expires) - { - // Not an FT request - return; - } - - PortableInterceptor::ReplyStatus status = -1; - - ACE_TRY - { - status = ri->reply_status(ACE_ENV_SINGLE_ARG_PARAMETER); - } - ACE_CATCHANY - { - // No reply status => Not a location forward. - return; - } - ACE_ENDTRY; - - if (status == PortableInterceptor::LOCATION_FORWARD) - { - // We are in an FT request and a location forward has been received. - - if (expires < TAO_FT_Service_Callbacks::now ()) - { - // The request has already expired... - - if (TAO_debug_level > 3) - { - ACE_DEBUG ((LM_DEBUG, - "TAO_FT (%P|%t): FT_ClientRequest_Interceptor::receive_other - LOCATION_FORWARD received after request expiration.\n")); - } - - // The spec says throw a SYSTEM_EXCEPTION, but doesn't specify which one. - // I think a TRANSIENT is the most suitable. - ACE_THROW (CORBA::TRANSIENT ( - CORBA::SystemException::_tao_minor_code ( - TAO_INVOCATION_LOCATION_FORWARD_MINOR_CODE, - errno), - CORBA::COMPLETED_NO)); - } - } } void @@ -322,6 +274,7 @@ namespace TAO IOP::ServiceContext sc; sc.context_id = IOP::FT_REQUEST; + CORBA::Policy_var policy = ri->get_request_policy (FT::REQUEST_DURATION_POLICY ACE_ENV_ARG_PARAMETER); @@ -330,34 +283,33 @@ namespace TAO FT::FTRequestServiceContext ftrsc; ftrsc.client_id = CORBA::string_dup (this->uuid_->to_string ()->c_str ()); + ftrsc.expiration_time = + this->request_expiration_time (policy.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; - TAO_ClientRequestInfo* tao_ri = dynamic_cast<TAO_ClientRequestInfo*> (ri); - - if (!tao_ri) - { - ACE_THROW (CORBA::INTERNAL ()); - } + FT_TSS *tss = + this->tss_resources (); - if (tao_ri->tao_ft_expiration_time ()) - { - ftrsc.retention_id = tao_ri->tao_ft_retention_id (); - ftrsc.expiration_time = tao_ri->tao_ft_expiration_time (); - } - else - { - ACE_GUARD (ACE_Lock, - guard, - *this->lock_); + if (tss->clean_flag_) + { + ACE_GUARD (ACE_Lock, + guard, + *this->lock_); - ftrsc.retention_id = ++this->retention_id_; - ftrsc.expiration_time = - this->request_expiration_time (policy.in () - ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; + ftrsc.retention_id = ++this->retention_id_; - tao_ri->tao_ft_retention_id (ftrsc.retention_id); - tao_ri->tao_ft_expiration_time (ftrsc.expiration_time); - } + // ACE_DEBUG ((LM_DEBUG, + // ACE_TEXT ("TAO_FT (%P|%t) - Retention id [%d]\n"), + // ftrsc.retention_id)); + tss->retention_id_ = ftrsc.retention_id; + tss->clean_flag_ = false; + } + else + { + ftrsc.retention_id = + tss->retention_id_; + } TAO_OutputCDR ocdr; if (!(ocdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER))) @@ -409,7 +361,7 @@ namespace TAO { p = FT::RequestDurationPolicy::_narrow (policy ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (0); + ACE_CHECK_RETURN (0); } TimeBase::TimeT t = 0; @@ -432,10 +384,16 @@ namespace TAO } // Calculaton of the expiration time - t += TAO_FT_Service_Callbacks::now (); + + // Grab the localtime on the machine where this is running + ACE_Time_Value time_val = ACE_OS::gettimeofday (); + + TimeBase::TimeT sec_part = time_val.sec () * 10000000; + TimeBase::TimeT usec_part = time_val.usec ()* 10; + + // Now we have the total time + t += (sec_part + usec_part); return t; } } - -TAO_END_VERSIONED_NAMESPACE_DECL |