Public Member Functions | Private Types | Private Member Functions | Private Attributes

TAO::PICurrent_Impl Class Reference

Implementation of the PortableInterceptor::Current interface. More...

#include <PICurrent_Impl.h>

Collaboration diagram for TAO::PICurrent_Impl:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 PICurrent_Impl (TAO_ORB_Core *orb_core=0, size_t tss_slot=0, PICurrent_Impl *pop=0)
 Constructor.
 ~PICurrent_Impl (void)
 Destructor.
CORBA::Anyget_slot (PortableInterceptor::SlotId identifier)
void set_slot (PortableInterceptor::SlotId identifier, const CORBA::Any &data)
 Set information in the slot table at the given SlotId.
void take_lazy_copy (PICurrent_Impl *p)
 Logically/Lazy (shallow) copy the given object's slot table.
void push (void)
 Push a new PICurrent_Impl on stack.
void pop (void)
 Pop old PICurrent_Impl from stack.

Private Types

typedef ACE_Array_Base
< CORBA::Any
Table
 Typedef for the underyling "slot table.".

Private Member Functions

void convert_from_lazy_to_real_copy ()
void set_callback_for_impending_change (PICurrent_Impl *p)
Tablecurrent_slot_table ()

 PICurrent_Impl (const PICurrent_Impl &)
void operator= (const PICurrent_Impl &)

Private Attributes

TAO_ORB_Coreorb_core_
 Allow for stack of PICurrent_Impl as required.
size_t tss_slot_
PICurrent_Implpop_
PICurrent_Implpush_
Table slot_table_
 Array of CORBA::Anys that is the underlying "slot table.".
PICurrent_Impllazy_copy_
PICurrent_Implimpending_change_callback_

Detailed Description

Implementation of the PortableInterceptor::Current interface.

This class implements both the "request scope current" and the "thread scope current" objects as required by Portable Interceptors.

Definition at line 49 of file PICurrent_Impl.h.


Member Typedef Documentation

typedef ACE_Array_Base<CORBA::Any> TAO::PICurrent_Impl::Table [private]

Typedef for the underyling "slot table.".

Definition at line 89 of file PICurrent_Impl.h.


Constructor & Destructor Documentation

TAO::PICurrent_Impl::PICurrent_Impl ( TAO_ORB_Core orb_core = 0,
size_t  tss_slot = 0,
PICurrent_Impl pop = 0 
)

Constructor.

Definition at line 8 of file PICurrent_Impl.inl.

  : orb_core_ (orb_core),
    tss_slot_ (tss_slot),
    pop_ (pop),
    push_ (0),
    slot_table_ (),
    lazy_copy_ (0),
    impending_change_callback_ (0)
{
}

TAO::PICurrent_Impl::~PICurrent_Impl ( void   ) 

Destructor.

Definition at line 132 of file PICurrent_Impl.cpp.

{
  if (this->push_)
    {
      // We have YOUNGER stack members to REMOVE as well. HOWEVER we
      // don't want the entry above us coming back down and trying
      // to delete us again. (As we are currently doing just that.)
      this->push_->pop_= 0;

      delete this->push_;
    }
  else if (this->orb_core_)
    {
      // Since there are no entries above us, we must be the top of
      // the stack and since all are being deleted, the stack will
      // be empty.
      this->orb_core_->set_tss_resource (this->tss_slot_, 0);
    }

  // Break any existing ties that another PICurrent has with our table
  // since our table will no longer exists once this destructor completes.
  if (0 != this->impending_change_callback_)
    this->impending_change_callback_->convert_from_lazy_to_real_copy ();

  // If we have logically copied another table, ensure it is told about our
  // demise so that it will not call our non-existant
  // convert_from_lazy_to_real_copy() when it changes/destructs.
  if (0 != this->lazy_copy_)
    this->lazy_copy_->set_callback_for_impending_change (0);

  if (this->pop_)
    {
      // We have OLDER stack members to REMOVE as well. HOWEVER we
      // don't want multiple adjustments of the stack head pointer from
      // every older entry as they delete, as this requires multiple
      // set_tss_resource updates which would be slow and unnecessary.
      this->pop_->orb_core_= 0;

      // We also don't want double deletions of what used to be above these
      // since we have just completed the deletion of these ourselves.
      this->pop_->push_= 0;
      delete this->pop_;
    }
}

TAO::PICurrent_Impl::PICurrent_Impl ( const PICurrent_Impl  )  [private]

Prevent copying through the copy constructor and the assignment operator.


Member Function Documentation

void TAO::PICurrent_Impl::convert_from_lazy_to_real_copy (  )  [private]

Force this object to convert from a logical (referenced) copy, to a physical (or deep, actual) copy.

Definition at line 23 of file PICurrent_Impl.inl.

{
  // Make sure we take a physical copy of the existing logical
  // copy of the table before it disappears/changes.
  if (0 != this->lazy_copy_)
    {
      this->slot_table_ = this->lazy_copy_->current_slot_table ();

      // Must tell the old copied PICurrent_Impl that we no
      // longer want to be told when/if it is going to be
      // changed or destroyed.
      this->lazy_copy_->set_callback_for_impending_change (0);
      this->lazy_copy_ = 0;
    }
}

TAO::PICurrent_Impl::Table & TAO::PICurrent_Impl::current_slot_table (  )  [private]

Return a reference to the slot table currently associated with this PICurrent_Impl object.

Returns:
Logically copied slot table if available, otherwise underlying slot table.

Definition at line 46 of file PICurrent_Impl.inl.

{
  return (0 == this->lazy_copy_) ?
         this->slot_table_ :
         this->lazy_copy_->current_slot_table ();
}

CORBA::Any * TAO::PICurrent_Impl::get_slot ( PortableInterceptor::SlotId  identifier  ) 

Retrieve information stored in the slot table at the given SlotId.

Definition at line 23 of file PICurrent_Impl.cpp.

{
  // No need to check validity of SlotId.  It is validated before this
  // method is invoked.

  // The active slot table should never be a lazy copy of itself!
  if ( (0 != this->lazy_copy_)
      && (&this->lazy_copy_->current_slot_table () == &this->slot_table_))
  {
    if (TAO_debug_level > 0)
      ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("TAO (%P|%t) Lazy copy of self detected at %N,%l\n")));
    throw ::CORBA::INTERNAL ();
  }

  // Get the slot table that is currently active
  PICurrent_Impl::Table & table = this->current_slot_table ();
  CORBA::Any * any = 0;

  if (identifier < table.size ())
    {
      ACE_NEW_THROW_EX (any,
                        CORBA::Any (table[identifier]), // Make a copy.
                        CORBA::NO_MEMORY (
                          CORBA::SystemException::_tao_minor_code (
                            0,
                            ENOMEM),
                          CORBA::COMPLETED_NO));
    }
  else
    {
      // In accordance with the Portable Interceptor specification,
      // return an Any with a TCKind of tk_null.  A default
      // constructed Any has that TCKind.
      ACE_NEW_THROW_EX (any,
                        CORBA::Any,
                        CORBA::NO_MEMORY (
                          CORBA::SystemException::_tao_minor_code (
                            0,
                            ENOMEM),
                          CORBA::COMPLETED_NO));
    }

  return any;
}

void TAO::PICurrent_Impl::operator= ( const PICurrent_Impl  )  [private]

Prevent copying through the copy constructor and the assignment operator.

void TAO::PICurrent_Impl::pop ( void   ) 

Pop old PICurrent_Impl from stack.

Definition at line 204 of file PICurrent_Impl.cpp.

{
  if (this->orb_core_) // We have a stack to adjust
    {
      TAO::PICurrent_Impl *const currentHead =
        static_cast<TAO::PICurrent_Impl *> (
          this->orb_core_->get_tss_resource (this->tss_slot_));
      if (currentHead->pop_)
        orb_core_->set_tss_resource (tss_slot_, currentHead->pop_);
      else
        throw ::CORBA::INTERNAL (); // Too many pop's
    }
  else
    throw ::CORBA::INTERNAL (); // Should only call push if we have a stack
}

void TAO::PICurrent_Impl::push ( void   ) 

Push a new PICurrent_Impl on stack.

Definition at line 178 of file PICurrent_Impl.cpp.

{
  if (this->orb_core_) // We have a stack to adjust
    {
      TAO::PICurrent_Impl *const currentHead =
        static_cast<TAO::PICurrent_Impl *> (
          this->orb_core_->get_tss_resource (this->tss_slot_));
      if (!currentHead->push_)
        {
          // Since there is nothing younger above us, we need to create
          // a new entry.
          ACE_NEW_THROW_EX (currentHead->push_,
                            PICurrent_Impl (this->orb_core_, this->tss_slot_, currentHead),
                            CORBA::NO_MEMORY (
                              CORBA::SystemException::_tao_minor_code (
                                0,
                                ENOMEM),
                              CORBA::COMPLETED_NO));
        }
      this->orb_core_->set_tss_resource (this->tss_slot_, currentHead->push_);
    }
  else
    throw ::CORBA::INTERNAL (); // Should only call push if we have a stack
}

void TAO::PICurrent_Impl::set_callback_for_impending_change ( TAO::PICurrent_Impl *  p  )  [private]

Set the callback PICurrent_Impl object that will be notified of this object's impending destruction or change. Set to 0 to clear. (NOTE Only handles a SINGLE object at at time, does NOT warn previous callback that this has been changed.)

Definition at line 40 of file PICurrent_Impl.inl.

{
  this->impending_change_callback_ = (this == p) ? 0 : p;
}

void TAO::PICurrent_Impl::set_slot ( PortableInterceptor::SlotId  identifier,
const CORBA::Any data 
)

Set information in the slot table at the given SlotId.

Definition at line 69 of file PICurrent_Impl.cpp.

{
  // No need to check validity of SlotId.  It is validated before this
  // method is invoked.

  // Break any existing ties that another PICurrent has with our table
  // since our table is changing.
  if (0 != this->impending_change_callback_)
    this->impending_change_callback_->convert_from_lazy_to_real_copy ();

  // Ensure that we have a real physical copy of the table before
  // making any changes to it.
  this->convert_from_lazy_to_real_copy ();

  // If the slot table array isn't large enough, then increase its
  // size.  We're guaranteed not to exceed the number of allocated
  // slots for the reason stated above.
  if (identifier >= this->slot_table_.size ()
      && this->slot_table_.size (identifier + 1) != 0)
    throw ::CORBA::INTERNAL ();

  this->slot_table_[identifier] = CORBA::Any (data);
}

void TAO::PICurrent_Impl::take_lazy_copy ( TAO::PICurrent_Impl *  p  ) 

Logically/Lazy (shallow) copy the given object's slot table.

Definition at line 95 of file PICurrent_Impl.cpp.

{
  // Check that we are being told to actually change which table we are
  // copying from. (If it is the same as before OR it would ultimately be
  // the same table, we are already correctly setup and we do nothing.)
  if ( (p != this->lazy_copy_)
      && ((0 == p) || (&p->current_slot_table () != &this->current_slot_table ()))
      )
    {
      // Break any existing ties that another PICurrent has with our table
      // since our table is changing.
      if (0 != this->impending_change_callback_)
        this->impending_change_callback_->convert_from_lazy_to_real_copy ();

      // If we have previously logically copied another table, ensure it is
      // told that we are no longer interested in it so that it will not
      // call our conver_from_lazy_to_real_copy() when it changes/destructs.
      if (0 != this->lazy_copy_)
        this->lazy_copy_->set_callback_for_impending_change (0);

      // Are we being asked to copy ourself (or nothing)
      if ((0 == p) || (this == p))
        {
          this->lazy_copy_ = 0; // Use our own physical slot_table_
        }
      else
        {
          this->lazy_copy_ = p;

          // Must tell the newly copied PICurrent_Impl that we want to
          // be told when/if it is going to be changed or destroyed.
          this->lazy_copy_->set_callback_for_impending_change (this);
        }
    }
}


Member Data Documentation

PICurrent_Impl* TAO::PICurrent_Impl::impending_change_callback_ [private]

PICurrent_Impl object that will be notified of this object's impending destruction or change to its slot_table_. This is the PICurrent_Impl that has access to our slot_table_ via its lazy_copy_ pointer. As necessary this allows that object's convert_from_lazy_to_real_copy() to be called.

Definition at line 125 of file PICurrent_Impl.h.

PICurrent_Impl* TAO::PICurrent_Impl::lazy_copy_ [private]

Access to logical copy from a PICurrent_Impl in another scope, i.e. either the request scope or the thread scope.

Definition at line 118 of file PICurrent_Impl.h.

TAO_ORB_Core* TAO::PICurrent_Impl::orb_core_ [private]

Allow for stack of PICurrent_Impl as required.

Definition at line 108 of file PICurrent_Impl.h.

PICurrent_Impl* TAO::PICurrent_Impl::pop_ [private]

Definition at line 110 of file PICurrent_Impl.h.

PICurrent_Impl* TAO::PICurrent_Impl::push_ [private]

Definition at line 111 of file PICurrent_Impl.h.

Table TAO::PICurrent_Impl::slot_table_ [private]

Array of CORBA::Anys that is the underlying "slot table.".

Definition at line 114 of file PICurrent_Impl.h.

size_t TAO::PICurrent_Impl::tss_slot_ [private]

Definition at line 109 of file PICurrent_Impl.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines