summaryrefslogtreecommitdiff
path: root/TAO/tao/Stub.i
diff options
context:
space:
mode:
authorfredk <fredk@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-02-05 01:20:14 +0000
committerfredk <fredk@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-02-05 01:20:14 +0000
commitb161eb2a72f11c85e0247d804e2fdd9367fdffb6 (patch)
tree8744de06fbc3e261819a9bf75cf0ff19e3dd2229 /TAO/tao/Stub.i
parentc32838722355c0dedd4d5bc0ae621b9c44445df8 (diff)
downloadATCD-b161eb2a72f11c85e0247d804e2fdd9367fdffb6.tar.gz
*** empty log message ***
Diffstat (limited to 'TAO/tao/Stub.i')
-rw-r--r--TAO/tao/Stub.i391
1 files changed, 387 insertions, 4 deletions
diff --git a/TAO/tao/Stub.i b/TAO/tao/Stub.i
index 94264e0a703..e7c67b2da3e 100644
--- a/TAO/tao/Stub.i
+++ b/TAO/tao/Stub.i
@@ -1,13 +1,396 @@
// $Id$
+// @@ Get rid of profile specific stuff, it is now in it's own class and
+// file. fredk
+
ACE_INLINE
-STUB_Object::STUB_Object (char *p)
- : type_id (p)
+STUB_Object::~STUB_Object (void)
{
- // Empty CTOR
+ assert (this->refcount_ == 0);
+
+ // Cleanup hint
+
+ if (this->profile_in_use_ != 0)
+ {
+ this->profile_in_use_->reset_hint ();
+ // decrease reference count on profile
+ this->profile_in_use_->_decr_refcnt ();
+ this->profile_in_use_ = 0;
+ }
+
+ if (this->fwd_profile_)
+ {
+ this->fwd_profile_->reset_hint ();
+ this->fwd_profile_->_decr_refcnt ();
+ this->fwd_profile_ = 0;
+ }
+
+ if (fwd_profiles_)
+ delete fwd_profiles_;
+
}
ACE_INLINE
-STUB_Object::~STUB_Object (void)
+STUB_Object::STUB_Object (char *repository_id)
+ : base_profiles_ ((CORBA::ULong) 0),
+ fwd_profiles_ (0),
+ profile_in_use_ (0),
+ fwd_profile_ (0),
+ profile_lock_ptr_ (0),
+ fwd_profile_success_ (0),
+ // what about ACE_SYNCH_MUTEX refcount_lock_
+ refcount_ (1),
+ use_locate_request_ (0),
+ first_locate_request_ (0)
+{
+ this->profile_lock_ptr_ =
+ TAO_ORB_Core_instance ()->client_factory ()->create_iiop_profile_lock ();
+}
+
+ACE_INLINE
+STUB_Object::STUB_Object (char *repository_id,
+ TAO_MProfile &profiles)
+ : base_profiles_ ((CORBA::ULong) 0),
+ fwd_profiles_ (0),
+ profile_in_use_ (0),
+ fwd_profile_ (0),
+ profile_lock_ptr_ (0),
+ fwd_profile_success_ (0),
+ // what about ACE_SYNCH_MUTEX refcount_lock_
+ refcount_ (1),
+ use_locate_request_ (0),
+ first_locate_request_ (0)
+{
+
+ this->profile_lock_ptr_ =
+ TAO_ORB_Core_instance ()->client_factory ()->create_iiop_profile_lock ();
+
+ set_profiles (&profiles);
+}
+
+ACE_INLINE
+STUB_Object::STUB_Object (char *repository_id,
+ TAO_Profile *profile)
+ : base_profiles_ ((CORBA::ULong) 0),
+ fwd_profiles_ (0),
+ profile_in_use_ (0),
+ fwd_profile_ (0),
+ profile_lock_ptr_ (0),
+ fwd_profile_success_ (0),
+ // what about ACE_SYNCH_MUTEX refcount_lock_
+ refcount_ (1),
+ use_locate_request_ (0),
+ first_locate_request_ (0)
+{
+ // @@ XXX need to verify type and deal with wrong types
+
+ this->profile_lock_ptr_ =
+ TAO_ORB_Core_instance ()->client_factory ()->create_iiop_profile_lock ();
+
+ base_profiles_.set (1);
+
+ base_profiles_.add_profile (profile);
+
+ this->set_profile_in_use_i (this->base_profiles_.get_next ());
+
+}
+
+ACE_INLINE
+STUB_Object::STUB_Object (char *repository_id,
+ TAO_MProfile *profiles)
+ : base_profiles_ ((CORBA::ULong) 0),
+ fwd_profiles_ (0),
+ profile_in_use_ (0),
+ fwd_profile_ (0),
+ profile_lock_ptr_ (0),
+ fwd_profile_success_ (0),
+ // what about ACE_SYNCH_MUTEX refcount_lock_
+ refcount_ (1),
+ use_locate_request_ (0),
+ first_locate_request_ (0)
+{
+ // @@ XXX need to verify type and deal with wrong types
+
+ // @@ does this need to be freed?
+ this->profile_lock_ptr_ =
+ TAO_ORB_Core_instance ()->client_factory ()->create_iiop_profile_lock ();
+
+ set_profiles (profiles);
+
+}
+
+ACE_INLINE
+TAO_Profile *
+STUB_Object::profile_in_use (void)
{
+ return this->profile_in_use_;
}
+
+//@@ From Carlos - Virtual functions are dangerous to inline!! FRED
+// put in .cpp file!
+ACE_INLINE
+TAO_Profile *
+STUB_Object::set_profile_in_use_i (TAO_Profile *pfile)
+{
+ TAO_Profile *old = this->profile_in_use_;
+
+ // Since we are actively using this profile we dont want
+ // it to disappear, so increase the reference count by one!!
+ if (pfile && (pfile->_incr_refcnt () == 0))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) unable to increment profile ref!\n"),
+ 0);
+ }
+
+ this->profile_in_use_ = pfile;
+
+ if (old)
+ old->_decr_refcnt ();
+
+ return this->profile_in_use_;
+}
+
+ACE_INLINE
+TAO_Profile *
+STUB_Object::set_profile_in_use (TAO_Profile *pfile)
+{
+
+ ACE_MT (ACE_GUARD_RETURN (ACE_Lock,
+ guard,
+ *this->profile_lock_ptr_,
+ 0));
+
+ return set_profile_in_use_i (pfile);
+
+}
+
+
+ACE_INLINE
+TAO_Profile *
+STUB_Object::get_fwd_profile_i (void)
+{
+ return this->fwd_profile_;
+}
+
+ACE_INLINE
+TAO_Profile *
+STUB_Object::get_fwd_profile (void)
+{
+ ACE_MT (ACE_GUARD_RETURN (ACE_Lock,
+ guard,
+ *this->profile_lock_ptr_,
+ 0));
+
+ return this->get_fwd_profile_i ();
+}
+
+
+// set_fwd_profile is currently called with either an arg of NULL
+// or with a pointer to another STUB_Object's profile_in_use_.
+// Change in strategy from previous version: Since we assume this
+// forward profile comes from am MProfile list, we just increment the
+// reference count on the profile. We do not copy it and we assume
+// the user will not modify!
+ACE_INLINE
+TAO_Profile *
+STUB_Object::set_fwd_profile (TAO_Profile *new_profile)
+{
+
+ TAO_Profile *old = this->fwd_profile_;
+
+ // show that we are using this!
+ // @@ could be an inline => reduce code, common
+ if (new_profile && (new_profile->_incr_refcnt () == 0))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) unable to increment profile ref!\n"),
+ 0);
+ }
+
+ this->fwd_profile_ = new_profile;
+
+ if (old)
+ old->_decr_refcnt ();
+
+ return this->fwd_profile_;
+}
+
+ACE_INLINE
+ACE_Lock &
+STUB_Object::get_profile_lock (void)
+{
+ return *this->profile_lock_ptr_;
+}
+
+ACE_INLINE
+void
+STUB_Object::reset_first_locate_request (void)
+{
+ first_locate_request_ = 1;
+}
+
+ACE_INLINE
+void
+STUB_Object::use_locate_requests (CORBA::Boolean use_it)
+{
+ if (use_it)
+ {
+ this->first_locate_request_ = 1;
+ this->use_locate_request_ = 1;
+ }
+ else
+ {
+ // Don't use it.
+ this->first_locate_request_ = 0;
+ this->use_locate_request_ = 0;
+ }
+}
+
+ // @@ FRED We need to LOCK this!
+ACE_INLINE
+TAO_Profile *
+STUB_Object::set_profiles (TAO_MProfile *mprofiles)
+{
+
+ ACE_MT (ACE_GUARD_RETURN (ACE_Lock,
+ guard,
+ *this->profile_lock_ptr_,
+ 0));
+
+ base_profiles_.set (mprofiles);
+
+ return this->set_profile_in_use_i (this->base_profiles_.get_next ());
+
+}
+
+ACE_INLINE
+TAO_MProfile *
+STUB_Object::get_profiles (void)
+{
+ return new TAO_MProfile (&base_profiles_);
+}
+
+ACE_INLINE
+TAO_Profile *
+STUB_Object::reset_profiles (void)
+{
+ ACE_MT (ACE_GUARD_RETURN (ACE_Lock,
+ guard,
+ *this->profile_lock_ptr_,
+ 0));
+
+ // first get rid of any forwarding profile list and fwd_profile
+ reset_fwd_profiles ();
+
+ // then rewind profile list, back to the beginning
+ this->base_profiles_.rewind ();
+
+ reset_first_locate_request ();
+ // resets the flag of the first call locate request to true
+
+ return this->set_profile_in_use_i (this->base_profiles_.get_next ());
+}
+
+ACE_INLINE
+TAO_Profile *
+STUB_Object::next_profile (void)
+{
+ ACE_MT (ACE_GUARD_RETURN (ACE_Lock,
+ guard,
+ *this->profile_lock_ptr_,
+ 0));
+
+ return this->set_profile_in_use_i (this->base_profiles_.get_next ());
+}
+
+ACE_INLINE
+TAO_MProfile *
+STUB_Object::get_fwd_profiles (void)
+{
+ if (fwd_profiles_)
+ return new TAO_MProfile (this->fwd_profiles_);
+ return 0;
+}
+
+ACE_INLINE
+void
+STUB_Object::set_fwd_profiles (TAO_MProfile *mprofiles)
+{
+
+ if (! profile_in_use_)
+ return ;
+
+ // profile_in_use_ will copy the object but delegate
+ // to this Stub_Obj responsibility for manipulating list!
+ TAO_MProfile *tmp = new TAO_MProfile (mprofiles);
+
+ // now add a pointer back the the profile list hat had been
+ // forwarded. Note, since the profile list is like
+ // a state machine, the current poitner refers to the
+ // actual profile that was forwarded!
+
+ {
+ ACE_MT (ACE_GUARD (ACE_Lock,
+ guard,
+ *this->profile_lock_ptr_));
+
+ if (this->fwd_profiles_)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "(%P|%t) ** Overwriting fwd profiles!!\n"));
+ TAO_MProfile *old = this->fwd_profiles_;
+ TAO_MProfile *prev = old->fwded_mprofile ();
+ if (prev->get_current_profile ())
+ prev->get_current_profile ()->fwd_profiles (0);
+ // @@ FRED: UGLY but for now just one level!
+ }
+
+ this->fwd_profiles_ = tmp;
+
+ // @@ if (this->fwd_profiles_)
+ // @@ // add a link in the chain!
+ // @@ tmp->fwded_mprofile (this->fwd_profiles_);
+
+ this->fwd_profiles_->fwded_mprofile (&this->base_profiles_);
+ profile_in_use_->fwd_profiles (this->fwd_profiles_);
+
+ set_fwd_profile ( this->fwd_profiles_->get_next ());
+ }
+
+}
+
+ACE_INLINE
+void
+STUB_Object::reset_fwd_profiles (void)
+{
+
+ if (fwd_profiles_)
+ {
+ // @@ Assume on one level deep FRED
+ TAO_MProfile *old = fwd_profiles_;
+ TAO_MProfile *prev = old->fwded_mprofile ();
+ // this should be base_profiles_
+ if (prev->get_current_profile ())
+ prev->get_current_profile ()->fwd_profiles (0);
+ // it better be! this should be profile_in_use_
+ }
+
+ set_fwd_profile (0);
+}
+
+ACE_INLINE
+TAO_Profile *
+STUB_Object::next_fwd_profile (void)
+{
+ ACE_MT (ACE_GUARD_RETURN (ACE_Lock,
+ guard,
+ *this->profile_lock_ptr_,
+ 0));
+
+ if (fwd_profiles_)
+ return this->set_fwd_profile (this->fwd_profiles_->get_next ());
+
+ return this->set_fwd_profile (0);
+}
+