poa.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 1,826 行 · 第 1/5 页
CPP
1,826 行
delete this->single_threaded_lock_;
}
void
TAO_POA::complete_destruction_i (ACE_ENV_SINGLE_ARG_DECL)
{
// No longer awaiting destruction.
this->waiting_destruction_ = 0;
// Delete the active object map.
delete this->active_object_map_;
// Remove POA from the POAManager.
int result = this->poa_manager_.remove_poa (this);
if (result != 0)
ACE_THROW (CORBA::OBJ_ADAPTER ());
// Remove POA from the Object Adapter.
result = this->object_adapter ().unbind_poa (this,
this->folded_name_,
this->system_name_.in ());
if (result != 0)
ACE_THROW (CORBA::OBJ_ADAPTER ());
// Forced cleanup. The new memory management scheme is evil and can
// lead to reference deadlock, i.e., POA holds object A, but POA
// cannot die because object A hold POA.
{
// A recursive thread lock without using a recursive thread lock.
// Non_Servant_Upcall has a magic constructor and destructor. We
// unlock the Object_Adapter lock for the duration of the servant
// activator upcalls; reacquiring once the upcalls complete. Even
// though we are releasing the lock, other threads will not be
// able to make progress since
// <Object_Adapter::non_servant_upcall_in_progress_> has been set.
//
// If new things are added to this cleanup code, make sure to move
// the minimum CORBA #define after the declaration of
// <non_servant_upcall>.
//
#if (TAO_HAS_MINIMUM_POA == 0)
TAO_Object_Adapter::Non_Servant_Upcall non_servant_upcall (*this);
ACE_UNUSED_ARG (non_servant_upcall);
this->adapter_activator_ = PortableServer::AdapterActivator::_nil ();
this->servant_activator_ = PortableServer::ServantActivator::_nil ();
this->servant_locator_ = PortableServer::ServantLocator::_nil ();
this->default_servant_ = 0;
#endif /* TAO_HAS_MINIMUM_POA == 0 */
}
CORBA::release (this);
}
PortableServer::POA_ptr
TAO_POA::create_POA_i (const char *adapter_name,
PortableServer::POAManager_ptr poa_manager,
const CORBA::PolicyList &policies
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
PortableServer::POA::AdapterAlreadyExists,
PortableServer::POA::InvalidPolicy))
{
// Initialize a TAO_POA_Policy_Set instance so that it contains the
// default POA policies.
TAO_POA_Policy_Set tao_policies (this->object_adapter ().default_poa_policies ());
// Merge policies from the ORB level.
this->object_adapter ().validator ().merge_policies (tao_policies.policies ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (PortableServer::POA::_nil ());
// Merge in any policies that the user may have specified.
tao_policies.merge_policies (policies
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (PortableServer::POA::_nil ());
// If any of the policy objects specified are not valid for the ORB
// implementation, if conflicting policy objects are specified, or
// if any of the specified policy objects require prior
// administrative action that has not been performed, an
// InvalidPolicy exception is raised containing the index in the
// policies parameter value of the first offending policy object.
tao_policies.validate_policies (this->object_adapter ().validator (),
this->orb_core_
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (PortableServer::POA::_nil ());
// If the poa_manager parameter is null, a new POAManager object is
// created and associated with the new POA. Otherwise, the specified
// POAManager object is associated with the new POA. The POAManager
// object can be obtained using the attribute name the_POAManager.
TAO_POA_Manager *tao_poa_manager = 0;
if (CORBA::is_nil (poa_manager))
{
ACE_NEW_THROW_EX (tao_poa_manager,
TAO_POA_Manager (this->object_adapter ()),
CORBA::NO_MEMORY ());
ACE_CHECK_RETURN (PortableServer::POA::_nil ());
}
else
{
tao_poa_manager = ACE_dynamic_cast (TAO_POA_Manager *,
poa_manager);
}
TAO_POA *poa = this->create_POA_i (adapter_name,
*tao_poa_manager,
tao_policies
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (PortableServer::POA::_nil ());
return PortableServer::POA::_duplicate (poa);
}
TAO_POA *
TAO_POA::new_POA (const String &name,
TAO_POA_Manager &poa_manager,
const TAO_POA_Policy_Set &policies,
TAO_POA *parent,
ACE_Lock &lock,
TAO_SYNCH_MUTEX &thread_lock,
TAO_ORB_Core &orb_core,
TAO_Object_Adapter *object_adapter
ACE_ENV_ARG_DECL)
{
TAO_POA *poa;
ACE_NEW_THROW_EX (poa,
TAO_POA (name,
poa_manager,
policies,
parent,
lock,
thread_lock,
orb_core,
object_adapter
ACE_ENV_ARG_PARAMETER),
CORBA::NO_MEMORY ());
ACE_CHECK_RETURN (0);
return poa;
}
TAO_POA *
TAO_POA::create_POA_i (const TAO_POA::String &adapter_name,
TAO_POA_Manager &poa_manager,
const TAO_POA_Policy_Set &policies
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
PortableServer::POA::AdapterAlreadyExists,
PortableServer::POA::InvalidPolicy))
{
// This operaton creates a new POA as a child of the target POA. The
// specified name identifies the new POA with respect to other POAs
// with the same parent POA. If the target POA already has a child
// POA with the specified name, the AdapterAlreadyExists exception
// is raised.
int result = this->children_.find (adapter_name);
// Child was found
if (result != -1)
{
ACE_THROW_RETURN (PortableServer::POA::AdapterAlreadyExists (),
0);
}
//
// Child was not found
//
// The specified policy objects are associated with the POA and used
// to control its behavior. The policy objects are effectively
// copied before this operation returns, so the application is free
// to destroy them while the POA is in use. Policies are not
// inherited from the parent POA.
TAO_POA *poa = this->new_POA (adapter_name,
poa_manager,
policies,
this,
this->object_adapter ().lock (),
this->object_adapter ().thread_lock (),
this->orb_core_,
this->object_adapter_
ACE_ENV_ARG_PARAMETER);
// Give ownership of the new map to the POA_var. Note, that it
// is important for the POA_var to take ownership before
// checking for exception since we may need to delete the new map.
PortableServer::POA_var new_poa = poa;
// Check for exception in construction of the POA.
ACE_CHECK_RETURN (0);
// Add to children map
result = this->children_.bind (adapter_name,
poa);
if (result != 0)
{
ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
0);
}
// Iterate over the registered IOR interceptors so that they may be
// given the opportunity to add tagged components to the profiles
// for this servant.
poa->establish_components (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
// Note: Creating a POA using a POA manager that is in the active
// state can lead to race conditions if the POA supports preexisting
// objects, because the new POA may receive a request before its
// adapter activator, servant manager, or default servant have been
// initialized. These problems do not occur if the POA is created by
// an adapter activator registered with a parent of the new POA,
// because requests are queued until the adapter activator
// returns. To avoid these problems when a POA must be explicitly
// initialized, the application can initialize the POA by invoking
// find_POA with a TRUE activate parameter.
// Everything is fine. Don't let the POA_var release the
// implementation.
(void) new_poa._retn (); // We could do a "return new_poa._retn()"
// but the return type doesn't match this
// method's return type.
return poa;
}
PortableServer::POA_ptr
TAO_POA::find_POA (const char *adapter_name,
CORBA::Boolean activate_it
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
PortableServer::POA::AdapterNonExistent))
{
// Lock access for the duration of this transaction.
TAO_POA_GUARD_RETURN (0);
// A recursive thread lock without using a recursive thread lock.
// Non_Servant_Upcall has a magic constructor and destructor. We
// unlock the Object_Adapter lock for the duration of the servant
// activator upcalls; reacquiring once the upcalls complete. Even
// though we are releasing the lock, other threads will not be able
// to make progress since
// <Object_Adapter::non_servant_upcall_in_progress_> has been set.
TAO_Object_Adapter::Non_Servant_Upcall non_servant_upcall (*this);
ACE_UNUSED_ARG (non_servant_upcall);
TAO_POA *poa = this->find_POA_i (adapter_name,
activate_it
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (PortableServer::POA::_nil ());
return PortableServer::POA::_duplicate (poa);
}
TAO_POA *
TAO_POA::find_POA_i (const ACE_CString &child_name,
CORBA::Boolean activate_it
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
PortableServer::POA::AdapterNonExistent))
{
TAO_POA *child;
int result = this->children_.find (child_name,
child);
#if (TAO_HAS_MINIMUM_POA == 0)
if (result != 0)
{
if (activate_it)
{
if (!CORBA::is_nil (this->adapter_activator_.in ()))
{
// Check the state of the POA Manager.
this->check_poa_manager_state (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
CORBA::Boolean success =
this->adapter_activator_->unknown_adapter (this,
child_name.c_str ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
if (success)
{
result = this->children_.find (child_name,
child);
}
else
{
result = -1;
}
}
else
{
result = -1;
}
}
else
{
result = -1;
}
}
#else
ACE_UNUSED_ARG (activate_it);
#endif /* TAO_HAS_MINIMUM_POA == 0 */
if (result == 0)
{
return child;
}
else
{
// Otherwise, the AdapterNonExistent exception is raised.
ACE_THROW_RETURN (PortableServer::POA::AdapterNonExistent (),
0);
}
}
void
TAO_POA::destroy_i (CORBA::Boolean etherealize_objects,
CORBA::Boolean wait_for_completion
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
if (this->cleanup_in_progress_)
return;
// Is the <wait_for_completion> semantics for this thread correct?
TAO_POA::check_for_valid_wait_for_completions (this->orb_core (),
wait_for_completion
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
this->cleanup_in_progress_ = 1;
// This operation destroys the POA and all descendant POAs. The POA
// so destroyed (that is, the POA with its name) may be re-created
// later in the same process. (This differs from the
// POAManager::deactivate operation that does not allow a
// re-creation of its associated POA in the same process.)
// Remove POA from the parent
if (this->parent_ != 0)
{
int result = this->parent_->delete_child (this->name_);
if (result != 0)
{
ACE_THROW (CORBA::OBJ_ADAPTER ());
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?