From 3ff764a1c05be6d1ef157b4ea81b4bafea4dceee Mon Sep 17 00:00:00 2001 From: bala Date: Wed, 12 Feb 2003 21:11:25 +0000 Subject: ChangeLogTag: Wed Feb 12 15:40:46 2003 Balachandran Natarajan --- TAO/tao/ChangeLog | 13 +++++ TAO/tao/ClientRequestInfo_i.cpp | 81 +++++++++++++++-------------- TAO/tao/Tagged_Components.cpp | 112 +++++++++++++++++++++++++++++++++------- TAO/tao/Tagged_Components.h | 11 ++-- TAO/tao/Tagged_Components.i | 15 ++++-- 5 files changed, 164 insertions(+), 68 deletions(-) diff --git a/TAO/tao/ChangeLog b/TAO/tao/ChangeLog index 6981964c321..55c83037c4d 100644 --- a/TAO/tao/ChangeLog +++ b/TAO/tao/ChangeLog @@ -1,3 +1,16 @@ +Wed Feb 12 15:40:46 2003 Balachandran Natarajan + + * tao/Tagged_Components.h: + * tao/Tagged_Components.cpp: + * tao/Tagged_Components.i (TAO_Tagged_Components): Create + IOP::MultipleComponentProfile lazily, instead of creating + actively on the stack and increase the runtime footprint. If we + do this we only pay when TAO gets something that TAO doesnt + understand. This changed forced us to change the signature of + the components (). Instead of returning a reference we now + return a pointer to the underlying + IOP::MultipleComponentProfile. + Thu Feb 6 17:51:06 2003 Balachandran Natarajan * tao/Tagged_Components.cpp: Removed some vague print statements. diff --git a/TAO/tao/ClientRequestInfo_i.cpp b/TAO/tao/ClientRequestInfo_i.cpp index 2c9f9033bb8..c8b9fe32916 100644 --- a/TAO/tao/ClientRequestInfo_i.cpp +++ b/TAO/tao/ClientRequestInfo_i.cpp @@ -210,35 +210,38 @@ TAO_ClientRequestInfo_i::get_effective_component ( TAO_Tagged_Components &ecs = this->target_->_stubobj ()->profile_in_use ()->tagged_components (); - IOP::MultipleComponentProfile &components = ecs.components (); + IOP::MultipleComponentProfile *components = + ecs.components (); - CORBA::ULong len = components.length (); - for (CORBA::ULong i = 0; i < len; ++i) + if (components) { - if (components[i].tag == id) + CORBA::ULong len = components->length (); + for (CORBA::ULong i = 0; i < len; ++i) { - IOP::TaggedComponent *tagged_component = 0; + 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); + // 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; + IOP::TaggedComponent_var safe_tagged_component = + tagged_component; - (*tagged_component) = components[i]; // Deep copy + (*tagged_component) = (*components)[i]; // Deep copy - return safe_tagged_component._retn (); + return safe_tagged_component._retn (); + } } } - // No tagged component was found that matched the given // IOP::ComponentId. ACE_THROW_RETURN (CORBA::BAD_PARAM (CORBA::OMGVMCID | 28, @@ -255,36 +258,38 @@ TAO_ClientRequestInfo_i::get_effective_components ( TAO_Tagged_Components &ecs = this->target_->_stubobj ()->profile_in_use ()->tagged_components (); - IOP::MultipleComponentProfile &components = ecs.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) { - if (components[i].tag == id) + CORBA::ULong len = components->length (); + for (CORBA::ULong i = 0; i < len; ++i) { - if (tagged_components == 0) + if ((*components)[i].tag == id) { - // 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 ( + 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); + ACE_CHECK_RETURN (0); - safe_tagged_components = tagged_components; - } + safe_tagged_components = tagged_components; + } - CORBA::ULong old_len = safe_tagged_components->length (); - safe_tagged_components->length (old_len + 1); + CORBA::ULong old_len = safe_tagged_components->length (); + safe_tagged_components->length (old_len + 1); - safe_tagged_components[old_len] = components[i]; // Deep copy + safe_tagged_components[old_len] = (*components)[i]; // Deep copy + } } } diff --git a/TAO/tao/Tagged_Components.cpp b/TAO/tao/Tagged_Components.cpp index 3bd21f02158..0683e94fe43 100644 --- a/TAO/tao/Tagged_Components.cpp +++ b/TAO/tao/Tagged_Components.cpp @@ -154,11 +154,22 @@ TAO_Tagged_Components::set_component_i (const IOP::TaggedComponent& component) // @@ TODO Some components can show up multiple times, others // can't find out and take appropiate action. - for (CORBA::ULong i = 0; i != this->components_.length (); ++i) + if (this->components_ == 0) { - if (component.tag == this->components_[i].tag) + int retval = + this->create_components_i (); + + if (retval == -1) + ACE_ERROR ((LM_DEBUG, + "(%P|%t) TAO - TAO_Tagged_Components::set_components_i ", + "create_components_i failed \n")); + } + + for (CORBA::ULong i = 0; i != this->components_->length (); ++i) + { + if (component.tag == (*this->components_)[i].tag) { - this->components_[i] = component; + (*this->components_)[i] = component; return; } } @@ -168,14 +179,24 @@ TAO_Tagged_Components::set_component_i (const IOP::TaggedComponent& component) void TAO_Tagged_Components::set_component_i (IOP::TaggedComponent& component) { - for (CORBA::ULong i = 0; i != this->components_.length (); ++i) + if (this->components_ == 0) + { + int retval = + this->create_components_i (); + + if (retval == -1) + ACE_ERROR ((LM_DEBUG, + "(%P|%t) TAO - TAO_Tagged_Components::set_component_i ", + "create_components_i failed \n")); + } + for (CORBA::ULong i = 0; i != this->components_->length (); ++i) { - if (component.tag == this->components_[i].tag) + if (component.tag == (*this->components_)[i].tag) { CORBA::ULong max = component.component_data.maximum (); CORBA::ULong len = component.component_data.length (); CORBA::Octet* buf = component.component_data.get_buffer (1); - this->components_[i].component_data.replace (max, len, buf, 1); + (*this->components_)[i].component_data.replace (max, len, buf, 1); return; } } @@ -185,35 +206,72 @@ TAO_Tagged_Components::set_component_i (IOP::TaggedComponent& component) void TAO_Tagged_Components::add_component_i (IOP::TaggedComponent& component) { + if (this->components_ == 0) + { + int retval = + this->create_components_i (); + + if (retval == -1) + ACE_ERROR ((LM_DEBUG, + "(%P|%t) TAO - TAO_Tagged_Components::add_component_i ", + "create_components_i failed \n")); + } // @@ TODO Some components can show up multiple times, others // can't find out and take appropiate action. - CORBA::ULong l = this->components_.length (); - this->components_.length (l + 1); - this->components_[l].tag = component.tag; + CORBA::ULong l = this->components_->length (); + this->components_->length (l + 1); + (*this->components_)[l].tag = component.tag; CORBA::ULong max = component.component_data.maximum (); CORBA::ULong len = component.component_data.length (); CORBA::Octet* buf = component.component_data.get_buffer (1); - this->components_[l].component_data.replace (max, len, buf, 1); + (*this->components_)[l].component_data.replace (max, len, buf, 1); } void TAO_Tagged_Components::add_component_i (const IOP::TaggedComponent& component) { + if (this->components_ == 0) + { + int retval = + this->create_components_i (); + + if (retval == -1) + ACE_ERROR ((LM_DEBUG, + "(%P|%t) TAO - TAO_Tagged_Components::add_components_i ", + "create_components_i () failed \n")); + } + // @@ TODO Some components can show up multiple times, others // can't find out and take appropiate action. - CORBA::ULong l = this->components_.length (); - this->components_.length (l + 1); - this->components_[l] = component; + CORBA::ULong l = this->components_->length (); + this->components_->length (l + 1); + (*this->components_)[l] = component; +} + +int +TAO_Tagged_Components::create_components_i (void) +{ + // @@ NOTE: Very bad way to allocate data. Exceptions?? + ACE_NEW_RETURN (this->components_, + IOP::MultipleComponentProfile, + -1); + + return 0; } int TAO_Tagged_Components::get_component (IOP::TaggedComponent& component) const { - for (CORBA::ULong i = 0; i != this->components_.length (); ++i) + if (this->components_ == 0) + return 0; + + for (CORBA::ULong i = 0; + i != this->components_->length (); + ++i) { - if (component.tag == this->components_[i].tag) + if (component.tag == (*this->components_)[i].tag) { - component = this->components_[i]; + component = (*this->components_)[i]; return 1; } } @@ -225,7 +283,10 @@ TAO_Tagged_Components::get_component (IOP::TaggedComponent& component) const int TAO_Tagged_Components::encode (TAO_OutputCDR& cdr) const { - return (cdr << this->components_); + if (this->components_ == 0) + return 1; + + return (cdr << *this->components_); } int @@ -235,14 +296,25 @@ TAO_Tagged_Components::decode (TAO_InputCDR& cdr) this->orb_type_set_ = 0; this->code_sets_set_ = 0; - if ((cdr >> this->components_) == 0) + if (this->components_ == 0) + { + int retval = + this->create_components_i (); + + if (retval == -1) + ACE_ERROR ((LM_DEBUG, + "(%P|%t) TAO - TAO_Tagged_Components::decode ", + "create_components_i failed \n")); + + } + if ((cdr >> *this->components_) == 0) return 0; - CORBA::ULong l = this->components_.length (); + CORBA::ULong l = this->components_->length (); for (CORBA::ULong i = 0; i != l; ++i) { const IOP::TaggedComponent &component = - this->components_[i]; + (*this->components_)[i]; if (this->known_tag (component.tag)) this->set_known_component_i (component); } diff --git a/TAO/tao/Tagged_Components.h b/TAO/tao/Tagged_Components.h index fc93c8aa667..6608bfad5a8 100644 --- a/TAO/tao/Tagged_Components.h +++ b/TAO/tao/Tagged_Components.h @@ -93,11 +93,9 @@ public: int decode (TAO_InputCDR& cdr); /** - * Read/Write access to the underlying - * MutipleComponentProfile. Added by request from Chris Hafey - * + * Read/Write access to the underlying MutipleComponentProfile. */ - IOP::MultipleComponentProfile &components (void); + IOP::MultipleComponentProfile *components (void); private: /// Helper method to implement set_code_sets() @@ -116,6 +114,9 @@ private: int get_known_component_i (IOP::TaggedComponent& component) const; int get_component_i (IOP::TaggedComponent& component) const; + /// Helper method to create components_> + int create_components_i (void); + /// Is a well-known component? int known_tag (IOP::ComponentId tag) const; @@ -134,7 +135,7 @@ private: /// The rest of the components, to be compliant we cannot drop a /// bunch of them. - IOP::MultipleComponentProfile components_; + IOP::MultipleComponentProfile *components_; // A flag for each component... CORBA::Octet orb_type_set_; diff --git a/TAO/tao/Tagged_Components.i b/TAO/tao/Tagged_Components.i index d67dcc6e07b..65114bfccc0 100644 --- a/TAO/tao/Tagged_Components.i +++ b/TAO/tao/Tagged_Components.i @@ -4,9 +4,11 @@ ACE_INLINE TAO_Tagged_Components::TAO_Tagged_Components (void) - : orb_type_ (0), - orb_type_set_ (0), - code_sets_set_ (0) + : orb_type_ (0) + , components_ (0) + , orb_type_set_ (0) + , code_sets_set_ (0) + { } @@ -60,8 +62,11 @@ TAO_Tagged_Components::unique_tag (IOP::ComponentId tag) const || tag == IOP::TAG_DCE_NO_PIPES); } -ACE_INLINE IOP::MultipleComponentProfile& +ACE_INLINE IOP::MultipleComponentProfile * TAO_Tagged_Components::components (void) { - return this->components_; + if (this->components_ != 0) + return this->components_; + + return 0; } -- cgit v1.2.1