diff options
Diffstat (limited to 'TAO/tao/MProfile.cpp')
-rw-r--r-- | TAO/tao/MProfile.cpp | 159 |
1 files changed, 52 insertions, 107 deletions
diff --git a/TAO/tao/MProfile.cpp b/TAO/tao/MProfile.cpp index eaa6d0ca69e..963f4becb77 100644 --- a/TAO/tao/MProfile.cpp +++ b/TAO/tao/MProfile.cpp @@ -10,42 +10,50 @@ ACE_RCSID(tao, MProfile, "$Id$") # include "tao/MProfile.i" #endif /* __ACE_INLINE__ */ -void -TAO_MProfile::cleanup (void) -{ - if (this->pfiles_ != 0) - { - for (TAO_PHandle i = 0; i < this->last_; ++i) - if (this->pfiles_[i]) - this->pfiles_[i]->_decr_refcnt (); - } - - delete [] this->pfiles_; - this->pfiles_ = 0; - - this->current_ = 0; - this->size_ = 0; - this->last_ = 0; -} - int TAO_MProfile::set (CORBA::ULong sz) { if (sz == 0) { - this->cleanup (); + // Release all of our profiles. + + for (TAO_PHandle h = 0; + h < this->size_; + h++) + if (this->pfiles_[h]) + { + this->pfiles_[h]->_decr_refcnt (); + this->pfiles_[h] = 0; + } + + if (this->size_) + delete [] this->pfiles_; + + if (forward_from_) + delete forward_from_; + + pfiles_ = 0; + current_ = 0; + size_ = 0; + last_= 0; + + this->pfiles_ = 0; + this->current_ = 0; + this->size_ = 0; + this->last_= 0; + return 0; } // See if we already have an existing profile list or if we need to // get ridof what we have. @@ Fred, please be consistent with your // use of this-> as a prefix for data members. - if (this->size_ != 0) + if (size_) { // Release all of our profiles. for (TAO_PHandle h = 0; - h < this->size_; + h < size_; h++) if (this->pfiles_[h]) { @@ -53,13 +61,10 @@ TAO_MProfile::set (CORBA::ULong sz) this->pfiles_[h] = 0; } - // Next see if we can reuse our profile list memory + // Next see if we can reuse our profile list memory Since if (this->size_ != sz) { // 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_, @@ -72,40 +77,36 @@ TAO_MProfile::set (CORBA::ULong sz) ACE_NEW_RETURN (this->pfiles_, TAO_Profile_ptr [sz], -1); + // this->pfiles_ - this->size_ = sz; - this->last_ = 0; - this->current_ = 0; - -#if 0 - // @@ Fred: this does *not* work, the literal 0 is the null pointer, - // but the bit representation may be something else. ACE_OS::memset (this->pfiles_, 0, sizeof (TAO_Profile_ptr) * sz); -#else - for (TAO_PHandle i = 0; i != this->size_; ++i) - this->pfiles_[i] = 0; -#endif + size_ = sz; + this->last_ = 0; + this->current_ = 0; // @@ since we are being reset, get rid of forward references! - // if (forward_from_) - // delete forward_from_; + if (forward_from_) + delete forward_from_; - return this->size_; + return size_; } int -TAO_MProfile::set (const TAO_MProfile &mprofile) +TAO_MProfile::set (TAO_MProfile *mprofile) { // NOTE: We use mprofile->last_ instead of mprofile->size_ to set // this->size_. This is so we can use set () to trim a profile // list!! - this->set (mprofile.last_); + if (mprofile == 0) + return this->set ((CORBA::ULong) 0); + + this->set (mprofile->last_); // set indexes ... - this->last_ = mprofile.last_; + this->last_ = mprofile->last_; // These are set in set (ULong); // this->current_ = 0; @@ -113,73 +114,17 @@ TAO_MProfile::set (const TAO_MProfile &mprofile) // Now reference all profiles. - for (TAO_PHandle h = 0; h < this->size_; h++) - { - this->pfiles_[h] = mprofile.pfiles_[h]; - if (this->pfiles_[h] != 0) + for (TAO_PHandle h = 0; + h < this->size_; + h++) + if (mprofile->pfiles_[h]) + { + this->pfiles_[h] = mprofile->pfiles_[h]; this->pfiles_[h]->_incr_refcnt (); - } + } - // - // @@ Fred: here was a gross violation of the invariants for this - // class: if the forward_from_ is owned by us (we call delete all - // the time on it) we cannot share it with mprofile. - // - // if (mprofile->forward_from_) - // this->forward_from_ = mprofile->forward_from_; + if (mprofile->forward_from_) + this->forward_from_ = mprofile->forward_from_; return 1; } - -int -TAO_MProfile::add_profile (TAO_Profile *pfile) -{ - // skip by the used slots - if (last_ == size_) // full! - return -1; - - pfiles_[last_++] = pfile; - - 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 (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!! - 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 &env) -{ - CORBA::ULong hashval = 0; - - if (last_ == 0) - return 0; - - for (TAO_PHandle h=0; h < last_ ; h++) - 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. - return hashval / last_; -} |