diff options
-rw-r--r-- | TAO/TAO_IDL/be/be_codegen.cpp | 2 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_operation/interceptors_cs.cpp | 10 | ||||
-rw-r--r-- | TAO/tao/ClientInterceptorAdapter.cpp | 42 | ||||
-rw-r--r-- | TAO/tao/ClientInterceptorAdapter.h | 43 | ||||
-rw-r--r-- | TAO/tao/ClientInterceptorAdapter.inl | 3 | ||||
-rw-r--r-- | TAO/tao/ClientRequestInfo.cpp | 515 | ||||
-rw-r--r-- | TAO/tao/ClientRequestInfo.h | 122 | ||||
-rw-r--r-- | TAO/tao/ClientRequestInfo.inl | 47 | ||||
-rw-r--r-- | TAO/tao/ClientRequestInfo_i.cpp | 578 | ||||
-rw-r--r-- | TAO/tao/ClientRequestInfo_i.h | 253 | ||||
-rw-r--r-- | TAO/tao/ClientRequestInfo_i.inl | 36 | ||||
-rw-r--r-- | TAO/tao/DomainC.cpp | 26 | ||||
-rw-r--r-- | TAO/tao/Makefile | 1 | ||||
-rw-r--r-- | TAO/tao/Makefile.bor | 1 | ||||
-rw-r--r-- | TAO/tao/ORB_Core.cpp | 16 | ||||
-rw-r--r-- | TAO/tao/ORB_Core.h | 10 | ||||
-rw-r--r-- | TAO/tao/PolicyC.cpp | 38 | ||||
-rw-r--r-- | TAO/tao/PortableServer/ImplRepoC.cpp | 158 | ||||
-rw-r--r-- | TAO/tao/TAO.dsp | 12 | ||||
-rw-r--r-- | TAO/tao/TAO_Static.dsp | 12 |
20 files changed, 1295 insertions, 630 deletions
diff --git a/TAO/TAO_IDL/be/be_codegen.cpp b/TAO/TAO_IDL/be/be_codegen.cpp index 74a1bb26d12..ce465810dad 100644 --- a/TAO/TAO_IDL/be/be_codegen.cpp +++ b/TAO/TAO_IDL/be/be_codegen.cpp @@ -324,7 +324,7 @@ TAO_CodeGen::start_client_stubs (const char *fname) this->gen_standard_include (this->client_stubs_, "tao/RequestInfo_Util.h"); this->gen_standard_include (this->client_stubs_, - "tao/ClientRequestInfo.h"); + "tao/ClientRequestInfo_i.h"); this->gen_standard_include (this->client_stubs_, "tao/ClientInterceptorAdapter.h"); *this->client_stubs_ << "#endif /* TAO_HAS_INTERCEPTORS == 1 */\n\n"; diff --git a/TAO/TAO_IDL/be/be_visitor_operation/interceptors_cs.cpp b/TAO/TAO_IDL/be/be_visitor_operation/interceptors_cs.cpp index 380e15f1991..2979bc2edc5 100644 --- a/TAO/TAO_IDL/be/be_visitor_operation/interceptors_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_operation/interceptors_cs.cpp @@ -109,7 +109,7 @@ be_visitor_operation_interceptors_cs:: } } - *os << " : public TAO_ClientRequestInfo" << be_nl + *os << " : public TAO_ClientRequestInfo_i" << be_nl << "{" << be_nl << "public:" << be_idt_nl; @@ -185,17 +185,17 @@ be_visitor_operation_interceptors_cs:: // Here I still need to generate the other methods + private args. *os << "virtual Dynamic::ParameterList * arguments " - << "(TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)" << be_idt_nl + << "(TAO_ENV_SINGLE_ARG_DECL)" << be_idt_nl << "ACE_THROW_SPEC ((CORBA::SystemException));" << be_uidt_nl << be_nl; *os << "virtual Dynamic::ExceptionList * exceptions " - << "(TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)" << be_idt_nl + << "(TAO_ENV_SINGLE_ARG_DECL)" << be_idt_nl << "ACE_THROW_SPEC ((CORBA::SystemException));" << be_uidt_nl << be_nl; *os << "virtual CORBA::Any * result " - << "(TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)" << be_idt_nl + << "(TAO_ENV_SINGLE_ARG_DECL)" << be_idt_nl << "ACE_THROW_SPEC ((CORBA::SystemException));\n" << be_uidt; @@ -515,7 +515,7 @@ be_visitor_operation_interceptors_cs:: // Generate the member list and set each member but before that, // its necessary to pass on some args to the base class. os->indent (); - *os << " : TAO_ClientRequestInfo (_tao_invocation, _tao_target)"; + *os << " : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target)"; ctx = *this->ctx_; ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_ARG_INFO_CS); diff --git a/TAO/tao/ClientInterceptorAdapter.cpp b/TAO/tao/ClientInterceptorAdapter.cpp index 6d0dd33163b..a1ccb98465a 100644 --- a/TAO/tao/ClientInterceptorAdapter.cpp +++ b/TAO/tao/ClientInterceptorAdapter.cpp @@ -1,5 +1,3 @@ -// $Id$ - #include "ClientInterceptorAdapter.h" #if TAO_HAS_INTERCEPTORS == 1 @@ -9,6 +7,7 @@ #endif /* defined INLINE */ #include "ClientRequestInfo.h" +#include "ClientRequestInfo_i.h" #include "Invocation.h" ACE_RCSID (tao, @@ -22,18 +21,26 @@ TAO_ClientRequestInterceptor_Adapter:: void TAO_ClientRequestInterceptor_Adapter:: -send_request (TAO_ClientRequestInfo *ri +send_request (TAO_ClientRequestInfo_i *ri TAO_ENV_ARG_DECL) { // This method implements one of the "starting" client side // interception point. - ACE_TRY { + // Only perform the TSS access if interceptors were registered + // with the ORB. + if (this->len_ > 0) + this->info_ = + this->invocation_->orb_core ()-> + get_tss_resources ()->client_request_info_; + + TAO_ClientRequestInfo_Guard info_guard (this->info_, ri); + for (size_t i = 0 ; i < this->len_; ++i) { - this->interceptors_[i]->send_request (ri + this->interceptors_[i]->send_request (this->info_ TAO_ENV_ARG_PARAMETER); ACE_TRY_CHECK; @@ -53,7 +60,7 @@ send_request (TAO_ClientRequestInfo *ri void TAO_ClientRequestInterceptor_Adapter:: -receive_reply (TAO_ClientRequestInfo *ri +receive_reply (TAO_ClientRequestInfo_i *ri TAO_ENV_ARG_DECL) { // This is an "ending" interception point so we only process the @@ -63,6 +70,8 @@ receive_reply (TAO_ClientRequestInfo *ri // they were pushed onto the stack since this is an "ending" // interception point. + TAO_ClientRequestInfo_Guard info_guard (this->info_, ri); + // Unwind the stack. size_t len = this->stack_size_; for (size_t i = 0; i < len; ++i) @@ -74,7 +83,7 @@ receive_reply (TAO_ClientRequestInfo *ri --this->stack_size_; this->interceptors_[this->stack_size_]->receive_reply ( - ri + this->info_ TAO_ENV_ARG_PARAMETER); ACE_CHECK; } @@ -86,7 +95,7 @@ receive_reply (TAO_ClientRequestInfo *ri void TAO_ClientRequestInterceptor_Adapter:: -receive_exception (TAO_ClientRequestInfo *ri +receive_exception (TAO_ClientRequestInfo_i *ri TAO_ENV_ARG_DECL) { // This is an "ending" interception point so we only process the @@ -98,6 +107,8 @@ receive_exception (TAO_ClientRequestInfo *ri ACE_TRY { + TAO_ClientRequestInfo_Guard info_guard (this->info_, ri); + // Unwind the flow stack. size_t len = this->stack_size_; for (size_t i = 0; i < len; ++i) @@ -109,7 +120,7 @@ receive_exception (TAO_ClientRequestInfo *ri --this->stack_size_; this->interceptors_[this->stack_size_]->receive_exception ( - ri + this->info_ TAO_ENV_ARG_PARAMETER); ACE_TRY_CHECK; } @@ -153,7 +164,7 @@ receive_exception (TAO_ClientRequestInfo *ri void TAO_ClientRequestInterceptor_Adapter:: -receive_other (TAO_ClientRequestInfo *ri +receive_other (TAO_ClientRequestInfo_i *ri TAO_ENV_ARG_DECL) { // This is an "ending" interception point so we only process the @@ -165,6 +176,8 @@ receive_other (TAO_ClientRequestInfo *ri ACE_TRY { + TAO_ClientRequestInfo_Guard info_guard (this->info_, ri); + // Unwind the stack. size_t len = this->stack_size_; for (size_t i = 0; i < len; ++i) @@ -176,7 +189,7 @@ receive_other (TAO_ClientRequestInfo *ri --this->stack_size_; this->interceptors_[this->stack_size_]->receive_other ( - ri + this->info_ TAO_ENV_ARG_PARAMETER); ACE_TRY_CHECK; } @@ -192,19 +205,20 @@ receive_other (TAO_ClientRequestInfo *ri void TAO_ClientRequestInterceptor_Adapter::process_forward_request ( - TAO_ClientRequestInfo *ri, + TAO_ClientRequestInfo_i *ri, PortableInterceptor::ForwardRequest &exc TAO_ENV_ARG_DECL) { ri->forward_reference (exc); this->invoke_status_ = - this->invocation_->location_forward (exc.forward.in () TAO_ENV_ARG_PARAMETER); + this->invocation_->location_forward (exc.forward.in () + TAO_ENV_ARG_PARAMETER); ACE_CHECK; // receive_other() is potentially invoked recursively. this->receive_other (ri - TAO_ENV_ARG_PARAMETER); + TAO_ENV_ARG_PARAMETER); ACE_CHECK; } diff --git a/TAO/tao/ClientInterceptorAdapter.h b/TAO/tao/ClientInterceptorAdapter.h index 828438a8316..cef92a9e73c 100644 --- a/TAO/tao/ClientInterceptorAdapter.h +++ b/TAO/tao/ClientInterceptorAdapter.h @@ -21,7 +21,7 @@ #include "ace/pre.h" -#include "corbafwd.h" +#include "ace/config-all.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once @@ -30,19 +30,22 @@ #if TAO_HAS_INTERCEPTORS == 1 -#include "ClientRequestInfo.h" #include "Interceptor_List.h" // Forward declarations +class TAO_GIOP_Invocation; class TAO_ClientRequestInfo; +class TAO_ClientRequestInfo_i; /** * @class TAO_ClientRequestInterceptor_Adapter * - * @brief TAO_ClientRequestInterceptor_Adapter + * @brief A convenient helper class to invoke registered client request + * interceptors in client stubs. * - * A convenient helper class to invoke registered client request - * interceptor(s) in tao_idl generated code. + * This class invokes all registered interceptors at interception + * point, and enforces flow rules dictated by the Portable Interceptor + * specification/chapter. */ class TAO_Export TAO_ClientRequestInterceptor_Adapter { @@ -70,23 +73,23 @@ public: //@{ /// This method implements one of the "starting" client side /// interception points. - void send_request (TAO_ClientRequestInfo *ri - TAO_ENV_ARG_DECL_NOT_USED); + void send_request (TAO_ClientRequestInfo_i *ri + TAO_ENV_ARG_DECL); /// This method implements one of the "ending" client side /// interception point. - void receive_reply (TAO_ClientRequestInfo *ri - TAO_ENV_ARG_DECL_NOT_USED); + void receive_reply (TAO_ClientRequestInfo_i *ri + TAO_ENV_ARG_DECL); /// This method implements one of the "ending" client side /// interception point. - void receive_exception (TAO_ClientRequestInfo *ri - TAO_ENV_ARG_DECL_NOT_USED); + void receive_exception (TAO_ClientRequestInfo_i *ri + TAO_ENV_ARG_DECL); /// This method implements one of the "ending" client side /// interception point. - void receive_other (TAO_ClientRequestInfo *ri - TAO_ENV_ARG_DECL_NOT_USED); + void receive_other (TAO_ClientRequestInfo_i *ri + TAO_ENV_ARG_DECL); //@} protected: @@ -94,7 +97,7 @@ protected: /// Process the given PortableInterceptor::ForwardRequest exception, /// i.e. invoke the receive_other() interception point, in addition /// to notifying the Invocation object of the LOCATION_FORWARD. - void process_forward_request (TAO_ClientRequestInfo *ri, + void process_forward_request (TAO_ClientRequestInfo_i *ri, PortableInterceptor::ForwardRequest &exc TAO_ENV_ARG_DECL); @@ -119,6 +122,18 @@ private: /// stack. This is used when unwinding the flow stack. size_t stack_size_; + /// Pointer to the PortableInterceptor::ClientRequestInfo + /// implementation. + /** + * @note The fact that a pointer to the + * PortableInterceptor::ClientRequestInfo object in TSS is + * cached here assumes that all client side interception + * points are invoked in the same thread. This may not be the + * case for AMI! In that case, we'll have to perform a TSS + * access in each interception point. + */ + TAO_ClientRequestInfo *info_; + }; #if defined (__ACE_INLINE__) diff --git a/TAO/tao/ClientInterceptorAdapter.inl b/TAO/tao/ClientInterceptorAdapter.inl index 83bd8ebe1a3..9b5622a80c7 100644 --- a/TAO/tao/ClientInterceptorAdapter.inl +++ b/TAO/tao/ClientInterceptorAdapter.inl @@ -11,7 +11,8 @@ TAO_ClientRequestInterceptor_Adapter::TAO_ClientRequestInterceptor_Adapter invocation_ (invocation), invoke_status_ (invoke_status), len_ (0), - stack_size_ (0) + stack_size_ (0), + info_ (0) { this->len_ = interceptors.size (); } diff --git a/TAO/tao/ClientRequestInfo.cpp b/TAO/tao/ClientRequestInfo.cpp index 72692b0040a..08dedac5b24 100644 --- a/TAO/tao/ClientRequestInfo.cpp +++ b/TAO/tao/ClientRequestInfo.cpp @@ -1,13 +1,7 @@ // -*- C++ -*- -// -// $Id$ - #include "ClientRequestInfo.h" -#include "Invocation.h" -#include "Stub.h" -#include "Tagged_Components.h" -#include "debug.h" +#include "ClientRequestInfo_i.h" ACE_RCSID (TAO, ClientRequestInfo, @@ -19,61 +13,39 @@ ACE_RCSID (TAO, # include "ClientRequestInfo.inl" # endif /* !__ACE_INLINE__ */ -TAO_ClientRequestInfo::TAO_ClientRequestInfo (TAO_GIOP_Invocation *inv, - CORBA::Object_ptr target) - : invocation_ (inv), - target_ (target), // No need to duplicate. - caught_exception_ (0), - response_expected_ (1), - reply_status_ (-1) +TAO_ClientRequestInfo::TAO_ClientRequestInfo (void) + : info_ (0) { } CORBA::Object_ptr -TAO_ClientRequestInfo::target (TAO_ENV_SINGLE_ARG_DECL_NOT_USED) +TAO_ClientRequestInfo::target (TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - return CORBA::Object::_duplicate (this->target_); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA::Object::_nil ()); + + return this->info_->target (TAO_ENV_SINGLE_ARG_PARAMETER); } CORBA::Object_ptr -TAO_ClientRequestInfo::effective_target (TAO_ENV_SINGLE_ARG_DECL_NOT_USED) +TAO_ClientRequestInfo::effective_target (TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - if (this->reply_status_ == PortableInterceptor::LOCATION_FORWARD) - { - // TAO_GIOP_Invocation::forward_reference() already duplicates - // the reference before returning it so there is no need to - // duplicate it here. - return this->invocation_->forward_reference (); - } - - return CORBA::Object::_duplicate (this->target_); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA::Object::_nil ()); + + return this->info_->effective_target (TAO_ENV_SINGLE_ARG_PARAMETER); } IOP::TaggedProfile * TAO_ClientRequestInfo::effective_profile (TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - IOP::TaggedProfile *tagged_profile = 0; - ACE_NEW_THROW_EX (tagged_profile, - IOP::TaggedProfile, - CORBA::NO_MEMORY ( - CORBA::SystemException::_tao_minor_code ( - TAO_DEFAULT_MINOR_CODE, - ENOMEM), - CORBA::COMPLETED_NO)); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); ACE_CHECK_RETURN (0); - IOP::TaggedProfile_var safe_tagged_profile = tagged_profile; - - IOP::TaggedProfile &ep = - this->target_->_stubobj ()->profile_in_use ()->create_tagged_profile (); - - tagged_profile->tag = ep.tag; - tagged_profile->profile_data = ep.profile_data; // Deep copy - - return safe_tagged_profile._retn (); + return this->info_->effective_profile (TAO_ENV_SINGLE_ARG_PARAMETER); } // Use at own risk. There is no way currently of extracting an @@ -83,43 +55,10 @@ CORBA::Any * TAO_ClientRequestInfo::received_exception (TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - if (this->reply_status_ != PortableInterceptor::SYSTEM_EXCEPTION - && this->reply_status_ != PortableInterceptor::USER_EXCEPTION) - { - ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, - CORBA::COMPLETED_NO), 0); - } - - // The spec says that if it is a user exception which can't be - // inserted then the UNKNOWN exception needs to be thrown with minor - // code 1. - - CORBA::Any * temp = 0; - - ACE_NEW_THROW_EX (temp, - CORBA::Any, - CORBA::NO_MEMORY ( - CORBA_SystemException::_tao_minor_code ( - TAO_DEFAULT_MINOR_CODE, - ENOMEM), - CORBA::COMPLETED_NO)); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); ACE_CHECK_RETURN (0); - CORBA::Any_var caught_exception = temp; - - if (this->caught_exception_ != 0) - *temp <<= *(this->caught_exception_); - - return caught_exception._retn (); -} - -// = TAO specific method done since there currently is no simple way -// to extract exceptions from an Any -CORBA::Exception * -TAO_ClientRequestInfo::_received_exception (TAO_ENV_SINGLE_ARG_DECL_NOT_USED) - ACE_THROW_SPEC ((CORBA::SystemException)) -{ - return this->caught_exception_; + return this->info_->received_exception (TAO_ENV_SINGLE_ARG_PARAMETER); } char * @@ -127,15 +66,10 @@ TAO_ClientRequestInfo::received_exception_id ( TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - if (this->reply_status_ != PortableInterceptor::SYSTEM_EXCEPTION - && this->reply_status_ != PortableInterceptor::USER_EXCEPTION) - { - ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, - CORBA::COMPLETED_NO), - 0); - } - - return CORBA::string_dup (this->caught_exception_->_id ()); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return this->info_->received_exception_id (TAO_ENV_SINGLE_ARG_PARAMETER); } IOP::TaggedComponent * @@ -144,43 +78,11 @@ TAO_ClientRequestInfo::get_effective_component ( TAO_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - TAO_Tagged_Components &ecs = - this->target_->_stubobj ()->profile_in_use ()->tagged_components (); - - IOP::MultipleComponentProfile &components = ecs.components (); - - CORBA::ULong len = components.length (); - for (CORBA::ULong i = 0; i < len; ++i) - { - if (components[i].tag == id) - { - IOP::TaggedComponent *tagged_component = 0; - - // Only allocate a sequence if we have a tagged component - // that matches the given IOP::ComponentId. - ACE_NEW_THROW_EX (tagged_component, - IOP::TaggedComponent, - CORBA::NO_MEMORY ( - CORBA::SystemException::_tao_minor_code ( - TAO_DEFAULT_MINOR_CODE, - ENOMEM), - CORBA::COMPLETED_NO)); - ACE_CHECK_RETURN (0); - - IOP::TaggedComponent_var safe_tagged_component = - tagged_component; - - (*tagged_component) = components[i]; // Deep copy - - return safe_tagged_component._retn (); - } - } - - // No tagged component was found that matched the given - // IOP::ComponentId. - ACE_THROW_RETURN (CORBA::BAD_PARAM (TAO_OMG_VMCID | 28, - CORBA::COMPLETED_NO), - 0); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return this->info_->get_effective_component (id + TAO_ENV_ARG_PARAMETER); } IOP::TaggedComponentSeq * @@ -189,53 +91,11 @@ TAO_ClientRequestInfo::get_effective_components ( TAO_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - TAO_Tagged_Components &ecs = - this->target_->_stubobj ()->profile_in_use ()->tagged_components (); - - IOP::MultipleComponentProfile &components = ecs.components (); - - IOP::TaggedComponentSeq *tagged_components = 0; - IOP::TaggedComponentSeq_var safe_tagged_components; - - CORBA::ULong len = components.length (); - for (CORBA::ULong i = 0; i < len; ++i) - { - if (components[i].tag == id) - { - if (tagged_components == 0) - { - // Only allocate a sequence if we have tagged components - // to place into the sequence. - ACE_NEW_THROW_EX (tagged_components, - IOP::TaggedComponentSeq, - CORBA::NO_MEMORY ( - CORBA::SystemException::_tao_minor_code ( - TAO_DEFAULT_MINOR_CODE, - ENOMEM), - CORBA::COMPLETED_NO)); - ACE_CHECK_RETURN (0); - - safe_tagged_components = tagged_components; - } - - CORBA::ULong old_len = safe_tagged_components->length (); - safe_tagged_components->length (old_len + 1); - - safe_tagged_components[old_len] = components[i]; // Deep copy - } - } - - if (tagged_components == 0) - { - // No tagged component sequence was allocated, meaning no tagged - // components were found that matched the given - // IOP::ComponentId. - ACE_THROW_RETURN (CORBA::BAD_PARAM (TAO_OMG_VMCID | 28, - CORBA::COMPLETED_NO), - 0); - } - - return safe_tagged_components._retn (); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return this->info_->get_effective_components (id + TAO_ENV_ARG_PARAMETER); } CORBA::Policy_ptr @@ -243,21 +103,11 @@ TAO_ClientRequestInfo::get_request_policy (CORBA::PolicyType type TAO_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - // @@ Do we need to look anywhere else for the request policies? + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA::Policy::_nil ()); -#if TAO_HAS_CORBA_MESSAGING == 1 - return this->target_->_get_policy (type - TAO_ENV_ARG_PARAMETER); -#else - ACE_UNUSED_ARG (type); - - ACE_THROW_RETURN (CORBA::NO_IMPLEMENT ( - CORBA::SystemException::_tao_minor_code ( - TAO_DEFAULT_MINOR_CODE, - ENOTSUP), - CORBA::COMPLETED_NO), - 0); -#endif /* TAO_HAS_CORBA_MESSAGING == 1 */ + return this->info_->get_request_policy (type + TAO_ENV_ARG_PARAMETER); } void @@ -267,177 +117,104 @@ TAO_ClientRequestInfo::add_request_service_context ( TAO_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - // Get the service context from the list - TAO_Service_Context &service_context_list = - this->invocation_->request_service_context (); - - if (service_context_list.set_context (service_context, replace) == 0) - { - ACE_THROW (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 15, - CORBA::COMPLETED_NO)); - } + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + this->info_->add_request_service_context (service_context, + replace + TAO_ENV_ARG_PARAMETER); + ACE_CHECK; } CORBA::ULong TAO_ClientRequestInfo::request_id (TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - // @todo We may have to worry about AMI once we support interceptors - // in AMI requests since the Invocation object no longer - // exists once an AMI request has been made. In that case, - // the reply dispatcher address should be used. - - // The request ID must be unique across all outstanding requests. - // To avoid synchronization overhead, the address of this Invocation - // object is used as the request ID. This guarantees that the - // request ID is unique without being forced to acquire a lock. - // - // For 64-bit platforms, we right shift 8 bits and then use the - // lower 32 bits of that shifted value. Rather than losing the - // upper 32 bits of significant digits by taking the lower 32 bits, - // we only lose the upper 24 by doing the shift. Basically, the - // resulting request ID will comprised of bits 8 through 39. This is - // made possible by the fact that this Invocation object is large - // enough to increase the likelihood that those bits (0 through 39) - // are unique. In particular, this->buffer_ is 512 bytes - // (ACE_CDR::DEFAULT_BUFSIZE) long by default; implying that - // dropping the lower 8 bits of the this Invocation object's 64 bit - // address (i.e. 256 bytes) is not a problem. - - CORBA::ULong id = 0; - - // Note that we reinterpret_cast to an "unsigned long" instead of - // CORBA::ULong since we need to first cast to an integer large - // enough to hold an address to avoid compile-time warnings on some - // 64-bit platforms. - - // 32 bit address - if (sizeof (this) == 4) - id = ACE_reinterpret_cast (unsigned long, this->invocation_); - - // 64 bit address -- bits 8 through 39 (see notes above!) - // In this case, we make sure this object is large enough to safely - // do the right shift. This is necessary since the size of the - // buffer that makes this object is configurable. - else if (sizeof (this) == 8 - && sizeof (*(this->invocation_)) > 256 /* 2 << 8 */) - id = - (ACE_reinterpret_cast (unsigned long, - this->invocation_) >> 8) & 0xFFFFFFFFu; - - // 64 bit address -- lower 32 bits - else if (sizeof (this) == 8) - id = ACE_reinterpret_cast (unsigned long, - this->invocation_) & 0xFFFFFFFFu; - - // @@ The following request ID generator prevents the - // PortableInterceptor::ClientRequestInterceptor::send_request() - // interception point from occuring before the call to connect, - // thus preventing us from adding an optimization that itself - // prevents a connection from being unnecessarily performed. - // Thus, the ClientRequestInfo object is forced to have its own - // request ID generator in order to make it possible to implement - // the above optimization. - // - // Ideally, this request ID generator should go away, especially - // since it adds a lock to the critical path. - // else // Fallback - // id = this->invocation_->request_id (); - - else - { - if (TAO_debug_level > 0) - ACE_ERROR ((LM_ERROR, - "(%P|%t) ClientRequestInfo::request_id() failed\n" - "(%P|%t) since its request ID generator is not\n" - "(%P|%t) supported on this platform.\n")); - - ACE_THROW_RETURN (CORBA::INTERNAL (), 0); - } - - return id; + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return this->info_->request_id (TAO_ENV_SINGLE_ARG_PARAMETER); } char * -TAO_ClientRequestInfo::operation (TAO_ENV_SINGLE_ARG_DECL_NOT_USED) +TAO_ClientRequestInfo::operation (TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - return CORBA::string_dup (this->invocation_->operation ()); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return this->info_->operation (TAO_ENV_SINGLE_ARG_PARAMETER); } Dynamic::ParameterList * TAO_ClientRequestInfo::arguments (TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, - CORBA::COMPLETED_NO), - 0); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return this->info_->arguments (TAO_ENV_SINGLE_ARG_PARAMETER); } Dynamic::ExceptionList * TAO_ClientRequestInfo::exceptions (TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, - CORBA::COMPLETED_NO), - 0); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return this->info_->exceptions (TAO_ENV_SINGLE_ARG_PARAMETER); } Dynamic::ContextList * TAO_ClientRequestInfo::contexts (TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, - CORBA::COMPLETED_NO), - 0); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return this->info_->contexts (TAO_ENV_SINGLE_ARG_PARAMETER); } Dynamic::RequestContext * TAO_ClientRequestInfo::operation_context (TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, - CORBA::COMPLETED_NO), - 0); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return this->info_->operation_context (TAO_ENV_SINGLE_ARG_PARAMETER); } CORBA::Any * TAO_ClientRequestInfo::result (TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, - CORBA::COMPLETED_NO), - 0); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return this->info_->result (TAO_ENV_SINGLE_ARG_PARAMETER); } CORBA::Boolean -TAO_ClientRequestInfo::response_expected (TAO_ENV_SINGLE_ARG_DECL_NOT_USED) +TAO_ClientRequestInfo::response_expected (TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - return this->response_expected_; + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return this->info_->response_expected (TAO_ENV_SINGLE_ARG_PARAMETER); } -# if TAO_HAS_CORBA_MESSAGING == 1 +#if TAO_HAS_CORBA_MESSAGING == 1 CORBA::Short TAO_ClientRequestInfo::sync_scope (TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - TAO_GIOP_Oneway_Invocation *inv = - ACE_dynamic_cast (TAO_GIOP_Oneway_Invocation *, - this->invocation_); - - // The response_expected_ check is a precautionary measure for - // platforms that do not support RTTI, i.e. where the dynamic_cast - // above would incorrectly work. If the response_expected flag is - // not equal to zero then it is fairly safe to assume that the - // invocation is not a one-way, meaning that the sync_scope() method - // is not available. - if (inv != 0 && this->response_expected_ == 0) - return inv->sync_scope (); - - ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, - CORBA::COMPLETED_NO), - -1); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return this->info_->sync_scope (TAO_ENV_SINGLE_ARG_PARAMETER); } #endif /* TAO_HAS_CORBA_MESSAGING == 1 */ @@ -445,28 +222,20 @@ PortableInterceptor::ReplyStatus TAO_ClientRequestInfo::reply_status (TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - if (this->reply_status_ == -1) - // A reply hasn't been received yet. - ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, - CORBA::COMPLETED_NO), - -1); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (PortableInterceptor::SYSTEM_EXCEPTION); - return this->reply_status_; + return this->info_->reply_status (TAO_ENV_SINGLE_ARG_PARAMETER); } CORBA::Object_ptr TAO_ClientRequestInfo::forward_reference (TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - if (this->reply_status_ != PortableInterceptor::LOCATION_FORWARD) - ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, - CORBA::COMPLETED_NO), - CORBA::Object::_nil ()); - - // TAO_GIOP_Invocation::forward_reference() already duplicates the - // reference before returning it so there is no need to duplicate it - // here. - return this->invocation_->forward_reference (); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA::Object::_nil ()); + + return this->info_->forward_reference (TAO_ENV_SINGLE_ARG_PARAMETER); } CORBA::Any * @@ -475,26 +244,11 @@ TAO_ClientRequestInfo::get_slot (PortableInterceptor::SlotId id ACE_THROW_SPEC ((CORBA::SystemException, PortableInterceptor::InvalidSlot)) { - // @@ This implementation incurs a TSS access each time it is - // invoked. It need not do that. This method can be invoked by - // each client request interceptor multiple times. At some point - // we need to add the request scope current to the Invocation - // object or some other object that is tied to a given - // invocation. That way, only one TSS access would be - // introduced. - // -Ossama - - TAO_PICurrent *pi_current = - this->invocation_->orb_core ()->pi_current (); - - if (pi_current == 0) - ACE_THROW_RETURN (CORBA::INTERNAL (), 0); - - // PICurrent is read-only during a request invocation on the client - // side. No copying is necessary. - return - pi_current->get_slot (id - TAO_ENV_ARG_PARAMETER); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return this->info_->get_slot (id + TAO_ENV_ARG_PARAMETER); } IOP::ServiceContext * @@ -503,88 +257,37 @@ TAO_ClientRequestInfo::get_request_service_context ( TAO_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - // Get the service context from the list - TAO_Service_Context &service_context_list = - this->invocation_->request_service_context (); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); - return this->get_service_context_i (service_context_list, - id - TAO_ENV_ARG_PARAMETER); + return this->info_->get_request_service_context (id + TAO_ENV_ARG_PARAMETER); } - IOP::ServiceContext * TAO_ClientRequestInfo::get_reply_service_context ( IOP::ServiceId id TAO_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - // Get the service context from the list - TAO_Service_Context &service_context_list = - this->invocation_->reply_service_context (); + this->check_validity (TAO_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); - return this->get_service_context_i (service_context_list, - id - TAO_ENV_ARG_PARAMETER); + return this->info_->get_reply_service_context (id + TAO_ENV_ARG_PARAMETER); } -IOP::ServiceContext * -TAO_ClientRequestInfo::get_service_context_i ( - TAO_Service_Context &service_context_list, - IOP::ServiceId id - TAO_ENV_ARG_DECL) - ACE_THROW_SPEC ((CORBA::SystemException)) -{ - // Create a new service context to be returned. Assume - // success. - IOP::ServiceContext *service_context = 0; - ACE_NEW_THROW_EX (service_context, - IOP::ServiceContext, - CORBA::NO_MEMORY ( - CORBA::SystemException::_tao_minor_code ( - TAO_DEFAULT_MINOR_CODE, - ENOMEM), - CORBA::COMPLETED_NO)); - ACE_CHECK_RETURN (0); - IOP::ServiceContext_var safe_service_context = service_context; - - service_context->context_id = id; - if (service_context_list.get_context (*service_context) != 0) - { - // Found. - return safe_service_context._retn (); - } - else - { - // Not found. - ACE_THROW_RETURN (CORBA::BAD_PARAM (TAO_OMG_VMCID | 23, - CORBA::COMPLETED_NO), - 0); - } -} +// ------------------------------------------------------------------- -void -TAO_ClientRequestInfo::reply_status (int invoke_status) + +TAO_ClientRequestInfo_Guard::~TAO_ClientRequestInfo_Guard (void) { - switch (invoke_status) - { - case TAO_INVOKE_OK: - this->reply_status_ = PortableInterceptor::SUCCESSFUL; - break; - case TAO_INVOKE_RESTART: - if (this->invocation_->received_location_forward ()) - this->reply_status_ = PortableInterceptor::LOCATION_FORWARD; - else - this->reply_status_ = PortableInterceptor::TRANSPORT_RETRY; - break; - default: - // We should only get here if the invocation status is - // TAO_INVOKE_EXCEPTION, i.e. a CORBA::SystemException, so set - // the appropriate reply status. - this->reply_status_ = PortableInterceptor::SYSTEM_EXCEPTION; - break; - } + // Restore the previous request information into the TSS object. + // Note that no TSS access occurs here. + if (this->info_ != 0) + this->info_->info (this->previous_info_); } + #endif /* TAO_HAS_INTERCEPTORS == 1 */ diff --git a/TAO/tao/ClientRequestInfo.h b/TAO/tao/ClientRequestInfo.h index be0c5220b21..d8ee7893885 100644 --- a/TAO/tao/ClientRequestInfo.h +++ b/TAO/tao/ClientRequestInfo.h @@ -9,7 +9,6 @@ * This is the implementation of the * PortableInterceptor::ClientRequestInfo interface. * - * @author Kirthika Parameswaran <kirthika@cs.wustl.edu> * @author Ossama Othman <ossama@uci.edu> */ //============================================================================= @@ -36,26 +35,38 @@ #include "PortableInterceptorC.h" #include "LocalObject.h" -#include "StringSeqC.h" -#include "Service_Context.h" +//#include "StringSeqC.h" -class TAO_GIOP_Invocation; +class TAO_ClientRequestInfo_i; /** * @class TAO_ClientRequestInfo * * @brief Implementation of the PortableInterceptor::ClientRequestInfo * interface. + * + * This class forwards all method calls to the underlying + * ClientRequestInfo implementation. + * @par + * An instance of this class is places in TSS, where as the underlying + * implementation is instantiated on the stack during each CORBA + * request. During each request invocation, a pointer to the stack + * instantiated implementation is placed in the instance of this + * class. + * @par + * This may seem unnecessary. However, it is necessary to avoid + * instantiating an object that inherits from CORBA::Object in the + * critical path. Such an instantiation would cause a lock to be + * initialized (not acquired) in the critical path, which can degrade + * performance significantly. */ -class TAO_Export TAO_ClientRequestInfo +class TAO_ClientRequestInfo : public virtual PortableInterceptor::ClientRequestInfo, - public virtual CORBA::LocalObject + public virtual TAO_Local_RefCounted_Object { public: - /// Constructor. - TAO_ClientRequestInfo (TAO_GIOP_Invocation *invocation, - CORBA::Object_ptr target); + TAO_ClientRequestInfo (void); /// Return an ID unique to the current request. This request ID may /// or may not be the same as the GIOP request ID. @@ -168,15 +179,6 @@ public: TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException)); - /** - * @note This is TAO specific and was done to combat the previous - * problem to some extent. Avoid this method whenever - * possible. - */ - virtual CORBA::Exception * _received_exception ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) - ACE_THROW_SPEC ((CORBA::SystemException)); - /// Return the repository ID for the received exception. virtual char * received_exception_id ( TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) @@ -213,59 +215,67 @@ public: TAO_ENV_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException)); - /** - * @name Stub helper methods - * - * The following methods are used in the implementation of the - * Stubs, they are not part of the ClientRequestInfo interface, but - * an extension used internally by TAO. - */ - //@{ + /// Set the ClientRequestInfo implementation which this class + /// forwards all method call to. + void info (TAO_ClientRequestInfo_i *info); - /// Change the exception status. - void exception (CORBA::Exception *exception); + /// Get the ClientRequestInfo implementation which this class + /// forwards all method call to. + TAO_ClientRequestInfo_i * info (void) const; - /// Set the flag that states whether or not a response is expected. - /// For example, no response is expected in a one-way operation. - void response_expected (CORBA::Boolean flag); +private: - /// Set the status of the received reply. - void reply_status (int invoke_status); + /// Check if this ClientRequestInfo object is called within the + /// context of a request. + void check_validity (TAO_ENV_ARG_DECL); - /// Extract the forward object reference from the - /// PortableInterceptor::ForwardRequest exception, and set the reply - /// status flag accordingly. - void forward_reference (PortableInterceptor::ForwardRequest &exc); - //@} +private: -protected: + /// Pointer to the object that actually implements the + /// ClientRequestInfo functionality. + TAO_ClientRequestInfo_i * info_; - /// Helper method to get the request and response service contexts. - IOP::ServiceContext *get_service_context_i ( - TAO_Service_Context &service_context_list, - IOP::ServiceId id - TAO_ENV_ARG_DECL) - ACE_THROW_SPEC ((CORBA::SystemException)); +}; -protected: - /// Pointer to the GIOP invocation object. - TAO_GIOP_Invocation *invocation_; +// ------------------------------------------------------------------- - /// Reference to the target object. - CORBA::Object_ptr target_; - /// Pointer to the caught exception. - CORBA::Exception *caught_exception_; +/** + * @class TAO_ClientRequestInfo_Guard + * + * @brief Guard for exception safe TAO_ClientRequestInfo_i pointer + * swapping. + * + * This class is used to ensure the swapping of + * TAO_ClientRequestInfo_i pointers in a TAO_ClientRequestInfo object + * is performed in an exception-safe manner when interception points + * are being invoked. + */ +class TAO_ClientRequestInfo_Guard +{ +public: - /// True if a two-way operation, false otherwise. - CORBA::Boolean response_expected_; + /// Constructor. + TAO_ClientRequestInfo_Guard (TAO_ClientRequestInfo *info, + TAO_ClientRequestInfo_i *ri); + + /// Destructor. + ~TAO_ClientRequestInfo_Guard (void); + +private: - /// Reply status for the current request. - PortableInterceptor::ReplyStatus reply_status_; + /// Pointer to the TAO_ClientRequestInfo object upon which pointer + /// swaps will occur. + TAO_ClientRequestInfo * info_; + + /// Pointer to the TAO_ClientRequestInfo_i object that was + /// previously stored in the TAO_ClientRequestInfo object. + TAO_ClientRequestInfo_i * previous_info_; }; + # if defined (__ACE_INLINE__) # include "ClientRequestInfo.inl" # endif /* __ACE_INLINE__ */ diff --git a/TAO/tao/ClientRequestInfo.inl b/TAO/tao/ClientRequestInfo.inl index f88e8ec698f..6ca66ea946a 100644 --- a/TAO/tao/ClientRequestInfo.inl +++ b/TAO/tao/ClientRequestInfo.inl @@ -3,34 +3,39 @@ // $Id$ ACE_INLINE void -TAO_ClientRequestInfo::exception (CORBA::Exception *exception) +TAO_ClientRequestInfo::check_validity (TAO_ENV_ARG_DECL) { - if (CORBA::SystemException::_downcast (exception) != 0) - this->reply_status_ = PortableInterceptor::SYSTEM_EXCEPTION; - else if (CORBA::UserException::_downcast (exception) != 0) - this->reply_status_ = PortableInterceptor::USER_EXCEPTION; - - // @@ Is it possible for both of the above downcasts to fail? - - this->caught_exception_ = exception; + if (this->info_ == 0) + ACE_THROW (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, + CORBA::COMPLETED_NO)); } ACE_INLINE void -TAO_ClientRequestInfo::response_expected (CORBA::Boolean flag) +TAO_ClientRequestInfo::info (TAO_ClientRequestInfo_i *info) { - this->response_expected_ = flag; + this->info_ = info; } -ACE_INLINE void -TAO_ClientRequestInfo::forward_reference ( - PortableInterceptor::ForwardRequest &) +ACE_INLINE TAO_ClientRequestInfo_i * +TAO_ClientRequestInfo::info (void) const { - // Note that we're converting the ForwardRequest exception in to a - // LOCATION_FORWARD reply, so we do not set the exception status. - // - // The forward object reference is not handled here. Rather, it is - // handled by the TAO_GIOP_Invocation object so that its profiles - // can be added to the list of forward profiles. + return this->info_; +} - this->reply_status_ = PortableInterceptor::LOCATION_FORWARD; + +// ------------------------------------------------------------------- + + +ACE_INLINE +TAO_ClientRequestInfo_Guard::TAO_ClientRequestInfo_Guard ( + TAO_ClientRequestInfo * info, + TAO_ClientRequestInfo_i * ri) + : info_ (info), + previous_info_ (0) +{ + if (info != 0) + { + this->previous_info_ = info->info (); + info->info (ri); + } } diff --git a/TAO/tao/ClientRequestInfo_i.cpp b/TAO/tao/ClientRequestInfo_i.cpp new file mode 100644 index 00000000000..c8f98853255 --- /dev/null +++ b/TAO/tao/ClientRequestInfo_i.cpp @@ -0,0 +1,578 @@ +// -*- C++ -*- + +#include "ClientRequestInfo_i.h" +#include "Invocation.h" +#include "Stub.h" +#include "Tagged_Components.h" +#include "debug.h" + +ACE_RCSID (TAO, + ClientRequestInfo_i, + "$Id$") + +#if TAO_HAS_INTERCEPTORS == 1 + +# if !defined (__ACE_INLINE__) +# include "ClientRequestInfo_i.inl" +# endif /* !__ACE_INLINE__ */ + +TAO_ClientRequestInfo_i::TAO_ClientRequestInfo_i (TAO_GIOP_Invocation *inv, + CORBA::Object_ptr target) + : invocation_ (inv), + target_ (target), // No need to duplicate. + caught_exception_ (0), + response_expected_ (1), + reply_status_ (-1) +{ +} + +CORBA::Object_ptr +TAO_ClientRequestInfo_i::target (TAO_ENV_SINGLE_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + return CORBA::Object::_duplicate (this->target_); +} + +CORBA::Object_ptr +TAO_ClientRequestInfo_i::effective_target (TAO_ENV_SINGLE_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + if (this->reply_status_ == PortableInterceptor::LOCATION_FORWARD) + { + // TAO_GIOP_Invocation::forward_reference() already duplicates + // the reference before returning it so there is no need to + // duplicate it here. + return this->invocation_->forward_reference (); + } + + return CORBA::Object::_duplicate (this->target_); +} + +IOP::TaggedProfile * +TAO_ClientRequestInfo_i::effective_profile (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + IOP::TaggedProfile *tagged_profile = 0; + ACE_NEW_THROW_EX (tagged_profile, + IOP::TaggedProfile, + CORBA::NO_MEMORY ( + CORBA::SystemException::_tao_minor_code ( + TAO_DEFAULT_MINOR_CODE, + ENOMEM), + CORBA::COMPLETED_NO)); + ACE_CHECK_RETURN (0); + + IOP::TaggedProfile_var safe_tagged_profile = tagged_profile; + + IOP::TaggedProfile &ep = + this->target_->_stubobj ()->profile_in_use ()->create_tagged_profile (); + + tagged_profile->tag = ep.tag; + tagged_profile->profile_data = ep.profile_data; // Deep copy + + return safe_tagged_profile._retn (); +} + +// Use at own risk. There is no way currently of extracting an +// exception from an Any. This method is in place just to be compliant +// with the spec. +CORBA::Any * +TAO_ClientRequestInfo_i::received_exception (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + if (this->reply_status_ != PortableInterceptor::SYSTEM_EXCEPTION + && this->reply_status_ != PortableInterceptor::USER_EXCEPTION) + { + ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, + CORBA::COMPLETED_NO), 0); + } + + // The spec says that if it is a user exception which can't be + // inserted then the UNKNOWN exception needs to be thrown with minor + // code 1. + + CORBA::Any * temp = 0; + + ACE_NEW_THROW_EX (temp, + CORBA::Any, + CORBA::NO_MEMORY ( + CORBA_SystemException::_tao_minor_code ( + TAO_DEFAULT_MINOR_CODE, + ENOMEM), + CORBA::COMPLETED_NO)); + ACE_CHECK_RETURN (0); + + CORBA::Any_var caught_exception = temp; + + if (this->caught_exception_ != 0) + *temp <<= *(this->caught_exception_); + + return caught_exception._retn (); +} + +char * +TAO_ClientRequestInfo_i::received_exception_id ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + if (this->reply_status_ != PortableInterceptor::SYSTEM_EXCEPTION + && this->reply_status_ != PortableInterceptor::USER_EXCEPTION) + { + ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, + CORBA::COMPLETED_NO), + 0); + } + + return CORBA::string_dup (this->caught_exception_->_id ()); +} + +IOP::TaggedComponent * +TAO_ClientRequestInfo_i::get_effective_component ( + IOP::ComponentId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + TAO_Tagged_Components &ecs = + this->target_->_stubobj ()->profile_in_use ()->tagged_components (); + + IOP::MultipleComponentProfile &components = ecs.components (); + + CORBA::ULong len = components.length (); + for (CORBA::ULong i = 0; i < len; ++i) + { + if (components[i].tag == id) + { + IOP::TaggedComponent *tagged_component = 0; + + // Only allocate a sequence if we have a tagged component + // that matches the given IOP::ComponentId. + ACE_NEW_THROW_EX (tagged_component, + IOP::TaggedComponent, + CORBA::NO_MEMORY ( + CORBA::SystemException::_tao_minor_code ( + TAO_DEFAULT_MINOR_CODE, + ENOMEM), + CORBA::COMPLETED_NO)); + ACE_CHECK_RETURN (0); + + IOP::TaggedComponent_var safe_tagged_component = + tagged_component; + + (*tagged_component) = components[i]; // Deep copy + + return safe_tagged_component._retn (); + } + } + + // No tagged component was found that matched the given + // IOP::ComponentId. + ACE_THROW_RETURN (CORBA::BAD_PARAM (TAO_OMG_VMCID | 28, + CORBA::COMPLETED_NO), + 0); +} + +IOP::TaggedComponentSeq * +TAO_ClientRequestInfo_i::get_effective_components ( + IOP::ComponentId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + TAO_Tagged_Components &ecs = + this->target_->_stubobj ()->profile_in_use ()->tagged_components (); + + IOP::MultipleComponentProfile &components = ecs.components (); + + IOP::TaggedComponentSeq *tagged_components = 0; + IOP::TaggedComponentSeq_var safe_tagged_components; + + CORBA::ULong len = components.length (); + for (CORBA::ULong i = 0; i < len; ++i) + { + if (components[i].tag == id) + { + if (tagged_components == 0) + { + // Only allocate a sequence if we have tagged components + // to place into the sequence. + ACE_NEW_THROW_EX (tagged_components, + IOP::TaggedComponentSeq, + CORBA::NO_MEMORY ( + CORBA::SystemException::_tao_minor_code ( + TAO_DEFAULT_MINOR_CODE, + ENOMEM), + CORBA::COMPLETED_NO)); + ACE_CHECK_RETURN (0); + + safe_tagged_components = tagged_components; + } + + CORBA::ULong old_len = safe_tagged_components->length (); + safe_tagged_components->length (old_len + 1); + + safe_tagged_components[old_len] = components[i]; // Deep copy + } + } + + if (tagged_components == 0) + { + // No tagged component sequence was allocated, meaning no tagged + // components were found that matched the given + // IOP::ComponentId. + ACE_THROW_RETURN (CORBA::BAD_PARAM (TAO_OMG_VMCID | 28, + CORBA::COMPLETED_NO), + 0); + } + + return safe_tagged_components._retn (); +} + +CORBA::Policy_ptr +TAO_ClientRequestInfo_i::get_request_policy (CORBA::PolicyType type + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + // @@ Do we need to look anywhere else for the request policies? + +#if TAO_HAS_CORBA_MESSAGING == 1 + return this->target_->_get_policy (type + TAO_ENV_ARG_PARAMETER); +#else + ACE_UNUSED_ARG (type); + + ACE_THROW_RETURN (CORBA::NO_IMPLEMENT ( + CORBA::SystemException::_tao_minor_code ( + TAO_DEFAULT_MINOR_CODE, + ENOTSUP), + CORBA::COMPLETED_NO), + 0); +#endif /* TAO_HAS_CORBA_MESSAGING == 1 */ +} + +void +TAO_ClientRequestInfo_i::add_request_service_context ( + const IOP::ServiceContext & service_context, + CORBA::Boolean replace + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + // Get the service context from the list + TAO_Service_Context &service_context_list = + this->invocation_->request_service_context (); + + if (service_context_list.set_context (service_context, replace) == 0) + { + ACE_THROW (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 15, + CORBA::COMPLETED_NO)); + } +} + +CORBA::ULong +TAO_ClientRequestInfo_i::request_id (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + // @todo We may have to worry about AMI once we support interceptors + // in AMI requests since the Invocation object no longer + // exists once an AMI request has been made. In that case, + // the reply dispatcher address should be used. + + // The request ID must be unique across all outstanding requests. + // To avoid synchronization overhead, the address of this Invocation + // object is used as the request ID. This guarantees that the + // request ID is unique without being forced to acquire a lock. + // + // For 64-bit platforms, we right shift 8 bits and then use the + // lower 32 bits of that shifted value. Rather than losing the + // upper 32 bits of significant digits by taking the lower 32 bits, + // we only lose the upper 24 by doing the shift. Basically, the + // resulting request ID will comprised of bits 8 through 39. This is + // made possible by the fact that this Invocation object is large + // enough to increase the likelihood that those bits (0 through 39) + // are unique. In particular, this->buffer_ is 512 bytes + // (ACE_CDR::DEFAULT_BUFSIZE) long by default; implying that + // dropping the lower 8 bits of the this Invocation object's 64 bit + // address (i.e. 256 bytes) is not a problem. + + CORBA::ULong id = 0; + + // Note that we reinterpret_cast to an "unsigned long" instead of + // CORBA::ULong since we need to first cast to an integer large + // enough to hold an address to avoid compile-time warnings on some + // 64-bit platforms. + + // 32 bit address + if (sizeof (this) == 4) + id = ACE_reinterpret_cast (unsigned long, this->invocation_); + + // 64 bit address -- bits 8 through 39 (see notes above!) + // In this case, we make sure this object is large enough to safely + // do the right shift. This is necessary since the size of the + // buffer that makes this object is configurable. + else if (sizeof (this) == 8 + && sizeof (*(this->invocation_)) > 256 /* 2 << 8 */) + id = + (ACE_reinterpret_cast (unsigned long, + this->invocation_) >> 8) & 0xFFFFFFFFu; + + // 64 bit address -- lower 32 bits + else if (sizeof (this) == 8) + id = ACE_reinterpret_cast (unsigned long, + this->invocation_) & 0xFFFFFFFFu; + + // @@ The following request ID generator prevents the + // PortableInterceptor::ClientRequestInterceptor::send_request() + // interception point from occuring before the call to connect, + // thus preventing us from adding an optimization that itself + // prevents a connection from being unnecessarily performed. + // Thus, the ClientRequestInfo object is forced to have its own + // request ID generator in order to make it possible to implement + // the above optimization. + // + // Ideally, this request ID generator should go away, especially + // since it adds a lock to the critical path. + // else // Fallback + // id = this->invocation_->request_id (); + + else + { + if (TAO_debug_level > 0) + ACE_ERROR ((LM_ERROR, + "(%P|%t) ClientRequestInfo::request_id() failed\n" + "(%P|%t) since its request ID generator is not\n" + "(%P|%t) supported on this platform.\n")); + + ACE_THROW_RETURN (CORBA::INTERNAL (), 0); + } + + return id; +} + +char * +TAO_ClientRequestInfo_i::operation (TAO_ENV_SINGLE_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + return CORBA::string_dup (this->invocation_->operation ()); +} + +Dynamic::ParameterList * +TAO_ClientRequestInfo_i::arguments (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, + CORBA::COMPLETED_NO), + 0); +} + +Dynamic::ExceptionList * +TAO_ClientRequestInfo_i::exceptions (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, + CORBA::COMPLETED_NO), + 0); +} + +Dynamic::ContextList * +TAO_ClientRequestInfo_i::contexts (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, + CORBA::COMPLETED_NO), + 0); +} + +Dynamic::RequestContext * +TAO_ClientRequestInfo_i::operation_context (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, + CORBA::COMPLETED_NO), + 0); +} + +CORBA::Any * +TAO_ClientRequestInfo_i::result (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, + CORBA::COMPLETED_NO), + 0); +} + +CORBA::Boolean +TAO_ClientRequestInfo_i::response_expected (TAO_ENV_SINGLE_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + return this->response_expected_; +} + +# if TAO_HAS_CORBA_MESSAGING == 1 +CORBA::Short +TAO_ClientRequestInfo_i::sync_scope (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + TAO_GIOP_Oneway_Invocation *inv = + ACE_dynamic_cast (TAO_GIOP_Oneway_Invocation *, + this->invocation_); + + // The response_expected_ check is a precautionary measure for + // platforms that do not support RTTI, i.e. where the dynamic_cast + // above would incorrectly work. If the response_expected flag is + // not equal to zero then it is fairly safe to assume that the + // invocation is not a one-way, meaning that the sync_scope() method + // is not available. + if (inv != 0 && this->response_expected_ == 0) + return inv->sync_scope (); + + ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, + CORBA::COMPLETED_NO), + -1); +} +#endif /* TAO_HAS_CORBA_MESSAGING == 1 */ + +PortableInterceptor::ReplyStatus +TAO_ClientRequestInfo_i::reply_status (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + if (this->reply_status_ == -1) + // A reply hasn't been received yet. + ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, + CORBA::COMPLETED_NO), + -1); + + return this->reply_status_; +} + +CORBA::Object_ptr +TAO_ClientRequestInfo_i::forward_reference (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + if (this->reply_status_ != PortableInterceptor::LOCATION_FORWARD) + ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (TAO_OMG_VMCID | 14, + CORBA::COMPLETED_NO), + CORBA::Object::_nil ()); + + // TAO_GIOP_Invocation::forward_reference() already duplicates the + // reference before returning it so there is no need to duplicate it + // here. + return this->invocation_->forward_reference (); +} + +CORBA::Any * +TAO_ClientRequestInfo_i::get_slot (PortableInterceptor::SlotId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::InvalidSlot)) +{ + // @@ This implementation incurs a TSS access each time it is + // invoked. It need not do that. This method can be invoked by + // each client request interceptor multiple times. At some point + // we need to add the request scope current to the Invocation + // object or some other object that is tied to a given + // invocation. That way, only one TSS access would be + // introduced. + // -Ossama + + TAO_PICurrent *pi_current = + this->invocation_->orb_core ()->pi_current (); + + if (pi_current == 0) + ACE_THROW_RETURN (CORBA::INTERNAL (), 0); + + // PICurrent is read-only during a request invocation on the client + // side. No copying is necessary. + return + pi_current->get_slot (id + TAO_ENV_ARG_PARAMETER); +} + +IOP::ServiceContext * +TAO_ClientRequestInfo_i::get_request_service_context ( + IOP::ServiceId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + // Get the service context from the list + TAO_Service_Context &service_context_list = + this->invocation_->request_service_context (); + + return this->get_service_context_i (service_context_list, + id + TAO_ENV_ARG_PARAMETER); +} + + +IOP::ServiceContext * +TAO_ClientRequestInfo_i::get_reply_service_context ( + IOP::ServiceId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + // Get the service context from the list + TAO_Service_Context &service_context_list = + this->invocation_->reply_service_context (); + + return this->get_service_context_i (service_context_list, + id + TAO_ENV_ARG_PARAMETER); +} + +IOP::ServiceContext * +TAO_ClientRequestInfo_i::get_service_context_i ( + TAO_Service_Context &service_context_list, + IOP::ServiceId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + // Create a new service context to be returned. Assume + // success. + IOP::ServiceContext *service_context = 0; + ACE_NEW_THROW_EX (service_context, + IOP::ServiceContext, + CORBA::NO_MEMORY ( + CORBA::SystemException::_tao_minor_code ( + TAO_DEFAULT_MINOR_CODE, + ENOMEM), + CORBA::COMPLETED_NO)); + ACE_CHECK_RETURN (0); + + IOP::ServiceContext_var safe_service_context = service_context; + + service_context->context_id = id; + if (service_context_list.get_context (*service_context) != 0) + { + // Found. + return safe_service_context._retn (); + } + else + { + // Not found. + ACE_THROW_RETURN (CORBA::BAD_PARAM (TAO_OMG_VMCID | 23, + CORBA::COMPLETED_NO), + 0); + } +} + +void +TAO_ClientRequestInfo_i::reply_status (int invoke_status) +{ + switch (invoke_status) + { + case TAO_INVOKE_OK: + this->reply_status_ = PortableInterceptor::SUCCESSFUL; + break; + case TAO_INVOKE_RESTART: + if (this->invocation_->received_location_forward ()) + this->reply_status_ = PortableInterceptor::LOCATION_FORWARD; + else + this->reply_status_ = PortableInterceptor::TRANSPORT_RETRY; + break; + default: + // We should only get here if the invocation status is + // TAO_INVOKE_EXCEPTION, i.e. a CORBA::SystemException, so set + // the appropriate reply status. + this->reply_status_ = PortableInterceptor::SYSTEM_EXCEPTION; + break; + } +} + +#endif /* TAO_HAS_INTERCEPTORS == 1 */ diff --git a/TAO/tao/ClientRequestInfo_i.h b/TAO/tao/ClientRequestInfo_i.h new file mode 100644 index 00000000000..d2a0b5f50e5 --- /dev/null +++ b/TAO/tao/ClientRequestInfo_i.h @@ -0,0 +1,253 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file ClientRequestInfo_i.h + * + * $Id$ + * + * This is the implementation of the + * PortableInterceptor::ClientRequestInfo interface. + * + * @author Ossama Othman <ossama@uci.edu> + * @author Kirthika Parameswaran <kirthika@cs.wustl.edu> + */ +//============================================================================= + +#ifndef TAO_CLIENT_REQUEST_INFO_I_H +#define TAO_CLIENT_REQUEST_INFO_I_H + +#include "ace/pre.h" + +#include "corbafwd.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#if (TAO_HAS_INTERCEPTORS == 1) + +#include "PortableInterceptorC.h" +#include "StringSeqC.h" +#include "Service_Context.h" + +class TAO_GIOP_Invocation; + +/** + * @class TAO_ClientRequestInfo_i + * + * @brief Implementation of the PortableInterceptor::ClientRequestInfo + * interface. + */ +class TAO_Export TAO_ClientRequestInfo_i +{ +public: + + /// Constructor. + TAO_ClientRequestInfo_i (TAO_GIOP_Invocation *invocation, + CORBA::Object_ptr target); + + /// Return an ID unique to the current request. This request ID may + /// or may not be the same as the GIOP request ID. + CORBA::ULong request_id ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the operation name for the current request. + char * operation ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the list of arguments passed to the current operation. + virtual Dynamic::ParameterList * arguments (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the list of exceptions the current operation is capable + /// of throwing. + virtual Dynamic::ExceptionList * exceptions (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + Dynamic::ContextList * contexts ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + Dynamic::RequestContext * operation_context ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the result of the current request. If there is no return + /// value then an Any with tk_void TypeCode is returned. This is + /// method is not valid for oneway operations. + virtual CORBA::Any * result (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Returns true for a two-way operation, and false otherwise. + CORBA::Boolean response_expected (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) ; + +#if TAO_HAS_CORBA_MESSAGING == 1 + /// Return the sync_scope policy value for the current one-way + /// operation. If the operation is not a one-way, a + /// CORBA::BAD_INV_ORDER exception is thrown. + CORBA::Short sync_scope (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); +#endif /* TAO_HAS_CORBA_MESSAGING == 1 */ + + /// Return the reply status for the current request. Statuses can + /// be PortableInterceptor::SUCCESSFUL, SYSTEM_EXCEPTION, + /// USER_EXCEPTION, LOCATION_FORWARD, LOCATION_FORWARD_PERMANENT, + /// TRANSPORT_RETRY. + PortableInterceptor::ReplyStatus reply_status ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// If the reply status is PortableInterceptor::LOCATION_FORWARD or + /// PortableInterceptor::LOCATION_FORWARD_PERMANENT, return the + /// object reference to which the request was forwarded. + CORBA::Object_ptr forward_reference ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) ; + + CORBA::Any * get_slot ( + PortableInterceptor::SlotId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::InvalidSlot)); + + /// Return the IOP::ServiceContext with the given IOP::ServiceId + /// from the request service context list. + IOP::ServiceContext * get_request_service_context ( + IOP::ServiceId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the IOP::ServiceContext with the given IOP::ServiceId + /// from the reply service context list. + IOP::ServiceContext * get_reply_service_context ( + IOP::ServiceId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the (initial, non-forwarded, or permanently forwarded) + /// object reference of the target. + CORBA::Object_ptr target ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the object reference for the current target. The target + /// may change in the even of a location forward. + CORBA::Object_ptr effective_target ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + IOP::TaggedProfile * effective_profile ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return an Any containing the received exception, if any. + /// Otherwise, throw a CORBA::BAD_INV_ORDER exception. + /** + * @note There is no trivial way to extract the exception from an Any. + */ + CORBA::Any * received_exception ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the repository ID for the received exception. + char * received_exception_id ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the first IOP::TaggedComponent that matches the given + /// IOP::ComponentId in the object reference for the current + /// target. + IOP::TaggedComponent * get_effective_component ( + IOP::ComponentId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return all IOP::TaggedComponent(s) that match the given + /// IOP::ComponentId in the object reference for the current + /// target. + IOP::TaggedComponentSeq * get_effective_components ( + IOP::ComponentId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the policy of the given type in effect for the current + /// request. + CORBA::Policy_ptr get_request_policy ( + CORBA::PolicyType type + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Add the IOP::ServiceContext to the request (outgoing) + /// IOP::ServiceContextList. + void add_request_service_context ( + const IOP::ServiceContext & service_context, + CORBA::Boolean replace + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /** + * @name Stub helper methods + * + * The following methods are used in the implementation of the + * Stubs, they are not part of the ClientRequestInfo interface, but + * an extension used internally by TAO. + */ + //@{ + + /// Change the exception status. + void exception (CORBA::Exception *exception); + + /// Set the flag that states whether or not a response is expected. + /// For example, no response is expected in a one-way operation. + void response_expected (CORBA::Boolean flag); + + /// Set the status of the received reply. + void reply_status (int invoke_status); + + /// Extract the forward object reference from the + /// PortableInterceptor::ForwardRequest exception, and set the reply + /// status flag accordingly. + void forward_reference (PortableInterceptor::ForwardRequest &exc); + //@} + +protected: + + /// Helper method to get the request and response service contexts. + IOP::ServiceContext *get_service_context_i ( + TAO_Service_Context &service_context_list, + IOP::ServiceId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + +protected: + + /// Pointer to the GIOP invocation object. + TAO_GIOP_Invocation *invocation_; + + /// Reference to the target object. + CORBA::Object_ptr target_; + + /// Pointer to the caught exception. + CORBA::Exception *caught_exception_; + + /// True if a two-way operation, false otherwise. + CORBA::Boolean response_expected_; + + /// Reply status for the current request. + PortableInterceptor::ReplyStatus reply_status_; + +}; + +# if defined (__ACE_INLINE__) +# include "ClientRequestInfo_i.inl" +# endif /* __ACE_INLINE__ */ + +#endif /* TAO_HAS_INTERCEPTORS == 1 */ + +#include "ace/post.h" + +#endif /* TAO_CLIENT_REQUEST_INFO_I_H */ diff --git a/TAO/tao/ClientRequestInfo_i.inl b/TAO/tao/ClientRequestInfo_i.inl new file mode 100644 index 00000000000..98f5bfd9877 --- /dev/null +++ b/TAO/tao/ClientRequestInfo_i.inl @@ -0,0 +1,36 @@ +// -*- C++ -*- +// +// $Id$ + +ACE_INLINE void +TAO_ClientRequestInfo_i::exception (CORBA::Exception *exception) +{ + if (CORBA::SystemException::_downcast (exception) != 0) + this->reply_status_ = PortableInterceptor::SYSTEM_EXCEPTION; + else if (CORBA::UserException::_downcast (exception) != 0) + this->reply_status_ = PortableInterceptor::USER_EXCEPTION; + + // @@ Is it possible for both of the above downcasts to fail? + + this->caught_exception_ = exception; +} + +ACE_INLINE void +TAO_ClientRequestInfo_i::response_expected (CORBA::Boolean flag) +{ + this->response_expected_ = flag; +} + +ACE_INLINE void +TAO_ClientRequestInfo_i::forward_reference ( + PortableInterceptor::ForwardRequest &) +{ + // Note that we're converting the ForwardRequest exception in to a + // LOCATION_FORWARD reply, so we do not set the exception status. + // + // The forward object reference is not handled here. Rather, it is + // handled by the TAO_GIOP_Invocation object so that its profiles + // can be added to the list of forward profiles. + + this->reply_status_ = PortableInterceptor::LOCATION_FORWARD; +} diff --git a/TAO/tao/DomainC.cpp b/TAO/tao/DomainC.cpp index bff89a772a5..9fd320eb250 100644 --- a/TAO/tao/DomainC.cpp +++ b/TAO/tao/DomainC.cpp @@ -27,7 +27,7 @@ #if TAO_HAS_INTERCEPTORS == 1 #include "tao/RequestInfo_Util.h" -#include "tao/ClientRequestInfo.h" +#include "tao/ClientRequestInfo_i.h" #include "tao/ClientInterceptorAdapter.h" #endif /* TAO_HAS_INTERCEPTORS == 1 */ @@ -271,28 +271,28 @@ CORBA_DomainManager_out::operator-> (void) #if (TAO_HAS_INTERCEPTORS == 1) -class TAO_ClientRequestInfo_CORBA_DomainManager_get_domain_policy : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_CORBA_DomainManager_get_domain_policy : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_CORBA_DomainManager_get_domain_policy ( TAO_GIOP_Invocation *_tao_invocation, CORBA::Object_ptr _tao_target, const CORBA::PolicyType & policy_type - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -312,7 +312,7 @@ TAO_ClientRequestInfo_CORBA_DomainManager_get_domain_policy::TAO_ClientRequestIn const CORBA::PolicyType & policy_type TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target), + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target), policy_type_ (policy_type) {} @@ -1049,7 +1049,7 @@ CORBA_ConstructionPolicy_out::operator-> (void) #if (TAO_HAS_INTERCEPTORS == 1) -class TAO_ClientRequestInfo_CORBA_ConstructionPolicy_make_domain_manager : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_CORBA_ConstructionPolicy_make_domain_manager : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_CORBA_ConstructionPolicy_make_domain_manager ( @@ -1057,21 +1057,21 @@ public: CORBA::Object_ptr _tao_target, CORBA_InterfaceDef_ptr object_type, const CORBA::Boolean & constr_policy - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -1091,7 +1091,7 @@ TAO_ClientRequestInfo_CORBA_ConstructionPolicy_make_domain_manager::TAO_ClientRe const CORBA::Boolean & constr_policy TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target), + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target), object_type_ (object_type), constr_policy_ (constr_policy) {} diff --git a/TAO/tao/Makefile b/TAO/tao/Makefile index 0194614d5b4..66cba0856ac 100644 --- a/TAO/tao/Makefile +++ b/TAO/tao/Makefile @@ -188,6 +188,7 @@ ORB_CORE_FILES = \ Asynch_Invocation \ operation_details \ ClientRequestInfo \ + ClientRequestInfo_i \ RequestInfo_Util \ ClientInterceptorAdapter \ ObjectReferenceTemplateC \ diff --git a/TAO/tao/Makefile.bor b/TAO/tao/Makefile.bor index be966089cae..6517fee6151 100644 --- a/TAO/tao/Makefile.bor +++ b/TAO/tao/Makefile.bor @@ -45,6 +45,7 @@ OBJFILES = \ $(OBJDIR)\Cleanup_Func_Registry.obj \ $(OBJDIR)\ClientInterceptorAdapter.obj \ $(OBJDIR)\ClientRequestInfo.obj \ + $(OBJDIR)\ClientRequestInfo_i.obj \ $(OBJDIR)\Client_Strategy_Factory.obj \ $(OBJDIR)\CodecFactory.obj \ $(OBJDIR)\CodecFactory_ORBInitializer.obj \ diff --git a/TAO/tao/ORB_Core.cpp b/TAO/tao/ORB_Core.cpp index 66a565c4c81..8586e8cc403 100644 --- a/TAO/tao/ORB_Core.cpp +++ b/TAO/tao/ORB_Core.cpp @@ -41,6 +41,10 @@ #include "tao/LF_Event_Loop_Thread_Helper.h" +#if (TAO_HAS_INTERCEPTORS == 1) +#include "tao/ClientRequestInfo.h" +#endif /* TAO_HAS_INTERCEPTORS == 1 */ + #include "ace/Object_Manager.h" #include "ace/Env_Value_T.h" #include "ace/Dynamic_Service.h" @@ -2673,7 +2677,15 @@ TAO_ORB_Core_TSS_Resources::TAO_ORB_Core_TSS_Resources (void) lane_ (0), ts_objects_ (), orb_core_ (0) +#if TAO_HAS_INTERCEPTORS == 1 + , pi_current_ () + , client_request_info_ (0) +#endif /* TAO_HAS_INTERCEPTORS == 1 */ { +#if TAO_HAS_INTERCEPTORS == 1 + ACE_NEW (this->client_request_info_, + TAO_ClientRequestInfo); +#endif /* TAO_HAS_INTERCEPTORS == 1 */ } TAO_ORB_Core_TSS_Resources::~TAO_ORB_Core_TSS_Resources (void) @@ -2698,6 +2710,10 @@ TAO_ORB_Core_TSS_Resources::~TAO_ORB_Core_TSS_Resources (void) this->input_cdr_buffer_allocator_->remove (); delete this->input_cdr_buffer_allocator_; +#if TAO_HAS_INTERCEPTORS == 1 + CORBA::release (this->client_request_info_); +#endif /* TAO_HAS_INTERCEPTORS == 1 */ + //@@ This is broken on platforms that use TSS emulation since this // destructor is invoked after the ORB. Since we're under // pressure to release a beta, we'll have to leak the TSS objects diff --git a/TAO/tao/ORB_Core.h b/TAO/tao/ORB_Core.h index 091746bf2e9..1021afbeb50 100644 --- a/TAO/tao/ORB_Core.h +++ b/TAO/tao/ORB_Core.h @@ -90,6 +90,11 @@ class TAO_Delayed_Buffering_Sync_Strategy; #endif /* TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1 */ +#if TAO_HAS_INTERCEPTORS == 1 +class TAO_ClientRequestInfo; +#endif /* TAO_HAS_INTERCEPTORS == 1 */ + + class TAO_Transport_Sync_Strategy; class TAO_Sync_Strategy; class TAO_Policy_Validator; @@ -164,8 +169,11 @@ public: #if TAO_HAS_INTERCEPTORS == 1 /// The thread-specific portion of the PICurrent object. TAO_PICurrent_Impl pi_current_; -#endif /* TAO_HAS_INTERCEPTORS == 1 */ + /// The PortableInterceptor::ClientRequestInfo object for the + /// current thread. + TAO_ClientRequestInfo *client_request_info_; +#endif /* TAO_HAS_INTERCEPTORS == 1 */ }; diff --git a/TAO/tao/PolicyC.cpp b/TAO/tao/PolicyC.cpp index cffb7e72d30..bb044d3e0e1 100644 --- a/TAO/tao/PolicyC.cpp +++ b/TAO/tao/PolicyC.cpp @@ -28,7 +28,7 @@ #if TAO_HAS_INTERCEPTORS == 1 #include "tao/RequestInfo_Util.h" -#include "tao/ClientRequestInfo.h" +#include "tao/ClientRequestInfo_i.h" #include "tao/ClientInterceptorAdapter.h" #endif /* TAO_HAS_INTERCEPTORS == 1 */ @@ -590,27 +590,27 @@ CORBA_Policy_out::operator-> (void) #if (TAO_HAS_INTERCEPTORS == 1) -class TAO_ClientRequestInfo_CORBA_Policy_policy_type_get : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_CORBA_Policy_policy_type_get : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_CORBA_Policy_policy_type_get ( TAO_GIOP_Invocation *_tao_invocation, CORBA::Object_ptr _tao_target - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -628,7 +628,7 @@ TAO_ClientRequestInfo_CORBA_Policy_policy_type_get::TAO_ClientRequestInfo_CORBA_ CORBA::Object_ptr _tao_target TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target) + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target) {} Dynamic::ParameterList * @@ -679,27 +679,27 @@ TAO_ClientRequestInfo_CORBA_Policy_policy_type_get::result (CORBA::PolicyType re this->_result = result; } -class TAO_ClientRequestInfo_CORBA_Policy_copy : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_CORBA_Policy_copy : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_CORBA_Policy_copy ( TAO_GIOP_Invocation *_tao_invocation, CORBA::Object_ptr _tao_target - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -717,7 +717,7 @@ TAO_ClientRequestInfo_CORBA_Policy_copy::TAO_ClientRequestInfo_CORBA_Policy_copy CORBA::Object_ptr _tao_target TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target) + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target) {} Dynamic::ParameterList * @@ -768,27 +768,27 @@ TAO_ClientRequestInfo_CORBA_Policy_copy::result (CORBA::Policy_ptr result) this->_result = result; } -class TAO_ClientRequestInfo_CORBA_Policy_destroy : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_CORBA_Policy_destroy : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_CORBA_Policy_destroy ( TAO_GIOP_Invocation *_tao_invocation, CORBA::Object_ptr _tao_target - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -804,7 +804,7 @@ TAO_ClientRequestInfo_CORBA_Policy_destroy::TAO_ClientRequestInfo_CORBA_Policy_d CORBA::Object_ptr _tao_target TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target) + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target) {} Dynamic::ParameterList * diff --git a/TAO/tao/PortableServer/ImplRepoC.cpp b/TAO/tao/PortableServer/ImplRepoC.cpp index d8ae103334e..b11c3aff750 100644 --- a/TAO/tao/PortableServer/ImplRepoC.cpp +++ b/TAO/tao/PortableServer/ImplRepoC.cpp @@ -27,7 +27,7 @@ #if TAO_HAS_INTERCEPTORS == 1 #include "tao/RequestInfo_Util.h" -#include "tao/ClientRequestInfo.h" +#include "tao/ClientRequestInfo_i.h" #include "tao/ClientInterceptorAdapter.h" #endif /* TAO_HAS_INTERCEPTORS == 1 */ @@ -224,27 +224,27 @@ ImplementationRepository::ServerObject_out::operator-> (void) #if (TAO_HAS_INTERCEPTORS == 1) -class TAO_ClientRequestInfo_ImplementationRepository_ServerObject_ping : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_ImplementationRepository_ServerObject_ping : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_ImplementationRepository_ServerObject_ping ( TAO_GIOP_Invocation *_tao_invocation, CORBA::Object_ptr _tao_target - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -260,7 +260,7 @@ TAO_ClientRequestInfo_ImplementationRepository_ServerObject_ping::TAO_ClientRequ CORBA::Object_ptr _tao_target TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target) + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target) {} Dynamic::ParameterList * @@ -301,27 +301,27 @@ TAO_ClientRequestInfo_ImplementationRepository_ServerObject_ping::result (TAO_EN return result_any; } -class TAO_ClientRequestInfo_ImplementationRepository_ServerObject_shutdown : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_ImplementationRepository_ServerObject_shutdown : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_ImplementationRepository_ServerObject_shutdown ( TAO_GIOP_Invocation *_tao_invocation, CORBA::Object_ptr _tao_target - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -337,7 +337,7 @@ TAO_ClientRequestInfo_ImplementationRepository_ServerObject_shutdown::TAO_Client CORBA::Object_ptr _tao_target TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target) + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target) {} Dynamic::ParameterList * @@ -2218,28 +2218,28 @@ ImplementationRepository::Administration_out::operator-> (void) #if (TAO_HAS_INTERCEPTORS == 1) -class TAO_ClientRequestInfo_ImplementationRepository_Administration_activate_server : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_ImplementationRepository_Administration_activate_server : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_ImplementationRepository_Administration_activate_server ( TAO_GIOP_Invocation *_tao_invocation, CORBA::Object_ptr _tao_target, const char * server - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -2257,7 +2257,7 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_activate_server::T const char * server TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target), + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target), server_ (server) {} @@ -2324,7 +2324,7 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_activate_server::r return result_any; } -class TAO_ClientRequestInfo_ImplementationRepository_Administration_register_server : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_ImplementationRepository_Administration_register_server : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_ImplementationRepository_Administration_register_server ( @@ -2332,21 +2332,21 @@ public: CORBA::Object_ptr _tao_target, const char * server, const ImplementationRepository::StartupOptions & options - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -2366,7 +2366,7 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_register_server::T const ImplementationRepository::StartupOptions & options TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target), + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target), server_ (server), options_ (options) {} @@ -2436,7 +2436,7 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_register_server::r return result_any; } -class TAO_ClientRequestInfo_ImplementationRepository_Administration_reregister_server : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_ImplementationRepository_Administration_reregister_server : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_ImplementationRepository_Administration_reregister_server ( @@ -2444,21 +2444,21 @@ public: CORBA::Object_ptr _tao_target, const char * server, const ImplementationRepository::StartupOptions & options - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -2478,7 +2478,7 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_reregister_server: const ImplementationRepository::StartupOptions & options TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target), + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target), server_ (server), options_ (options) {} @@ -2533,28 +2533,28 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_reregister_server: return result_any; } -class TAO_ClientRequestInfo_ImplementationRepository_Administration_remove_server : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_ImplementationRepository_Administration_remove_server : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_ImplementationRepository_Administration_remove_server ( TAO_GIOP_Invocation *_tao_invocation, CORBA::Object_ptr _tao_target, const char * server - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -2572,7 +2572,7 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_remove_server::TAO const char * server TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target), + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target), server_ (server) {} @@ -2638,28 +2638,28 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_remove_server::res return result_any; } -class TAO_ClientRequestInfo_ImplementationRepository_Administration_shutdown_server : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_ImplementationRepository_Administration_shutdown_server : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_ImplementationRepository_Administration_shutdown_server ( TAO_GIOP_Invocation *_tao_invocation, CORBA::Object_ptr _tao_target, const char * server - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -2677,7 +2677,7 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_shutdown_server::T const char * server TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target), + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target), server_ (server) {} @@ -2743,7 +2743,7 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_shutdown_server::r return result_any; } -class TAO_ClientRequestInfo_ImplementationRepository_Administration_server_is_running : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_ImplementationRepository_Administration_server_is_running : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_ImplementationRepository_Administration_server_is_running ( @@ -2752,21 +2752,21 @@ public: const char * server, const char * addr, ImplementationRepository::ServerObject_ptr server_object - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -2790,7 +2790,7 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_server_is_running: ImplementationRepository::ServerObject_ptr server_object TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target), + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target), server_ (server), addr_ (addr), server_object_ (server_object) @@ -2874,28 +2874,28 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_server_is_running: this->_result = result; } -class TAO_ClientRequestInfo_ImplementationRepository_Administration_server_is_shutting_down : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_ImplementationRepository_Administration_server_is_shutting_down : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_ImplementationRepository_Administration_server_is_shutting_down ( TAO_GIOP_Invocation *_tao_invocation, CORBA::Object_ptr _tao_target, const char * server - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -2913,7 +2913,7 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_server_is_shutting const char * server TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target), + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target), server_ (server) {} @@ -2979,28 +2979,28 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_server_is_shutting return result_any; } -class TAO_ClientRequestInfo_ImplementationRepository_Administration_find : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_ImplementationRepository_Administration_find : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_ImplementationRepository_Administration_find ( TAO_GIOP_Invocation *_tao_invocation, CORBA::Object_ptr _tao_target, const char * server - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -3018,7 +3018,7 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_find::TAO_ClientRe const char * server TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target), + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target), server_ (server) {} @@ -3084,7 +3084,7 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_find::result (TAO_ return result_any; } -class TAO_ClientRequestInfo_ImplementationRepository_Administration_list : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_ImplementationRepository_Administration_list : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_ImplementationRepository_Administration_list ( @@ -3092,21 +3092,21 @@ public: CORBA::Object_ptr _tao_target, const CORBA::ULong & how_many - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -3126,7 +3126,7 @@ TAO_ClientRequestInfo_ImplementationRepository_Administration_list::TAO_ClientRe TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target), + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target), how_many_ (how_many) {} @@ -5800,28 +5800,28 @@ ImplementationRepository::ServerInformationIterator_out::operator-> (void) #if (TAO_HAS_INTERCEPTORS == 1) -class TAO_ClientRequestInfo_ImplementationRepository_ServerInformationIterator_next_n : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_ImplementationRepository_ServerInformationIterator_next_n : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_ImplementationRepository_ServerInformationIterator_next_n ( TAO_GIOP_Invocation *_tao_invocation, CORBA::Object_ptr _tao_target, const CORBA::ULong & how_many - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -5841,7 +5841,7 @@ TAO_ClientRequestInfo_ImplementationRepository_ServerInformationIterator_next_n: const CORBA::ULong & how_many TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target), + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target), how_many_ (how_many) {} @@ -5902,27 +5902,27 @@ TAO_ClientRequestInfo_ImplementationRepository_ServerInformationIterator_next_n: this->_result = result; } -class TAO_ClientRequestInfo_ImplementationRepository_ServerInformationIterator_destroy : public TAO_ClientRequestInfo +class TAO_ClientRequestInfo_ImplementationRepository_ServerInformationIterator_destroy : public TAO_ClientRequestInfo_i { public: TAO_ClientRequestInfo_ImplementationRepository_ServerInformationIterator_destroy ( TAO_GIOP_Invocation *_tao_invocation, CORBA::Object_ptr _tao_target - TAO_ENV_ARG_DECL_WITH_DEFAULTS); + TAO_ENV_ARG_DECL); virtual Dynamic::ParameterList * arguments ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual Dynamic::ExceptionList * exceptions ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); virtual CORBA::Any * result ( - TAO_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + TAO_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); @@ -5938,7 +5938,7 @@ TAO_ClientRequestInfo_ImplementationRepository_ServerInformationIterator_destroy CORBA::Object_ptr _tao_target TAO_ENV_ARG_DECL_NOT_USED ) - : TAO_ClientRequestInfo (_tao_invocation, _tao_target) + : TAO_ClientRequestInfo_i (_tao_invocation, _tao_target) {} Dynamic::ParameterList * diff --git a/TAO/tao/TAO.dsp b/TAO/tao/TAO.dsp index f64649d1429..dc060855c31 100644 --- a/TAO/tao/TAO.dsp +++ b/TAO/tao/TAO.dsp @@ -251,6 +251,10 @@ SOURCE=.\ClientRequestInfo.cpp # End Source File
# Begin Source File
+SOURCE=.\ClientRequestInfo_i.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\CodecFactory.cpp
# End Source File
# Begin Source File
@@ -1023,6 +1027,10 @@ SOURCE=.\ClientRequestInfo.h # End Source File
# Begin Source File
+SOURCE=.\ClientRequestInfo_i.h
+# End Source File
+# Begin Source File
+
SOURCE=.\CodecFactory.h
# End Source File
# Begin Source File
@@ -1799,6 +1807,10 @@ SOURCE=.\ClientInterceptorAdapter.inl # End Source File
# Begin Source File
+SOURCE=.\ClientRequestInfo_i.inl
+# End Source File
+# Begin Source File
+
SOURCE=.\Collocation_Resolver.i
# End Source File
# Begin Source File
diff --git a/TAO/tao/TAO_Static.dsp b/TAO/tao/TAO_Static.dsp index bad735f563d..2468638d8cf 100644 --- a/TAO/tao/TAO_Static.dsp +++ b/TAO/tao/TAO_Static.dsp @@ -183,6 +183,10 @@ SOURCE=.\ClientRequestInfo.cpp # End Source File
# Begin Source File
+SOURCE=.\ClientRequestInfo_i.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\CodecFactory.cpp
# End Source File
# Begin Source File
@@ -959,6 +963,10 @@ SOURCE=.\ClientRequestInfo.h # End Source File
# Begin Source File
+SOURCE=.\ClientRequestInfo_i.h
+# End Source File
+# Begin Source File
+
SOURCE=.\CodecFactory.h
# End Source File
# Begin Source File
@@ -1783,6 +1791,10 @@ SOURCE=.\ClientInterceptorAdapter.inl # End Source File
# Begin Source File
+SOURCE=.\ClientRequestInfo_i.inl
+# End Source File
+# Begin Source File
+
SOURCE=.\Collocation_Resolver.i
# End Source File
# Begin Source File
|