summaryrefslogtreecommitdiff
path: root/trunk/TAO/tao/Collocated_Invocation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/tao/Collocated_Invocation.cpp')
-rw-r--r--trunk/TAO/tao/Collocated_Invocation.cpp172
1 files changed, 172 insertions, 0 deletions
diff --git a/trunk/TAO/tao/Collocated_Invocation.cpp b/trunk/TAO/tao/Collocated_Invocation.cpp
new file mode 100644
index 00000000000..80b2efca949
--- /dev/null
+++ b/trunk/TAO/tao/Collocated_Invocation.cpp
@@ -0,0 +1,172 @@
+#include "tao/Collocated_Invocation.h"
+#include "tao/Collocation_Proxy_Broker.h"
+#include "tao/ORB_Core.h"
+#include "tao/Request_Dispatcher.h"
+#include "tao/TAO_Server_Request.h"
+#include "tao/Stub.h"
+#include "tao/operation_details.h"
+
+#if TAO_HAS_INTERCEPTORS == 1
+# include "tao/PortableInterceptorC.h"
+#endif /*TAO_HAS_INTERCEPTORS */
+
+ACE_RCSID (tao,
+ Collocated_Invocation,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ Collocated_Invocation::Collocated_Invocation (CORBA::Object_ptr t,
+ CORBA::Object_ptr et,
+ TAO_Stub *stub,
+ TAO_Operation_Details &detail,
+ bool response_expected)
+ : Invocation_Base (t,
+ et,
+ stub,
+ detail,
+ response_expected,
+ false /* request_is_remote */ )
+ {
+ }
+
+ Invocation_Status
+ Collocated_Invocation::invoke (Collocation_Proxy_Broker *cpb,
+ Collocation_Strategy strat
+ ACE_ENV_ARG_DECL)
+ {
+ Invocation_Status s = TAO_INVOKE_FAILURE;
+
+ /// Start the interception point
+#if TAO_HAS_INTERCEPTORS == 1
+ s =
+ this->send_request_interception (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (TAO_INVOKE_FAILURE);
+
+ if (s != TAO_INVOKE_SUCCESS)
+ return s;
+#endif /*TAO_HAS_INTERCEPTORS */
+
+ ACE_TRY
+ {
+ if (strat == TAO_CS_THRU_POA_STRATEGY)
+ {
+ // Perform invocations on the servant through the servant's ORB.
+ CORBA::ORB_var servant_orb =
+ this->effective_target ()->_stubobj ()->servant_orb_ptr ();
+ TAO_ORB_Core * const orb_core = servant_orb->orb_core ();
+
+ TAO_ServerRequest request (orb_core,
+ this->details_,
+ this->effective_target ());
+
+ TAO_Request_Dispatcher * const dispatcher =
+ orb_core->request_dispatcher ();
+
+ // Retain ownership of the servant's ORB_Core in case
+ // another thread attempts to destroy it (e.g. via
+ // CORBA::ORB::destroy()) before this thread complete the
+ // invocation.
+ orb_core->_incr_refcnt ();
+ TAO_ORB_Core_Auto_Ptr my_orb_core (orb_core);
+
+ dispatcher->dispatch (orb_core,
+ request,
+ this->forwarded_to_.out ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ else
+ {
+ cpb->dispatch (this->effective_target (),
+ this->forwarded_to_.out (),
+ this->details_.args (),
+ this->details_.args_num (),
+ this->details_.opname (),
+ this->details_.opname_len (),
+ strat
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ // Invocation completed succesfully
+ s = TAO_INVOKE_SUCCESS;
+
+#if TAO_HAS_INTERCEPTORS == 1
+ if (this->forwarded_to_.in () ||
+ this->response_expected_ == false)
+ {
+ if (this->forwarded_to_.in ())
+ this->reply_received (TAO_INVOKE_RESTART);
+
+ s =
+ this->receive_other_interception (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ // NOTE: Any other condition that needs handling?
+ else if (this->response_expected ())
+ {
+ this->reply_received (TAO_INVOKE_SUCCESS);
+
+ s =
+ this->receive_reply_interception (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ if (s != TAO_INVOKE_SUCCESS)
+ return s;
+#endif /*TAO_HAS_INTERCEPTORS */
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions for oneways
+ if (this->response_expected_ == false)
+ return TAO_INVOKE_SUCCESS;
+
+#if TAO_HAS_INTERCEPTORS == 1
+ PortableInterceptor::ReplyStatus const status =
+ this->handle_any_exception (&ACE_ANY_EXCEPTION
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (status == PortableInterceptor::LOCATION_FORWARD ||
+ status == PortableInterceptor::TRANSPORT_RETRY)
+ s = TAO_INVOKE_RESTART;
+ else
+#endif /*TAO_HAS_INTERCEPTORS*/
+ ACE_RE_THROW;
+ }
+# if defined (ACE_HAS_EXCEPTIONS) \
+ && defined (ACE_HAS_BROKEN_UNEXPECTED_EXCEPTIONS)
+ ACE_CATCHALL
+ {
+ if (this->response_expected () == false)
+ return TAO_INVOKE_SUCCESS;
+#if TAO_HAS_INTERCEPTORS == 1
+ PortableInterceptor::ReplyStatus const st =
+ this->handle_all_exception (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (st == PortableInterceptor::LOCATION_FORWARD ||
+ st == PortableInterceptor::TRANSPORT_RETRY)
+ s = TAO_INVOKE_RESTART;
+ else
+#endif /*TAO_HAS_INTERCEPTORS == 1*/
+ ACE_RE_THROW;
+ }
+# endif /* ACE_HAS_EXCEPTIONS &&
+ ACE_HAS_BROKEN_UNEXPECTED_EXCEPTIONS */
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (TAO_INVOKE_FAILURE);
+
+ if (this->forwarded_to_.in () != 0)
+ s = TAO_INVOKE_RESTART;
+
+ return s;
+ }
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL