TAO_ServantBase Class Reference

Base class for skeletons and servants. More...

#include <Servant_Base.h>

Inheritance diagram for TAO_ServantBase:

Inheritance graph
[legend]
Collaboration diagram for TAO_ServantBase:

Collaboration graph
[legend]
List of all members.

Public Member Functions

virtual ~TAO_ServantBase (void)
 Destructor.

virtual PortableServer::POA_ptr _default_POA (void)
 Returns the default POA for this servant.

virtual CORBA::Boolean _is_a (const char *logical_type_id)
 Local implementation of the CORBA::Object::_is_a method.

virtual CORBA::Boolean _non_existent (void)
 Default _non_existent: always returns false.

virtual CORBA::InterfaceDef_ptr _get_interface (void)
 Query the Interface Repository for the interface definition.

virtual CORBA::Object_ptr _get_component (void)
 Default _get_component: always returns CORBA::Object::_nil().

virtual char * _repository_id (void)
 Get the repository id.

virtual TAO_Stub_create_stub (void)
 This is an auxiliary method for _this() and _narrow().

virtual void _dispatch (TAO_ServerRequest &request, void *servant_upcall)=0
virtual int _find (const char *opname, TAO_Skeleton &skelfunc, const size_t length=0)
virtual int _find (const char *opname, TAO_Collocated_Skeleton &skelfunc, TAO::Collocation_Strategy st, const size_t length=0)
virtual const char * _interface_repository_id (void) const=0
 Get this interface's repository id (TAO specific).

Reference Counting Operations
virtual void _add_ref (void)
 Increase reference count by one.

virtual void _remove_ref (void)
virtual CORBA::ULong _refcount_value (void) const

Protected Member Functions

 TAO_ServantBase (void)
 Default constructor, only derived classes can be created.

 TAO_ServantBase (const TAO_ServantBase &)
 Copy constructor, protected so no instances can be created.

TAO_ServantBaseoperator= (const TAO_ServantBase &)
 Assignment operator.

virtual void synchronous_upcall_dispatch (TAO_ServerRequest &req, void *servant_upcall, void *derived_this)
virtual void asynchronous_upcall_dispatch (TAO_ServerRequest &req, void *servant_upcall, void *derived_this)

Protected Attributes

ACE_Atomic_Op< TAO_SYNCH_MUTEX,
long > 
ref_count_
 Reference counter.

TAO_Operation_Tableoptable_

Detailed Description

Base class for skeletons and servants.

The POA spec requires that all servants inherit from this class' base class.

An instance of a servant class derived from ServantBase initially has a reference count of one. Invoking _add_ref on the servant instance increases its reference count by one. Invoking _remove_ref on the servant instance decreases its reference count by one; if the resulting reference count equals zero, _remove_ref invokes delete on its this pointer in order to destroy the servant. For ORBs that operate in multi-threaded environments, the implementations of _add_ref and _remove_ref that the ServantBase class provides shall be thread-safe.

Like ServantBase supports copy construction and the default assignment operation. Copy construction always sets the reference count of the new servant instance to one. The default assignment implementation merely returns *this and does not affect the reference count.

Definition at line 61 of file Servant_Base.h.


Constructor & Destructor Documentation

TAO_ServantBase::~TAO_ServantBase void   )  [virtual]
 

Destructor.

Definition at line 71 of file Servant_Base.cpp.

00072 {
00073 }

TAO_BEGIN_VERSIONED_NAMESPACE_DECL TAO_ServantBase::TAO_ServantBase void   )  [protected]
 

Default constructor, only derived classes can be created.

Definition at line 50 of file Servant_Base.cpp.

00051   : TAO_Abstract_ServantBase ()
00052   , ref_count_ (1)
00053   , optable_ (0)
00054 {
00055 }

TAO_ServantBase::TAO_ServantBase const TAO_ServantBase  )  [protected]
 

Copy constructor, protected so no instances can be created.

Definition at line 57 of file Servant_Base.cpp.

00058   : TAO_Abstract_ServantBase ()
00059   , ref_count_ (1)
00060   , optable_ (rhs.optable_)
00061 {
00062 }


Member Function Documentation

void TAO_ServantBase::_add_ref void   )  [virtual]
 

Increase reference count by one.

Implements TAO_Abstract_ServantBase.

Definition at line 313 of file Servant_Base.cpp.

00314 {
00315   ++this->ref_count_;
00316 }

TAO_Stub * TAO_ServantBase::_create_stub void   )  [virtual]
 

This is an auxiliary method for _this() and _narrow().

Implements TAO_Abstract_ServantBase.

Reimplemented in TAO_Local_ServantBase.

Definition at line 146 of file Servant_Base.cpp.

References _default_POA(), TAO_Stub::_incr_refcnt(), _interface_repository_id(), TAO_TSS_Resources::instance(), TAO::Portable_Server::POA_Current_Impl::object_key(), TAO_ORB_Core::orb(), TAO_Stub::orb_core(), TAO::Portable_Server::POA_Current_Impl::orb_core(), TAO::Portable_Server::POA_Current_Impl::poa(), TAO_TSS_Resources::poa_current_impl_, PortableServer::POA_var, TAO::Portable_Server::POA_Current_Impl::priority(), TAO::Portable_Server::POA_Current_Impl::servant(), and TAO_Stub::servant_orb().

Referenced by POA_CORBA::Policy::_this().

00147 {
00148   TAO_Stub *stub = 0;
00149 
00150   TAO::Portable_Server::POA_Current_Impl *poa_current_impl =
00151     static_cast<TAO::Portable_Server::POA_Current_Impl *>
00152                     (TAO_TSS_Resources::instance ()->poa_current_impl_);
00153 
00154   CORBA::ORB_ptr servant_orb = 0;
00155 
00156   if (poa_current_impl != 0
00157       && this == poa_current_impl->servant ())
00158     {
00159       servant_orb = poa_current_impl->orb_core ().orb () ;
00160 
00161       stub =
00162         poa_current_impl->poa ()->key_to_stub (
00163             poa_current_impl->object_key (),
00164             this->_interface_repository_id (),
00165             poa_current_impl->priority ()
00166           );
00167     }
00168   else
00169     {
00170       PortableServer::POA_var poa = this->_default_POA ();
00171 
00172       CORBA::Object_var object = poa->servant_to_reference (this);
00173 
00174       // Get the stub object
00175       stub = object->_stubobj ();
00176 
00177       // Increment the reference count since <object> will zap its
00178       // stub object on deletion.
00179       stub->_incr_refcnt ();
00180 
00181       servant_orb = stub->orb_core ()->orb ();
00182     }
00183 
00184   stub->servant_orb (servant_orb);
00185   return stub;
00186 }

PortableServer::POA_ptr TAO_ServantBase::_default_POA void   )  [virtual]
 

Returns the default POA for this servant.

Reimplemented in POA_CORBA::Policy_tie< T >.

Definition at line 76 of file Servant_Base.cpp.

References TAO_ORB_Core::root_poa(), and TAO_ORB_Core_instance().

Referenced by _create_stub().

00077 {
00078   CORBA::Object_var object = TAO_ORB_Core_instance ()->root_poa ();
00079 
00080   return PortableServer::POA::_narrow (object.in ());
00081 }

virtual void TAO_ServantBase::_dispatch TAO_ServerRequest request,
void *  servant_upcall
[pure virtual]
 

Dispatches a request to the object: find the operation, cast the type to the most derived type, demarshall all the parameters from the request and finally invokes the operation, storing the results and out parameters (if any) or the exceptions thrown into request.

Implements TAO_Abstract_ServantBase.

Implemented in TAO_Local_ServantBase, and POA_CORBA::Policy.

int TAO_ServantBase::_find const char *  opname,
TAO_Collocated_Skeleton skelfunc,
TAO::Collocation_Strategy  st,
const size_t  length = 0
[virtual]
 

Implements TAO_Abstract_ServantBase.

Definition at line 136 of file Servant_Base.cpp.

References ACE_FUNCTION_TIMEPROBE, TAO_Operation_Table::find(), optable_, and TAO_Collocated_Skeleton.

00140 {
00141   ACE_FUNCTION_TIMEPROBE (TAO_SERVANT_BASE_FIND_START);
00142   return this->optable_->find (opname, skelfunc, st, length);
00143 }

int TAO_ServantBase::_find const char *  opname,
TAO_Skeleton skelfunc,
const size_t  length = 0
[virtual]
 

Please see documentation in tao/Abstract_Servant_Base.h for details.

Implements TAO_Abstract_ServantBase.

Definition at line 127 of file Servant_Base.cpp.

References ACE_FUNCTION_TIMEPROBE, TAO_Operation_Table::find(), optable_, and TAO_Skeleton.

Referenced by asynchronous_upcall_dispatch(), and synchronous_upcall_dispatch().

00130 {
00131   ACE_FUNCTION_TIMEPROBE (TAO_SERVANT_BASE_FIND_START);
00132   return this->optable_->find (opname, skelfunc, length);
00133 }

CORBA::Object_ptr TAO_ServantBase::_get_component void   )  [virtual]
 

Default _get_component: always returns CORBA::Object::_nil().

Implements TAO_Abstract_ServantBase.

Definition at line 115 of file Servant_Base.cpp.

References CORBA::Object::_nil().

00116 {
00117   return CORBA::Object::_nil ();
00118 }

CORBA::InterfaceDef_ptr TAO_ServantBase::_get_interface void   )  [virtual]
 

Query the Interface Repository for the interface definition.

Implements TAO_Abstract_ServantBase.

Definition at line 97 of file Servant_Base.cpp.

References TAO_IFR_Client_Adapter::get_interface(), ACE_Dynamic_Service< TYPE >::instance(), and TAO_ORB_Core_instance().

Referenced by POA_CORBA::Policy::_interface_skel().

00098 {
00099   TAO_IFR_Client_Adapter *adapter =
00100     ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
00101         TAO_ORB_Core::ifr_client_adapter_name ());
00102 
00103   if (adapter == 0)
00104     {
00105       throw ::CORBA::INTF_REPOS ();
00106     }
00107 
00108   // This doesn't take multiple ORBs into account, but it's being
00109   // used only to resolve the IFR, so we should be ok.
00110   return adapter->get_interface (TAO_ORB_Core_instance ()->orb (),
00111                                  this->_interface_repository_id ());
00112 }

virtual const char* TAO_ServantBase::_interface_repository_id void   )  const [pure virtual]
 

Get this interface's repository id (TAO specific).

Implements TAO_Abstract_ServantBase.

Implemented in POA_CORBA::Policy.

Referenced by _create_stub().

CORBA::Boolean TAO_ServantBase::_is_a const char *  logical_type_id  )  [virtual]
 

Local implementation of the CORBA::Object::_is_a method.

Implements TAO_Abstract_ServantBase.

Reimplemented in POA_CORBA::Policy.

Definition at line 84 of file Servant_Base.cpp.

References ACE_OS::strcmp().

00085 {
00086   static char const id[] = "IDL:omg.org/CORBA/Object:1.0";
00087   return ACE_OS::strcmp (logical_type_id, id) == 0;
00088 }

CORBA::Boolean TAO_ServantBase::_non_existent void   )  [virtual]
 

Default _non_existent: always returns false.

Implements TAO_Abstract_ServantBase.

Definition at line 91 of file Servant_Base.cpp.

00092 {
00093   return false;
00094 }

CORBA::ULong TAO_ServantBase::_refcount_value void   )  const [virtual]
 

Returns the current reference count value.

Implements TAO_Abstract_ServantBase.

Definition at line 328 of file Servant_Base.cpp.

References ACE_Atomic_Op< TAO_SYNCH_MUTEX, long >::value().

00329 {
00330   return static_cast<CORBA::ULong> (this->ref_count_.value ());
00331 }

void TAO_ServantBase::_remove_ref void   )  [virtual]
 

Decreases reference count by one; if the resulting reference count equals zero, _remove_ref invokes delete on its this pointer in order to destroy the servant.

Implements TAO_Abstract_ServantBase.

Definition at line 319 of file Servant_Base.cpp.

00320 {
00321   long const new_count = --this->ref_count_;
00322 
00323   if (new_count == 0)
00324     delete this;
00325 }

char * TAO_ServantBase::_repository_id void   )  [virtual]
 

Get the repository id.

Implements TAO_Abstract_ServantBase.

Definition at line 121 of file Servant_Base.cpp.

References CORBA::string_dup().

00122 {
00123   return CORBA::string_dup (this->_interface_repository_id ());
00124 }

void TAO_ServantBase::asynchronous_upcall_dispatch TAO_ServerRequest req,
void *  servant_upcall,
void *  derived_this
[protected, virtual]
 

Definition at line 261 of file Servant_Base.cpp.

References _find(), TAO_ServerRequest::operation(), TAO_ServerRequest::operation_length(), TAO_ServerRequest::send_no_exception_reply(), TAO_ServerRequest::sync_with_server(), TAO_ServerRequest::tao_send_reply_exception(), and TAO_Skeleton.

00264 {
00265   TAO_Skeleton skel;
00266   const char *opname = req.operation ();
00267 
00268   // It seems that I might have missed s/g here.  What if
00269   // it is a one way that is SYNC_WITH_SERVER.
00270   // Add the following line to handle this reply send as well.
00271 
00272   // Handle the one ways that are SYNC_WITH_SERVER
00273   if (req.sync_with_server ())
00274     {
00275       req.send_no_exception_reply ();
00276     }
00277 
00278   // Fetch the skeleton for this operation
00279   if (this->_find (opname,
00280                    skel,
00281                    static_cast <unsigned int> (req.operation_length())) == -1)
00282     {
00283       throw ::CORBA::BAD_OPERATION ();
00284     }
00285 
00286   try
00287     {
00288       // Invoke the skeleton, it will demarshal the arguments, invoke
00289       // the right operation on the skeleton class, and marshal any
00290       // results.  De/marshaling will only occur in the uncollocated
00291       // case.
00292       skel (req, servant_upcall, derived_this);
00293 
00294       // It is our job to send the already marshaled reply, but only
00295       // send if it is expected and it has not already been sent
00296 
00297       // Return immediately. Do not send a reply; this is an
00298       // asynchronous upcall. (unless, of course there is a system
00299       // exception.
00300 
00301     }
00302   catch (const ::CORBA::Exception& ex)
00303     {
00304       // If an exception was raised we should marshal it and send
00305       // the appropriate reply to the client
00306       req.tao_send_reply_exception (ex);
00307     }
00308 
00309   return;
00310 }

