#include <ServantRetentionStrategyRetain.h>


Definition at line 33 of file ServantRetentionStrategyRetain.h.
| TAO::Portable_Server::ServantRetentionStrategyRetain::ServantRetentionStrategyRetain | ( | void | ) |
Definition at line 16 of file ServantRetentionStrategyRetain.cpp.
: ServantRetentionStrategyRetain.cpp 88564 2010-01-15 09:56:57Z johnnyw $")
| PortableServer::ObjectId * TAO::Portable_Server::ServantRetentionStrategyRetain::activate_object | ( | PortableServer::Servant | servant, | |
| CORBA::Short | priority, | |||
| bool & | wait_occurred_restart_call | |||
| ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 678 of file ServantRetentionStrategyRetain.cpp.
:There is a possible deadlock lurking here. We held the
// lock, and we are possibly trying to make a call into the
// application code. Think what would happen if the app calls us
// back. We need to get to this at some point.
return this->poa_->invoke_key_to_object_helper_i (
servant->_interface_repository_id (), user_id);
}
PortableServer::ObjectId *
ServantRetentionStrategyRetain::activate_object (
PortableServer::Servant servant,
CORBA::Short priority,
bool &wait_occurred_restart_call)
{
if (!this->poa_->has_system_id ())
{
throw PortableServer::POA::WrongPolicy ();
}
bool may_activate =
this->poa_->is_servant_activation_allowed (servant, wait_occurred_restart_call);
if (!may_activate)
{
if (wait_occurred_restart_call)
{
return 0;
}
else
{
throw PortableServer::POA::ServantAlreadyActive ();
}
}
// Otherwise, the activate_object operation generates an Object Id
// and enters the Object Id and the specified servant in the Active
// Object Map. The Object Id is returned.
PortableServer::ObjectId_var user_id;
if (this->active_object_map_->
bind_using_system_id_returning_user_id (servant,
priority,
user_id.out ()) != 0)
{
throw ::CORBA::OBJ_ADAPTER ();
}
| void TAO::Portable_Server::ServantRetentionStrategyRetain::activate_object_with_id | ( | const PortableServer::ObjectId & | id, | |
| PortableServer::Servant | servant, | |||
| CORBA::Short | priority, | |||
| bool & | wait_occurred_restart_call | |||
| ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 737 of file ServantRetentionStrategyRetain.cpp.
: Trick locking here, see class header for details Non_Servant_Upcall non_servant_upcall (*this->poa_); ACE_UNUSED_ARG (non_servant_upcall); // The implementation of activate_object will invoke _add_ref at // least once on the Servant argument before returning. When the POA // no longer needs the Servant, it will invoke _remove_ref on it the // same number of times. servant->_add_ref (); return user_id._retn (); } void ServantRetentionStrategyRetain::activate_object_with_id ( const PortableServer::ObjectId &id, PortableServer::Servant servant, CORBA::Short priority, bool &wait_occurred_restart_call) { // If the POA has the SYSTEM_ID policy and it detects that the // Object Id value was not generated by the system or for this POA, // the activate_object_with_id operation may raise the BAD_PARAM // system exception. An ORB is not required to detect all such // invalid Object Id values, but a portable application must not // invoke activate_object_with_id on a POA that has the SYSTEM_ID // policy with an Object Id value that was not previously generated // by the system for that POA, or, if the POA also has the // PERSISTENT policy, for a previous instantiation of the same POA. if (this->poa_->has_system_id () && !this->poa_->is_poa_generated_id (id)) { throw ::CORBA::BAD_PARAM (); } // If the CORBA object denoted by the Object Id value is already // active in this POA (there is a servant bound to it in the Active // Object Map), the ObjectAlreadyActive exception is raised. bool priorities_match = true; bool result = this->is_user_id_in_map (id, priority, priorities_match, wait_occurred_restart_call); // @johnny the implementation is not complete, this does the spec also say // If the POA has the UNIQUE_ID policy and the servant is already // in the Active Object Map, the ServantAlreadyActive exception is raised. if (result) { throw PortableServer::POA::ObjectAlreadyActive (); } else if (wait_occurred_restart_call) { // We ended up waiting on a condition variable, the POA state // may have changed while we are waiting. Therefore, we need to // restart this call. return; } // If the activate_object_with_id_and_priority operation is invoked // with a different priority to an earlier invocation of one of the // create reference with priority operations, for the same object, // then the ORB shall raise a BAD_INV_ORDER system exception (with a // Standard Minor Exception Code of 1). If the priority value is the // same then the ORB shall return SUCCESS. if (!priorities_match) { throw ::CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 1, CORBA::COMPLETED_NO); } bool const may_activate = this->poa_->is_servant_activation_allowed (servant, wait_occurred_restart_call); if (!may_activate) { if (wait_occurred_restart_call) { return; } else { throw PortableServer::POA::ServantAlreadyActive (); } } // Otherwise, the activate_object_with_id operation enters an // association between the specified Object Id and the specified // servant in the Active Object Map. if (this->active_object_map_->bind_using_user_id (servant, id, priority) != 0) { throw ::CORBA::OBJ_ADAPTER ();
| CORBA::Object_ptr TAO::Portable_Server::ServantRetentionStrategyRetain::create_reference | ( | const char * | intf, | |
| CORBA::Short | priority | |||
| ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 840 of file ServantRetentionStrategyRetain.cpp.
: Trick locking here, see class header for details Non_Servant_Upcall non_servant_upcall (*this->poa_); ACE_UNUSED_ARG (non_servant_upcall); // The implementation of activate_object_with_id will invoke // _add_ref at least once on the Servant argument before // returning. When the POA no longer needs the Servant, it will // invoke _remove_ref on it the same number of times. servant->_add_ref (); } CORBA::Object_ptr ServantRetentionStrategyRetain::create_reference ( const char *intf, CORBA::Short priority) { // This operation creates an object reference that encapsulates a // POA-generated Object Id value and the specified interface // repository id. This operation does not cause an activation to // take place. The resulting reference may be passed to clients, so // that subsequent requests on those references will cause the // appropriate servant manager to be invoked, if one is // available. The generated Object Id value may be obtained by // invoking POA::reference_to_id with the created reference. PortableServer::ObjectId_var system_id; PortableServer::ObjectId user_id; if (this->active_object_map_-> bind_using_system_id_returning_system_id (0, priority, system_id.out ()) != 0) { throw ::CORBA::OBJ_ADAPTER (); }
| CORBA::Object_ptr TAO::Portable_Server::ServantRetentionStrategyRetain::create_reference_with_id | ( | const PortableServer::ObjectId & | oid, | |
| const char * | intf, | |||
| CORBA::Short | priority | |||
| ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 886 of file ServantRetentionStrategyRetain.cpp.
{
throw ::CORBA::OBJ_ADAPTER ();
}
// Remember params for potentially invoking <key_to_object> later.
this->poa_->key_to_object_params_.set (system_id,
intf,
0,
1,
priority,
true);
return this->poa_->invoke_key_to_object_helper_i (intf,
user_id);
}
#if !defined (CORBA_E_MICRO)
CORBA::Object_ptr
ServantRetentionStrategyRetain::create_reference_with_id (
const PortableServer::ObjectId &oid,
const char *intf,
CORBA::Short priority)
{
// This operation creates an object reference that encapsulates the
// specified Object Id and interface repository Id values. This
// operation does not cause an activation to take place. The
// resulting reference may be passed to clients, so that subsequent
// requests on those references will cause the object to be
// activated if necessary, or the default servant used, depending on
// the applicable policies.
PortableServer::Servant servant = 0;
PortableServer::ObjectId_var system_id;
// @@ We need something that can find the system id using
// appropriate strategy, at the same time, return the servant if
// one is available. Before we have that function,
// <create_reference_with_id_i> basically generates broken
| void TAO::Portable_Server::ServantRetentionStrategyRetain::deactivate_all_objects | ( | void | ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 431 of file ServantRetentionStrategyRetain.cpp.
{
return 1;
}
}
}
CORBA::ULong
ServantRetentionStrategyRetain::waiting_servant_deactivation (void) const
{
return waiting_servant_deactivation_;
}
void
ServantRetentionStrategyRetain::deactivate_all_objects (void)
{
// If the etherealize_objects parameter is TRUE, the POA has the
// RETAIN policy, and a servant manager is registered with the POA,
// the etherealize operation on the servant manager will be called
// for each active object in the Active Object Map. The apparent
// destruction of the POA occurs before any calls to etherealize are
// made. Thus, for example, an etherealize method that attempts to
// invoke operations on the POA will receive the OBJECT_NOT_EXIST
// exception.
// We must copy the map entries into a separate place since we
// cannot remove entries while iterating through the map.
ACE_Array_Base<TAO_Active_Object_Map_Entry *> map_entries
(this->active_object_map_->current_size ());
size_t counter = 0;
TAO_Active_Object_Map::user_id_map::iterator end
= this->active_object_map_->user_id_map_->end ();
for (TAO_Active_Object_Map::user_id_map::iterator iter
= this->active_object_map_->user_id_map_->begin ();
| void TAO::Portable_Server::ServantRetentionStrategyRetain::deactivate_map_entry | ( | TAO_Active_Object_Map_Entry * | active_object_map_entry | ) | [protected] |
Definition at line 74 of file ServantRetentionStrategyRetain.cpp.
{
TAO_Active_Object_Map_Entry *active_object_map_entry = 0;
int const result = this->active_object_map_->
find_entry_using_user_id (id, active_object_map_entry);
// If there is no active object associated with the specified Object
// Id, the operation raises an ObjectNotActive exception.
if (result != 0)
{
throw PortableServer::POA::ObjectNotActive ();
}
this->deactivate_map_entry (active_object_map_entry);
}
void
ServantRetentionStrategyRetain::deactivate_map_entry (
TAO_Active_Object_Map_Entry *active_object_map_entry)
{
// Decrement the reference count.
CORBA::UShort const new_count = --active_object_map_entry->reference_count_;
// Inform the custom servant dispatching (CSD) strategy that the
// servant is deactivated. This would be called just once when the
// servant is deactivated the first time.
if (active_object_map_entry->deactivated_ == 0)
{
this->poa_->servant_deactivated_hook (
active_object_map_entry->servant_,
active_object_map_entry->user_id_);
}
if (new_count == 0)
| void TAO::Portable_Server::ServantRetentionStrategyRetain::deactivate_object | ( | const PortableServer::ObjectId & | id | ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 56 of file ServantRetentionStrategyRetain.cpp.
{
| PortableServer::Servant TAO::Portable_Server::ServantRetentionStrategyRetain::find_servant | ( | const PortableServer::ObjectId & | system_id | ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 120 of file ServantRetentionStrategyRetain.cpp.
{
return this->active_object_map_->unbind_using_user_id (user_id);
}
PortableServer::Servant
ServantRetentionStrategyRetain::find_servant (
const PortableServer::ObjectId &system_id)
{
// Find user id from system id.
PortableServer::ObjectId_var user_id;
if (active_object_map_->
find_user_id_using_system_id (system_id, user_id.out()) != 0)
{
throw ::CORBA::OBJ_ADAPTER ();
}
// This operation returns the active servant associated with the
| PortableServer::Servant TAO::Portable_Server::ServantRetentionStrategyRetain::find_servant | ( | const PortableServer::ObjectId & | system_id, | |
| TAO::Portable_Server::Servant_Upcall & | servant_upcall, | |||
| TAO::Portable_Server::POA_Current_Impl & | poa_current_impl | |||
| ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 255 of file ServantRetentionStrategyRetain.cpp.
{
// Success
return TAO_SERVANT_FOUND;
}
else
{
return TAO_SERVANT_NOT_FOUND;
}
}
PortableServer::Servant
ServantRetentionStrategyRetain::find_servant (
const PortableServer::ObjectId &system_id,
TAO::Portable_Server::Servant_Upcall &servant_upcall,
TAO::Portable_Server::POA_Current_Impl &poa_current_impl)
{
PortableServer::ObjectId user_id;
// If we have the RETAIN policy, convert/transform from system id to
// user id.
if (this->active_object_map_->
find_user_id_using_system_id (system_id,
user_id) != 0)
{
throw ::CORBA::OBJ_ADAPTER ();
}
poa_current_impl.object_id(user_id);
servant_upcall.user_id (&poa_current_impl.object_id());
// If the POA has the RETAIN policy, the POA looks in the Active
// Object Map to find if there is a servant associated with the
// Object Id value from the request. If such a servant exists, the
| int TAO::Portable_Server::ServantRetentionStrategyRetain::find_servant_priority | ( | const PortableServer::ObjectId & | system_id, | |
| CORBA::Short & | priority | |||
| ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 298 of file ServantRetentionStrategyRetain.cpp.
{
servant_upcall.active_object_map_entry (active_object_map_entry);
// Increment the reference count.
servant_upcall.increment_servant_refcount ();
}
return servant;
}
int
ServantRetentionStrategyRetain::find_servant_priority (
const PortableServer::ObjectId &system_id,
CORBA::Short &priority)
{
PortableServer::ObjectId user_id;
// If we have the RETAIN policy, convert/transform from system id to
// user id.
if (this->active_object_map_->
find_user_id_using_system_id (system_id,
user_id) != 0)
{
throw ::CORBA::OBJ_ADAPTER ();
}
| CORBA::Object_ptr TAO::Portable_Server::ServantRetentionStrategyRetain::id_to_reference | ( | const PortableServer::ObjectId & | id, | |
| bool | indirect | |||
| ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 188 of file ServantRetentionStrategyRetain.cpp.
{
// If the POA has the RETAIN policy and the specified ObjectId is in
// the Active Object Map, this operation returns the servant
// associated with that object in the Active Object Map.
PortableServer::Servant servant = 0;
if (this->active_object_map_->find_servant_using_user_id (id, servant) == -1)
{
throw PortableServer::POA::ObjectNotActive ();
}
return servant;
}
CORBA::Object_ptr
ServantRetentionStrategyRetain::id_to_reference (
const PortableServer::ObjectId &id,
bool indirect)
{
// If an object with the specified Object Id value is currently
// active, a reference encapsulating the information used to
// activate the object is returned.
PortableServer::ObjectId_var system_id;
PortableServer::Servant servant;
CORBA::Short priority;
if (this->active_object_map_->
find_servant_and_system_id_using_user_id (id,
servant,
system_id.out (),
| int TAO::Portable_Server::ServantRetentionStrategyRetain::is_servant_in_map | ( | PortableServer::Servant | servant, | |
| bool & | wait_occurred_restart_call | |||
| ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 334 of file ServantRetentionStrategyRetain.cpp.
{
priority = active_object_map_entry->priority_;
return 0;
}
return -1;
}
int
ServantRetentionStrategyRetain::is_servant_in_map (
PortableServer::Servant servant,
bool &wait_occurred_restart_call)
{
bool deactivated = false;
int servant_in_map =
this->active_object_map_->is_servant_in_map (servant, deactivated);
if (!servant_in_map)
{
return 0;
}
else
{
if (deactivated)
{
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("(%t) TAO_Root_POA::is_servant_in_map: waiting for servant to deactivate\n")));
// We are going to wait on this condition variable; the POA
| int TAO::Portable_Server::ServantRetentionStrategyRetain::is_user_id_in_map | ( | const PortableServer::ObjectId & | id, | |
| CORBA::Short | priority, | |||
| bool & | priorities_match, | |||
| bool & | wait_occurred_restart_call | |||
| ) | [protected] |
Definition at line 377 of file ServantRetentionStrategyRetain.cpp.
{
return 1;
}
}
}
int
ServantRetentionStrategyRetain::is_user_id_in_map (
const PortableServer::ObjectId &id,
CORBA::Short priority,
bool &priorities_match,
bool &wait_occurred_restart_call)
{
bool deactivated = false;
bool user_id_in_map =
this->active_object_map_->is_user_id_in_map (id,
priority,
priorities_match,
deactivated);
if (!user_id_in_map)
{
return 0;
}
else
{
if (deactivated)
{
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("(%t) TAO_Root_POA::is_user_id_in_map: waiting for servant to deactivate\n")));
// We are going to wait on this condition variable; the POA
| int TAO::Portable_Server::ServantRetentionStrategyRetain::rebind_using_user_id_and_system_id | ( | PortableServer::Servant | servant, | |
| const PortableServer::ObjectId & | user_id, | |||
| const PortableServer::ObjectId & | system_id, | |||
| TAO::Portable_Server::Servant_Upcall & | servant_upcall | |||
| ) | [protected, virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 929 of file ServantRetentionStrategyRetain.cpp.
{
throw ::CORBA::OBJ_ADAPTER ();
}
// Remember params for potentially invoking <key_to_object> later.
this->poa_->key_to_object_params_.set (system_id,
intf,
servant,
1,
priority,
true);
return this->poa_->invoke_key_to_object_helper_i (intf, oid);
| CORBA::Boolean TAO::Portable_Server::ServantRetentionStrategyRetain::servant_has_remaining_activations | ( | PortableServer::Servant | servant | ) | [protected, virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 947 of file ServantRetentionStrategyRetain.cpp.
| TAO_SERVANT_LOCATION TAO::Portable_Server::ServantRetentionStrategyRetain::servant_present | ( | const PortableServer::ObjectId & | system_id, | |
| PortableServer::Servant & | servant | |||
| ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 225 of file ServantRetentionStrategyRetain.cpp.
{
// If the Object Id value is not active in the POA, an
// ObjectNotActive exception is raised.
throw PortableServer::POA::ObjectNotActive ();
}
}
TAO_SERVANT_LOCATION
ServantRetentionStrategyRetain::servant_present (
const PortableServer::ObjectId &system_id,
PortableServer::Servant &servant)
{
// Find user id from system id.
PortableServer::ObjectId_var user_id;
if (this->active_object_map_->
find_user_id_using_system_id (system_id, user_id.out()) != 0)
| CORBA::Object_ptr TAO::Portable_Server::ServantRetentionStrategyRetain::servant_to_reference | ( | PortableServer::Servant | servant | ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 635 of file ServantRetentionStrategyRetain.cpp.
: Trick locking here, see class header for details Non_Servant_Upcall non_servant_upcall (*this->poa_); ACE_UNUSED_ARG (non_servant_upcall); // If this operation causes the object to be activated, _add_ref // is invoked at least once on the Servant argument before // returning. Otherwise, the POA does not increment or decrement // the reference count of the Servant passed to this function. servant->_add_ref (); return system_id._retn (); } // Otherwise, the ServantNotActive exception is raised. throw PortableServer::POA::ServantNotActive (); } CORBA::Object_ptr ServantRetentionStrategyRetain::servant_to_reference ( PortableServer::Servant servant) { // Note: The allocation of an Object Id value and installation in // the Active Object Map caused by implicit activation may actually // be deferred until an attempt is made to externalize the // reference. The real requirement here is that a reference is // produced that will behave appropriately (that is, yield a // consistent Object Id value when asked politely). CORBA::Short priority = this->poa_->server_priority (); PortableServer::ObjectId_var system_id = this->servant_to_system_id_i (servant, priority); PortableServer::ObjectId user_id; // This operation requires the RETAIN, therefore don't worry about // the NON_RETAIN case. if (this->active_object_map_-> find_user_id_using_system_id (system_id.in (), user_id) != 0) {
| PortableServer::ObjectId * TAO::Portable_Server::ServantRetentionStrategyRetain::servant_to_system_id_i | ( | PortableServer::Servant | p_servant, | |
| CORBA::Short & | priority | |||
| ) | [protected] |
Definition at line 557 of file ServantRetentionStrategyRetain.cpp.
: Trick locking here, see class header for details Non_Servant_Upcall non_servant_upcall (*this->poa_); ACE_UNUSED_ARG (non_servant_upcall); // If this operation causes the object to be activated, _add_ref // is invoked at least once on the Servant argument before // returning. Otherwise, the POA does not increment or decrement // the reference count of the Servant passed to this function. servant->_add_ref (); return user_id._retn (); } /* * Otherwise, the ServantNotActive exception is raised. */ throw PortableServer::POA::ServantNotActive (); } PortableServer::ObjectId * ServantRetentionStrategyRetain::servant_to_system_id_i ( PortableServer::Servant servant, CORBA::Short &priority) { // This operation requires the RETAIN and either the UNIQUE_ID or // IMPLICIT_ACTIVATION policies; if not present, the WrongPolicy // exception is raised. if (!((!this->poa_->allow_multiple_activations () || this->poa_->allow_implicit_activation ()))) { throw PortableServer::POA::WrongPolicy (); } // This operation has three possible behaviors. // If the POA has the UNIQUE_ID policy and the specified servant is // active, the Object Id associated with that servant is returned. PortableServer::ObjectId_var system_id; if (!this->poa_->allow_multiple_activations () && this->active_object_map_-> find_system_id_using_servant (servant, system_id.out (), priority) != -1) { return system_id._retn (); } #if defined (CORBA_E_COMPACT) || defined (CORBA_E_MICRO) // CORBA e does not allow implicit activation. // At this point we can throw the WrongPolicy exception. throw PortableServer::POA::WrongPolicy (); #endif /* CORBA_E_COMPACT || CORBA_E_MICRO */ // If the POA has the IMPLICIT_ACTIVATION policy and either the POA // has the MULTIPLE_ID policy or the specified servant is not // active, the servant is activated using a POA-generated Object Id // and the Interface Id associated with the servant, and that Object // Id is returned. if (this->poa_->allow_implicit_activation ()) { // If we reach here, then we either have the MULTIPLE_ID policy // or we have the UNIQUE_ID policy and we are not in the active // object map. PortableServer::ObjectId_var system_id; if (this->active_object_map_-> bind_using_system_id_returning_system_id (servant, priority, system_id.out ()) != 0) { throw ::CORBA::OBJ_ADAPTER (); } // // Everything is finally ok //
| PortableServer::ObjectId * TAO::Portable_Server::ServantRetentionStrategyRetain::servant_to_user_id | ( | PortableServer::Servant | servant | ) | [virtual] |
If the POA has both the RETAIN and the UNIQUE_ID policy and the specified servant is active, the Object Id associated with that servant is returned.
If the POA has both the RETAIN and the IMPLICIT_ACTIVATION policy and either the POA has the MULTIPLE_ID policy or the specified servant is not active, the servant is activated using a POA-generated Object Id and the Interface Id associated with the servant, and that Object Id is returned.
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 475 of file ServantRetentionStrategyRetain.cpp.
{
TAO_Active_Object_Map::user_id_map::value_type map_pair = *iter;
TAO_Active_Object_Map_Entry *active_object_map_entry = map_pair.second ();
if (!active_object_map_entry->deactivated_)
{
map_entries[counter] = active_object_map_entry;
++counter;
}
}
for (size_t i = 0;
i < counter;
++i)
{
this->deactivate_map_entry (map_entries[i]);
}
}
PortableServer::ObjectId *
ServantRetentionStrategyRetain::servant_to_user_id (
PortableServer::Servant servant)
{
// This operation requires the RETAIN and either the UNIQUE_ID or
// IMPLICIT_ACTIVATION policies; if not present, the WrongPolicy
// exception is raised.
if (!((!this->poa_->allow_multiple_activations ()
|| this->poa_->allow_implicit_activation ())))
{
throw PortableServer::POA::WrongPolicy ();
}
/**
* If the POA has both the RETAIN and the UNIQUE_ID policy and the
* specified servant is active, the Object Id associated with that
* servant is returned.
*
* If the POA has both the RETAIN and the IMPLICIT_ACTIVATION policy and
* either the POA has the MULTIPLE_ID policy or the specified servant is
* not active, the servant is activated using a POA-generated Object Id
* and the Interface Id associated with the servant, and that Object Id
* is returned.
*
*/
// If the POA has the UNIQUE_ID policy and the specified servant is
// active, the Object Id associated with that servant is returned.
PortableServer::ObjectId_var user_id;
if (!this->poa_->allow_multiple_activations () &&
this->active_object_map_->
find_user_id_using_servant (servant, user_id.out ()) != -1)
{
return user_id._retn ();
}
// If the POA has the IMPLICIT_ACTIVATION policy and either the POA
// has the MULTIPLE_ID policy or the specified servant is not
// active, the servant is activated using a POA-generated Object Id
// and the Interface Id associated with the servant, and that Object
// Id is returned.
if (this->poa_->allow_implicit_activation ())
{
// If we reach here, then we either have the MULTIPLE_ID policy
// or we have the UNIQUE_ID policy and we are not in the active
// object map.
PortableServer::ObjectId_var user_id;
if (this->active_object_map_->
bind_using_system_id_returning_user_id (servant,
this->poa_->server_priority (),
user_id.out ()) != 0)
{
throw ::CORBA::OBJ_ADAPTER ();
}
//
// Everything is finally ok
//
// Inform the custom servant dispatching (CSD) strategy that the
// sevant is activated.
| void TAO::Portable_Server::ServantRetentionStrategyRetain::strategy_cleanup | ( | void | ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 51 of file ServantRetentionStrategyRetain.cpp.
| void TAO::Portable_Server::ServantRetentionStrategyRetain::strategy_init | ( | TAO_Root_POA * | poa | ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 24 of file ServantRetentionStrategyRetain.cpp.
: ServantRetentionStrategyRetain.cpp 88564 2010-01-15 09:56:57Z johnnyw $") TAO_BEGIN_VERSIONED_NAMESPACE_DECL namespace TAO { namespace Portable_Server { ServantRetentionStrategyRetain::ServantRetentionStrategyRetain (void) : ServantRetentionStrategyNonRetain (), active_object_map_ (), waiting_servant_deactivation_ (0) { } void ServantRetentionStrategyRetain::strategy_init (TAO_Root_POA *poa) { poa_ = poa; // Create the active object map to be used
| PortableServer::ObjectId * TAO::Portable_Server::ServantRetentionStrategyRetain::system_id_to_object_id | ( | const PortableServer::ObjectId & | system_id | ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 154 of file ServantRetentionStrategyRetain.cpp.
{
throw PortableServer::POA::ObjectNotActive ();
}
| PortableServer::ServantRetentionPolicyValue TAO::Portable_Server::ServantRetentionStrategyRetain::type | ( | void | ) | const [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 955 of file ServantRetentionStrategyRetain.cpp.
| int TAO::Portable_Server::ServantRetentionStrategyRetain::unbind_using_user_id | ( | const PortableServer::ObjectId & | user_id | ) | [protected, virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 113 of file ServantRetentionStrategyRetain.cpp.
{
// It should be noted that there may be a period of time between
| PortableServer::Servant TAO::Portable_Server::ServantRetentionStrategyRetain::user_id_to_servant | ( | const PortableServer::ObjectId & | id | ) | [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 171 of file ServantRetentionStrategyRetain.cpp.
{
// The object denoted by the reference does not have to be
// active for this operation to succeed.
PortableServer::ObjectId_var user_id;
if (this->active_object_map_->
find_user_id_using_system_id (system_id,
user_id.out ()) != 0)
{
throw ::CORBA::OBJ_ADAPTER ();
}
| CORBA::ULong TAO::Portable_Server::ServantRetentionStrategyRetain::waiting_servant_deactivation | ( | void | ) | const [virtual] |
Reimplemented from TAO::Portable_Server::ServantRetentionStrategyNonRetain.
Definition at line 425 of file ServantRetentionStrategyRetain.cpp.
{
auto_ptr<TAO_Active_Object_Map> TAO::Portable_Server::ServantRetentionStrategyRetain::active_object_map_ [private] |
Definition at line 142 of file ServantRetentionStrategyRetain.h.
CORBA::ULong TAO::Portable_Server::ServantRetentionStrategyRetain::waiting_servant_deactivation_ [private] |
Definition at line 143 of file ServantRetentionStrategyRetain.h.
1.7.0