#include <POAManager.h>


Public Member Functions | |
| void | activate (void) |
| void | hold_requests (CORBA::Boolean wait_for_completion) |
| void | discard_requests (CORBA::Boolean wait_for_completion) |
| void | deactivate (CORBA::Boolean etherealize_objects, CORBA::Boolean wait_for_completion) |
| PortableServer::POAManager::State | get_state (void) |
| char * | get_id (void) |
| TAO_POA_Manager (TAO_Object_Adapter &object_adapter, const char *id, const ::CORBA::PolicyList &policies, PortableServer::POAManagerFactory_ptr poa_manager_factory) | |
| ~TAO_POA_Manager (void) | |
| void | check_state (void) |
| Check the state of this POA manager. | |
| PortableServer::POAManager::State | get_state_i () |
| virtual CORBA::ORB_ptr | _get_orb (void) |
| Determine if we are of the type specified by the "logical_type_id". | |
| CORBA::PolicyList & | get_policies (void) |
Protected Types | |
| typedef ACE_Unbounded_Set < TAO_Root_POA * > | POA_COLLECTION |
Protected Member Functions | |
| void | activate_i (void) |
| void | deactivate_i (CORBA::Boolean etherealize_objects, CORBA::Boolean wait_for_completion) |
| void | adapter_manager_state_changed (PortableServer::POAManager::State state) |
| void | hold_requests_i (CORBA::Boolean wait_for_completion) |
| void | discard_requests_i (CORBA::Boolean wait_for_completion) |
| ACE_Lock & | lock (void) |
| int | remove_poa (TAO_Root_POA *poa) |
| int | register_poa (TAO_Root_POA *poa) |
Protected Attributes | |
| PortableServer::POAManager::State | state_ |
| ACE_Lock & | lock_ |
| POA_COLLECTION | poa_collection_ |
| TAO_Object_Adapter & | object_adapter_ |
| CORBA::String_var | id_ |
| TAO_POAManager_Factory & | poa_manager_factory_ |
| CORBA::PolicyList | policies_ |
Private Member Functions | |
| char * | generate_manager_id (void) const |
Friends | |
| class | TAO_Root_POA |
| class | TAO_Object_Adapter |
Definition at line 56 of file POAManager.h.
typedef ACE_Unbounded_Set<TAO_Root_POA *> TAO_POA_Manager::POA_COLLECTION [protected] |
Definition at line 135 of file POAManager.h.
| TAO_POA_Manager::TAO_POA_Manager | ( | TAO_Object_Adapter & | object_adapter, | |
| const char * | id, | |||
| const ::CORBA::PolicyList & | policies, | |||
| PortableServer::POAManagerFactory_ptr | poa_manager_factory | |||
| ) |
Definition at line 21 of file POAManager.cpp.
: state_ (PortableServer::POAManager::HOLDING), lock_ (object_adapter.lock ()), poa_collection_ (), object_adapter_ (object_adapter), #if (TAO_HAS_MINIMUM_POA == 0) && !defined (CORBA_E_COMPACT) && !defined (CORBA_E_MICRO) id_ (id == 0 ? this->generate_manager_id () : CORBA::string_dup (id)), poa_manager_factory_ (* dynamic_cast <TAO_POAManager_Factory*> (poa_manager_factory)), policies_ (policies) { poa_manager_factory_._add_ref (); }
| TAO_POA_Manager::~TAO_POA_Manager | ( | void | ) |
Definition at line 48 of file POAManager.cpp.
{
#if (TAO_HAS_MINIMUM_POA == 0) && !defined (CORBA_E_COMPACT) && !defined (CORBA_E_MICRO)
poa_manager_factory_._remove_ref ();
#endif
}
| CORBA::ORB_ptr TAO_POA_Manager::_get_orb | ( | void | ) | [virtual] |
Determine if we are of the type specified by the "logical_type_id".
Reimplemented from CORBA::LocalObject.
Definition at line 379 of file POAManager.cpp.
{
return CORBA::ORB::_duplicate (this->object_adapter_.orb_core ().orb ());
}
| void TAO_POA_Manager::activate | ( | void | ) |
Definition at line 17 of file POAManager.inl.
{
// Lock access to the POAManager for the duration of this transaction
TAO_OBJECT_ADAPTER_GUARD;
this->activate_i ();
}
| void TAO_POA_Manager::activate_i | ( | void | ) | [protected] |
Definition at line 62 of file POAManager.cpp.
{
// This operation changes the state of the POA manager to active. If
// issued while the POA manager is in the inactive state, the
// AdapterInactive exception is raised. Entering the active state
// enables the associated POAs to process requests.
if (this->state_ == PortableServer::POAManager::INACTIVE)
{
throw PortableServer::POAManager::AdapterInactive ();
}
else
{
this->state_ = PortableServer::POAManager::ACTIVE;
// Find the poas that applied the custom servant dispatching
// strategy to launch the dispatching threads.
for (POA_COLLECTION::iterator iterator = this->poa_collection_.begin ();
iterator != this->poa_collection_.end ();
++iterator)
{
(*iterator)->poa_activated_hook ();
}
}
this->adapter_manager_state_changed (this->state_);
}
| void TAO_POA_Manager::adapter_manager_state_changed | ( | PortableServer::POAManager::State | state | ) | [protected] |
Method needed for notifying the IORInterceptors that the state of POAManager changed.
Definition at line 160 of file POAManager.cpp.
{
PortableInterceptor::AdapterState adapter_state =
static_cast<PortableInterceptor::AdapterState> (state);
TAO_IORInterceptor_Adapter *ior_adapter =
this->object_adapter_.orb_core ().ior_interceptor_adapter ();
if (ior_adapter)
{
ior_adapter->adapter_manager_state_changed (this->id_.in (),
adapter_state);
}
}
| void TAO_POA_Manager::check_state | ( | void | ) |
Check the state of this POA manager.
Definition at line 313 of file POAManager.cpp.
{
if (state_ == PortableServer::POAManager::ACTIVE)
{
// When a POA manager is in the active state, the associated
// POAs will receive and start processing requests (assuming
// that appropriate thread resources are available).
return;
}
if (state_ == PortableServer::POAManager::DISCARDING)
{
// When a POA manager is in the discarding state, the associated
// POAs will discard all incoming requests (whose processing has
// not yet begun). When a request is discarded, the TRANSIENT
// system exception, with standard minor code 1, must be
// returned to the client-side to indicate that the request
// should be re-issued. (Of course, an ORB may always reject a
// request for other reasons and raise some other system
// exception.)
throw
CORBA::TRANSIENT (
CORBA::SystemException::_tao_minor_code (
TAO_POA_DISCARDING,
1),
CORBA::COMPLETED_NO);
}
if (state_ == PortableServer::POAManager::HOLDING)
{
// When a POA manager is in the holding state, the associated
// POAs will queue incoming requests. The number of requests
// that can be queued is an implementation limit. If this limit
// is reached, the POAs may discard requests and return the
// TRANSIENT system exception, with standard minor code 1, to
// the client to indicate that the client should reissue the
// request. (Of course, an ORB may always reject a request for
// other reasons and raise some other system exception.)
// Since there is no queuing in TAO, we immediately raise a
// TRANSIENT exception.
throw ::CORBA::TRANSIENT (
CORBA::SystemException::_tao_minor_code (TAO_POA_HOLDING, 1),
CORBA::COMPLETED_NO);
}
if (state_ == PortableServer::POAManager::INACTIVE)
{
// The inactive state is entered when the associated POAs are to
// be shut down. Unlike the discarding state, the inactive state
// is not a temporary state. When a POA manager is in the
// inactive state, the associated POAs will reject new
// requests. The rejection mechanism used is specific to the
// vendor. The GIOP location forwarding mechanism and
// CloseConnection message are examples of mechanisms that could
// be used to indicate the rejection. If the client is
// co-resident in the same process, the ORB could raise the
// OBJ_ADAPTER system exception, with standard minor code 1, to
// indicate that the object implementation is unavailable.
throw ::CORBA::OBJ_ADAPTER (
CORBA::SystemException::_tao_minor_code (TAO_POA_INACTIVE, 1),
CORBA::COMPLETED_NO);
}
}
| void TAO_POA_Manager::deactivate | ( | CORBA::Boolean | etherealize_objects, | |
| CORBA::Boolean | wait_for_completion | |||
| ) |
Definition at line 46 of file POAManager.inl.
{
// Lock access to the POAManager for the duration of this transaction
TAO_OBJECT_ADAPTER_GUARD;
this->deactivate_i (etherealize_objects, wait_for_completion);
}
| void TAO_POA_Manager::deactivate_i | ( | CORBA::Boolean | etherealize_objects, | |
| CORBA::Boolean | wait_for_completion | |||
| ) | [protected] |
Definition at line 91 of file POAManager.cpp.
{
// Is the @a wait_for_completion semantics for this thread correct?
TAO_Root_POA::check_for_valid_wait_for_completions (this->object_adapter_.orb_core (),
wait_for_completion);
// This operation changes the state of the POA manager to
// inactive. If issued while the POA manager is in the inactive
// state, this operation has not effect. Entering the
// inactive state causes the associated POAs to reject requests that
// have not begun to be executed as well as any new requests.
if (this->state_ == PortableServer::POAManager::INACTIVE)
{
return;
}
else
{
this->state_ = PortableServer::POAManager::INACTIVE;
}
// After changing the state, if the etherealize_objects parameter is:
//
// a) TRUE - the POA manager will cause all associated POAs that
// have the RETAIN and USE_SERVANT_MANAGER policies to perform the
// etherealize operation on the associated servant manager for all
// active objects.
//
// b) FALSE - the etherealize operation is not called. The purpose
// is to provide developers with a means to shut down POAs in a
// crisis (for example, unrecoverable error) situation.
// If the wait_for_completion parameter is FALSE, this operation
// will return immediately after changing the state. If the
// parameter is TRUE and the current thread is not in an invocation
// context dispatched by some POA belonging to the same ORB as this
// POA, this operation does not return until there are no actively
// executing requests in any of the POAs associated with this POA
// manager (that is, all requests that were started prior to the
// state change have completed) and, in the case of a TRUE
// etherealize_objects, all invocations of etherealize have
// completed for POAs having the RETAIN and USE_SERVANT_MANAGER
// policies. If the parameter is TRUE and the current thread is in
// an invocation context dispatched by some POA belonging to the
// same ORB as this POA the BAD_INV_ORDER exception is raised and
// the state is not changed.
for (POA_COLLECTION::iterator iterator = this->poa_collection_.begin ();
iterator != this->poa_collection_.end ();
++iterator)
{
TAO_Root_POA *poa = *iterator;
// Notify the poas that applied the custom servant dispatching
// strategy to stop the dispatching threads.
poa->poa_deactivated_hook ();
poa->deactivate_all_objects_i (etherealize_objects, wait_for_completion);
}
// If the ORB::shutdown operation is called, it makes a call on
// deactivate with a TRUE etherealize_objects parameter for each POA
// manager known in the process; the wait_for_completion parameter
// to deactivate will be the same as the similarly named parameter
// of ORB::shutdown.
this->adapter_manager_state_changed (this->state_);
}
| void TAO_POA_Manager::discard_requests | ( | CORBA::Boolean | wait_for_completion | ) |
Definition at line 37 of file POAManager.inl.
{
// Lock access to the POAManager for the duration of this transaction
TAO_OBJECT_ADAPTER_GUARD;
this->discard_requests_i (wait_for_completion);
}
| void TAO_POA_Manager::discard_requests_i | ( | CORBA::Boolean | wait_for_completion | ) | [protected] |
Definition at line 229 of file POAManager.cpp.
{
// Is the <wait_for_completion> semantics for this thread correct?
TAO_Root_POA::check_for_valid_wait_for_completions (this->object_adapter_.orb_core (),
wait_for_completion);
// This operation changes the state of the POA manager to
// discarding. If issued while the POA manager is in the inactive
// state, the AdapterInactive exception is raised. Entering the
// discarding state causes the associated POAs to discard incoming
// requests. In addition, any requests that have been queued but
// have not started executing are discarded. When a request is
// discarded, a TRANSIENT system exception is returned to the
// client.
if (this->state_ == PortableServer::POAManager::INACTIVE)
{
throw PortableServer::POAManager::AdapterInactive ();
}
else
{
this->state_ = PortableServer::POAManager::DISCARDING;
}
// If the wait_for_completion parameter is FALSE, this operation
// returns immediately after changing the state. If the
// parameter is TRUE and the current thread is not in an
// invocation context dispatched by some POA belonging to the
// same ORB as this POA, this operation does not return until
// either there are no actively executing requests in any of the
// POAs associated with this POA manager (that is, all requests
// that were started prior to the state change have completed)
// or the state of the POA manager is changed to a state other
// than discarding. If the parameter is TRUE and the current
// thread is in an invocation context dispatched by some POA
// belonging to the same ORB as this POA the BAD_INV_ORDER
// exception is raised and the state is not changed.
if (wait_for_completion)
{
for (POA_COLLECTION::iterator iterator = this->poa_collection_.begin ();
iterator != this->poa_collection_.end ();
++iterator)
{
TAO_Root_POA *poa = *iterator;
poa->wait_for_completions (wait_for_completion);
}
}
this->adapter_manager_state_changed (this->state_);
}
| char * TAO_POA_Manager::generate_manager_id | ( | void | ) | const [private] |
Generate an id for this POAManager.
Definition at line 73 of file POAManager.inl.
{
// The AdapterManagerId must be unique across all Adapter Managers
// (e.g. POAManagers) within a given process. To avoid locking
// overhead, the address of the POAManager object is used as the
// AdapterManagerId. This guarantees that the AdapterManagerId is
// unique.
//
// For 64-bit platforms, only the lower 32 bits are used. Hopefully
// that will be enough to ensure uniqueness.
// This is basically the same trick used in
// TAO_GIOP_Invocation::generate_request_id(). However, no right
// shifting of 64 bit addresses is performed since the
// TAO_POA_Manager object is not large enough to allow that trick.
CORBA::Long id = 0;
// Note that we reinterpret_cast to an "unsigned long" instead of
// CORBA::ULong since we need to first cast to an integer large
// enough to hold an address to avoid compile-time warnings on some
// 64-bit platforms.
if (sizeof (this) == 4) // 32 bit address
id = reinterpret_cast <ptrdiff_t> (this);
else if (sizeof (this) == 8) // 64 bit address -- use lower 32 bits
id = reinterpret_cast <ptrdiff_t> (this) & 0xFFFFFFFFu;
// @@ If we ever hit a platform where neither of the above cases are
// satisfied, we're up the creek!
// else
// // Fallback on an atomically incremented variable specific to the
// // ORB, or perhaps specific to the process.
// id = ...GENERATE_ID_ATOMICALLY...; // Fallback
char* buf = new char [25];
ACE_OS::sprintf (buf, "POAManager%d", id);
return buf;
}
| char * TAO_POA_Manager::get_id | ( | void | ) |
Definition at line 56 of file POAManager.cpp.
{
return CORBA::string_dup (this->id_.in ());
}
| CORBA::PolicyList & TAO_POA_Manager::get_policies | ( | void | ) |
Definition at line 119 of file POAManager.inl.
{
return this->policies_;
}
| PortableServer::POAManager::State TAO_POA_Manager::get_state | ( | void | ) |
Definition at line 64 of file POAManager.inl.
{
// Lock access to the POAManager for the duration of this transaction
TAO_OBJECT_ADAPTER_GUARD_RETURN (this->state_);
return this->get_state_i ();
}
| PortableServer::POAManager::State TAO_POA_Manager::get_state_i | ( | void | ) |
Definition at line 58 of file POAManager.inl.
{
return this->state_;
}
| void TAO_POA_Manager::hold_requests | ( | CORBA::Boolean | wait_for_completion | ) |
Definition at line 28 of file POAManager.inl.
{
// Lock access to the POAManager for the duration of this transaction
TAO_OBJECT_ADAPTER_GUARD;
this->hold_requests_i (wait_for_completion);
}
| void TAO_POA_Manager::hold_requests_i | ( | CORBA::Boolean | wait_for_completion | ) | [protected] |
Definition at line 178 of file POAManager.cpp.
{
// Is the <wait_for_completion> semantics for this thread correct?
TAO_Root_POA::check_for_valid_wait_for_completions (this->object_adapter_.orb_core (),
wait_for_completion);
// This operation changes the state of the POA manager to
// holding. If issued while the POA manager is in the inactive
// state, the AdapterInactive exception is raised. Entering the
// holding state causes the associated POAs to queue incoming
// requests. Any requests that have been queued but have not
// started executing will continue to be queued while in the holding
// state.
if (this->state_ == PortableServer::POAManager::INACTIVE)
{
throw PortableServer::POAManager::AdapterInactive ();
}
else
{
this->state_ = PortableServer::POAManager::HOLDING;
}
// If the wait_for_completion parameter is FALSE, this operation
// returns immediately after changing the state. If the parameter is
// TRUE and the current thread is not in an invocation context
// dispatched by some POA belonging to the same ORB as this POA,
// this operation does not return until either there are no actively
// executing requests in any of the POAs associated with this POA
// manager (that is, all requests that were started prior to the
// state change have completed) or the state of the POA manager is
// changed to a state other than holding. If the parameter is TRUE
// and the current thread is in an invocation context dispatched by
// some POA belonging to the same ORB as this POA the BAD_INV_ORDER
// exception is raised and the state is not changed.
if (wait_for_completion)
{
for (POA_COLLECTION::iterator iterator = this->poa_collection_.begin ();
iterator != this->poa_collection_.end ();
++iterator)
{
TAO_Root_POA *poa = *iterator;
poa->wait_for_completions (wait_for_completion);
}
}
this->adapter_manager_state_changed (this->state_);
}
| ACE_Lock & TAO_POA_Manager::lock | ( | void | ) | [protected] |
Definition at line 11 of file POAManager.inl.
{
return this->lock_;
}
| int TAO_POA_Manager::register_poa | ( | TAO_Root_POA * | poa | ) | [protected] |
Definition at line 307 of file POAManager.cpp.
{
return this->poa_collection_.insert (poa);
}
| int TAO_POA_Manager::remove_poa | ( | TAO_Root_POA * | poa | ) | [protected] |
Definition at line 284 of file POAManager.cpp.
{
int const result = this->poa_collection_.remove (poa);
// The #if really only needs to go around the
// "this->poa_manager_factory_.remove_poamanager (this);" line, but it's
// moved out as an optimization for now. If additional non-CORBA/e and
// non-minimum POA code needs to go in that clause the #if would have to
// move back in.
#if (TAO_HAS_MINIMUM_POA == 0) && !defined (CORBA_E_COMPACT) && !defined (CORBA_E_MICRO)
if (result == 0)
{
if (this->poa_collection_.is_empty ())
{
this->poa_manager_factory_.remove_poamanager (this);
}
}
#endif
return result;
}
friend class TAO_Object_Adapter [friend] |
Definition at line 61 of file POAManager.h.
friend class TAO_Root_POA [friend] |
Definition at line 60 of file POAManager.h.
CORBA::String_var TAO_POA_Manager::id_ [protected] |
Definition at line 141 of file POAManager.h.
ACE_Lock& TAO_POA_Manager::lock_ [protected] |
Definition at line 133 of file POAManager.h.
TAO_Object_Adapter& TAO_POA_Manager::object_adapter_ [protected] |
Definition at line 139 of file POAManager.h.
POA_COLLECTION TAO_POA_Manager::poa_collection_ [protected] |
Definition at line 137 of file POAManager.h.
Definition at line 145 of file POAManager.h.
CORBA::PolicyList TAO_POA_Manager::policies_ [protected] |
Definition at line 146 of file POAManager.h.
PortableServer::POAManager::State TAO_POA_Manager::state_ [protected] |
Definition at line 131 of file POAManager.h.
1.7.0