TAO_ServantBase & TAO_ServantBase::operator= const TAO_ServantBase  )  [protected]
 

Assignment operator.

Definition at line 65 of file Servant_Base.cpp.

References optable_.

00066 {
00067   this->optable_ = rhs.optable_;
00068   return *this;
00069 }

void TAO_ServantBase::synchronous_upcall_dispatch TAO_ServerRequest req,
void *  servant_upcall,
void *  derived_this
[protected, virtual]
 

Implements TAO_Abstract_ServantBase.

Definition at line 188 of file Servant_Base.cpp.

References _find(), TAO_ServerRequest::collocated(), TAO_ServerRequest::deferred_reply(), TAO_ServerRequest::operation(), TAO_ServerRequest::operation_length(), TAO_ServerRequest::response_expected(), TAO_ServerRequest::send_no_exception_reply(), TAO_ServerRequest::sync_with_server(), TAO_ServerRequest::tao_send_reply(), TAO_ServerRequest::tao_send_reply_exception(), and TAO_Skeleton.

Referenced by POA_CORBA::Policy::_dispatch().

00191 {
00192   TAO_Skeleton skel;
00193   char const * const opname = req.operation ();
00194 
00195   // It seems that I might have missed s/g here.  What if
00196   // it is a one way that is SYNC_WITH_SERVER.
00197   // Add the following line to handle this reply send as well.
00198 
00199   // Handle the one ways that are SYNC_WITH_SERVER and not collocated
00200   if (req.sync_with_server () && !req.collocated ())
00201     {
00202       req.send_no_exception_reply ();
00203     }
00204 
00205   // Fetch the skeleton for this operation
00206   if (this->_find (opname,
00207                    skel,
00208                    static_cast <unsigned int> (req.operation_length())) == -1)
00209     {
00210       throw ::CORBA::BAD_OPERATION ();
00211     }
00212 
00213   CORBA::Boolean const send_reply =
00214     !req.sync_with_server ()
00215     && req.response_expected ()
00216     && !req.deferred_reply ();
00217 
00218   try
00219     {
00220       // Invoke the skeleton, it will demarshal the arguments, invoke
00221       // the right operation on the skeleton class, and marshal any
00222       // results.  De/marshaling will only occur in the uncollocated
00223       // case.
00224       skel (req, servant_upcall, derived_this);
00225 
00226       /*
00227        * Dispatch resolution specialization add hook.
00228        * Over-ridden with code to handle optimized dispatch.
00229        */
00230       //@@ TAO_DISPATCH_RESOLUTION_OPT_ADD_HOOK
00231 
00232       // It is our job to send the already marshaled reply, but only
00233       // send if it is expected and it has not already been sent
00234 
00235       // We send the reply only if it is NOT a SYNC_WITH_SERVER, a
00236       // response is expected and if the reply is not deferred.
00237       if (send_reply)
00238         {
00239           req.tao_send_reply ();
00240         }
00241     }
00242   catch (const ::CORBA::Exception& ex)
00243     {
00244       // If an exception was raised we should marshal it and send
00245       // the appropriate reply to the client
00246       if (send_reply)
00247         {
00248           if (req.collocated ())
00249             {
00250               // Report the exception to the collocated client.
00251               throw;
00252             }
00253           else
00254             req.tao_send_reply_exception (ex);
00255         }
00256     }
00257 
00258   return;
00259 }


Member Data Documentation

TAO_Operation_Table* TAO_ServantBase::optable_ [protected]
 

The operation table for this servant. It is initialized by the most derived class.

Definition at line 158 of file Servant_Base.h.

Referenced by _find(), and operator=().

ACE_Atomic_Op<TAO_SYNCH_MUTEX, long> TAO_ServantBase::ref_count_ [protected]
 

Reference counter.

Definition at line 154 of file Servant_Base.h.


The documentation for this class was generated from the following files:
Generated on Sun Jan 27 13:27:47 2008 for TAO_PortableServer by doxygen 1.3.6