diff options
Diffstat (limited to 'TAO/tao/MProfile.cpp')
-rw-r--r-- | TAO/tao/MProfile.cpp | 125 |
1 files changed, 34 insertions, 91 deletions
diff --git a/TAO/tao/MProfile.cpp b/TAO/tao/MProfile.cpp index 6ceeeeb928d..be281104fe5 100644 --- a/TAO/tao/MProfile.cpp +++ b/TAO/tao/MProfile.cpp @@ -3,7 +3,6 @@ #include "tao/MProfile.h" #include "tao/Pluggable.h" -#include "tao/Environment.h" ACE_RCSID(tao, MProfile, "$Id$") @@ -53,27 +52,26 @@ TAO_MProfile::set (CORBA::ULong sz) } // Next see if we can reuse our profile list memory - if (this->size_ < sz) + if (this->size_ != sz) { - // we cant reuse memory since the current array is too small! + // we cant reuse memory since the array sized are different! + // @@ Fred: if sz < this->size_ you could avoid this memory + // allocation, you only need another flag to keep the + // "capacity". delete [] this->pfiles_; ACE_NEW_RETURN (this->pfiles_, - TAO_Profile *[sz], + TAO_Profile_ptr[sz], -1); - this->size_ = sz; } - // else , leave this->size and this->pfiles alone! } else - { - // first time, initialize! - ACE_NEW_RETURN (this->pfiles_, - TAO_Profile *[sz], - -1); - this->size_ = sz; - } + // first time, initialize! + ACE_NEW_RETURN (this->pfiles_, + TAO_Profile_ptr [sz], + -1); + this->size_ = sz; this->last_ = 0; this->current_ = 0; @@ -112,96 +110,44 @@ TAO_MProfile::set (const TAO_MProfile &mprofile) } int -TAO_MProfile::add_profiles (TAO_MProfile *pfiles) +TAO_MProfile::add_profile (TAO_Profile *pfile) { - // this->size_ == total number of profiles we can hold - // this->last_ == the index of the last profile - CORBA::ULong space = this->size_ - this->last_; - - if (space < pfiles->last_) - { - // we need to grow! - if (this->grow (this->last_ + pfiles->last_) < 0) - return -1; - } - - // copy over profiles - for (TAO_PHandle h = 0;h < pfiles->last_;h++) - { - if (this->add_profile (pfiles->pfiles_[h]) < 0) - return -1; - } - return 0; -} + // skip by the used slots + if (last_ == size_) // full! + return -1; + pfiles_[last_++] = pfile; -// the layout for a full list of 7 Profiles. -// -// last_ == one past the last valid entry, so if the list has 2 -// profiles then last_ equals 2. -// current_ == index of the next profile to be returned (or one past -// the last returned. -// -// this->size_ = 7; current_ = 3; last_ = 7 -// 0, 1, 2, 3, 4, 5, 6} -// { _, _, _, _, ..., _} -// -int -TAO_MProfile::remove_profile (const TAO_Profile *pfile) -{ - TAO_PHandle h; - int found=0; - for (h = 0;h < this->last_;h++) - { - if (this->pfiles_[h]->is_equivalent (pfile)) - { // remove it! - TAO_Profile *old = this->pfiles_[h]; - this->pfiles_[h] = 0; - old->_decr_refcnt (); - // shift other profiles up one - // note, if h == last_ - 1 then do nothing. - for (TAO_PHandle inner = h;inner < this->last_ - 1;inner++) - { - this->pfiles_[inner] = this->pfiles_[inner + 1]; - } - // subtract 1 from last_ to indicate we have one fewer profiles - this->last_--; - found = 1; - break; - } - } - if ( found == 0) - return -1; // profile not found. - return 0; -} - -int -TAO_MProfile::remove_profiles (const TAO_MProfile *pfiles) -{ - for (TAO_PHandle h = 0;h < pfiles->last_;h++) - { - if (this->remove_profile (pfiles->pfiles_[h]) < 0) - return -1; - } - return 0; + if (pfile && pfile->_incr_refcnt () == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "(%P|%t) Unable to increment reference count in add_profile!\n"), + -1); + return last_ - 1; } CORBA::Boolean -TAO_MProfile::is_equivalent (const TAO_MProfile *rhs) +TAO_MProfile::is_equivalent (TAO_MProfile *first, + TAO_MProfile *second, + CORBA::Environment &env) { // Two profile lists are equivalent iff at least one of the profiles // form the first list is_equivalent to at least one of the profiles // from the second list!! - for (TAO_PHandle h1 = 0; h1 < this->last_;h1++) - for (TAO_PHandle h2 = 0; h2 < rhs->last_; h2++ ) - if (this->pfiles_[h1]->is_equivalent (rhs->pfiles_[h2])) + TAO_Profile_ptr *pfiles1 = first->pfiles (); + TAO_Profile_ptr *pfiles2 = second->pfiles (); + TAO_PHandle first_cnt = first->profile_count (); + TAO_PHandle second_cnt = second->profile_count (); + + for (TAO_PHandle h1 = 0; h1 < first_cnt;h1++) + for (TAO_PHandle h2 = 0; h2 < second_cnt; h2++ ) + if (pfiles1[h1]->is_equivalent (pfiles2[h2], env)) return 1; return 0; } CORBA::ULong -TAO_MProfile::hash (CORBA::ULong max, CORBA::Environment &ACE_TRY_ENV) +TAO_MProfile::hash (CORBA::ULong max, CORBA::Environment &env) { CORBA::ULong hashval = 0; @@ -209,10 +155,7 @@ TAO_MProfile::hash (CORBA::ULong max, CORBA::Environment &ACE_TRY_ENV) return 0; for (TAO_PHandle h=0; h < last_ ; h++) - { - hashval += pfiles_[h]->hash (max, ACE_TRY_ENV); - ACE_CHECK_RETURN (0); - } + hashval += pfiles_[h]->hash (max, env); // The above hash function return an ULong between 0 and max here we // simply take the average value and round. |