summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbala <balanatarajan@users.noreply.github.com>2003-02-12 21:11:25 +0000
committerbala <balanatarajan@users.noreply.github.com>2003-02-12 21:11:25 +0000
commit3ff764a1c05be6d1ef157b4ea81b4bafea4dceee (patch)
tree62ef2d34582fef31c169010730e1b46c10b2ef2d
parent9ed1ed33101b03ce55240ae2867e416ca0a4d2b2 (diff)
downloadATCD-post_132_phase_0.tar.gz
ChangeLogTag: Wed Feb 12 15:40:46 2003 Balachandran Natarajan <bala@isis-server.isis.vanderbilt.edu>post_132_phase_0
-rw-r--r--TAO/tao/ChangeLog13
-rw-r--r--TAO/tao/ClientRequestInfo_i.cpp81
-rw-r--r--TAO/tao/Tagged_Components.cpp112
-rw-r--r--TAO/tao/Tagged_Components.h11
-rw-r--r--TAO/tao/Tagged_Components.i15
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 <bala@isis-server.isis.vanderbilt.edu>
+
+ * 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 <bala@isis-server.isis.vanderbilt.edu>
* 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
- * <chris@stentorsoft.com>
+ * 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 <this->components_>
+ int create_components_i (void);
+
/// Is <tag> 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;
}