poa.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 1,826 行 · 第 1/5 页
CPP
1,826 行
PortableInterceptor::ObjectReferenceTemplateSeq seq_obj_ref_template;
CORBA::ULong i = 0;
// Remove all children POAs
for (CHILDREN::iterator iterator = this->children_.begin ();
iterator != this->children_.end ();
++iterator)
{
TAO_POA *child_poa = (*iterator).int_id_;
// Get the adapter template related to the ChildPOA
PortableInterceptor::ObjectReferenceTemplate *child_at =
child_poa->get_adapter_template ();
CORBA::add_ref (child_at);
// Add it to the sequence of object reference templates that
// will be destroyed.
seq_obj_ref_template.length (i + 1);
seq_obj_ref_template[i] = child_at;
child_poa->adapter_state_ = PortableInterceptor::INACTIVE;
child_poa->adapter_state_changed (seq_obj_ref_template,
child_poa->adapter_state_
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
++i;
child_poa->destroy_i (etherealize_objects,
wait_for_completion
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
//
// ImplRepo related.
//
#if (TAO_HAS_MINIMUM_CORBA == 0)
if (this->cached_policies_.lifespan () == PortableServer::PERSISTENT)
{
this->imr_notify_shutdown ();
// Delete the servant, if there is one.
if (this->server_object_)
{
TAO_POA *tao_poa = 0;
PortableServer::POA_var poa =
this->server_object_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
tao_poa = poa->_tao_poa_downcast ();
PortableServer::ObjectId_var id =
tao_poa->servant_to_id_i (this->server_object_
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
tao_poa->deactivate_object_i (id.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
}
#endif /* TAO_HAS_MINIMUM_CORBA */
// When a POA is destroyed, any requests that have started execution
// continue to completion. Any requests that have not started
// execution are processed as if they were newly arrived, that is,
// the POA will attempt to cause recreation of the POA by invoking
// one or more adapter activators as described in Section 3.3.3.
// If the wait_for_completion parameter is TRUE, the destroy
// operation will return only after all requests in process have
// completed and all invocations of etherealize have
// completed. Otherwise, the destroy operation returns after
// destroying the POAs.
this->deactivate_all_objects_i (etherealize_objects,
wait_for_completion
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
// If there are no outstanding requests and that we are not in a
// non-servant upcall or if we are in a non-servant upcall, make
// sure we are the POA related to the non-servant upcall.
TAO_Object_Adapter::Non_Servant_Upcall *non_servant_upcall_in_progress =
this->object_adapter ().non_servant_upcall_in_progress ();
if (this->outstanding_requests_ == 0 &&
(non_servant_upcall_in_progress == 0 ||
&non_servant_upcall_in_progress->poa () != this))
{
// According to the ORT spec, after a POA is destroyed, its state
// has to be changed to NON_EXISTENT and all the registered
// interceptors are to be informed. Since, the POA is destroyed
// and is released in the complete_destruction_i method, we are
// trying to keep the poa still around by doing a duplicate of
// it. (a hack).
PortableServer::POA_var poa = PortableServer::POA::_duplicate (this);
this->complete_destruction_i (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
this->adapter_state_ = PortableInterceptor::NON_EXISTENT;
this->adapter_state_changed (seq_obj_ref_template,
this->adapter_state_
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
// Break all ties between the ObjectReferenceTemplate and this
// POA.
this->def_ort_template_->poa (0);
}
else
{
// Mark that we are ready for destruction.
this->waiting_destruction_ = 1;
}
}
int
TAO_POA::delete_child (const TAO_POA::String &child)
{
int result = 0;
// If we are not closing down, we must remove this child from our
// collection.
if (!this->cleanup_in_progress_)
result = this->children_.unbind (child);
// Otherwise, if we are closing down, we are currently iterating
// over our children and there is not need to remove this child from
// our collection.
return result;
}
PortableServer::POAList *
TAO_POA::the_children_i (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
PortableServer::POAList_var children;
CORBA::ULong child_current = ACE_static_cast (CORBA::ULong,
this->children_.current_size ());
ACE_NEW_THROW_EX (children,
PortableServer::POAList (child_current),
CORBA::NO_MEMORY ());
ACE_CHECK_RETURN (0);
children->length (child_current);
CORBA::ULong index = 0;
for (CHILDREN::iterator iterator = this->children_.begin ();
iterator != this->children_.end ();
++iterator, ++index)
{
TAO_POA *child_poa = (*iterator).int_id_;
children[index] = PortableServer::POA::_duplicate (child_poa);
}
return children._retn ();
}
PortableInterceptor::AdapterName *
TAO_POA::adapter_name_i (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// The adapter name is the sequence of names starting from the
// RootPOA to the one whose name is requested. The name of the
// RootPOA is "RootPOA".
PortableServer::POA_var poa = PortableServer::POA::_duplicate (this);
CORBA::ULong len = 0;
// Find the length of the adapter name sequence by traversing the
// POA hierarchy until the RootPOA is reached. The RootPOA has no
// parent.
while (!CORBA::is_nil (poa.in ()))
{
poa = poa->the_parent (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
++len;
}
// Empty adapter name sequence.
PortableInterceptor::AdapterName *names = 0;
ACE_NEW_THROW_EX (names,
PortableInterceptor::AdapterName (len),
CORBA::NO_MEMORY (
CORBA::SystemException::_tao_minor_code (
TAO_DEFAULT_MINOR_CODE,
ENOMEM),
CORBA::COMPLETED_NO));
ACE_CHECK_RETURN (0);
PortableInterceptor::AdapterName_var safe_names (names);
names->length (len);
poa = PortableServer::POA::_duplicate (this);
(*names)[0] = CORBA::string_dup ("RootPOA");
// Fill in the AdapterName sequence as the POA hierarchy is
// traversed.
CORBA::ULong ilen = len;
for (CORBA::ULong i = 1; i < len; ++i)
{
(*names)[--ilen] = poa->the_name (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
poa = poa->the_parent (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
// If this condition asserts, the POA hierarchy was modified
// (i.e. reduced in size) by another thread!
ACE_ASSERT ((ilen > 0 ? !CORBA::is_nil (poa.in ()) : 1));
}
return safe_names._retn ();
}
void
TAO_POA::add_ior_component (TAO_MProfile & mprofile,
const IOP::TaggedComponent &component
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// Add the given tagged component to all profiles.
const CORBA::ULong profile_count = mprofile.profile_count ();
for (CORBA::ULong i = 0; i < profile_count; ++i)
{
TAO_Profile *profile = mprofile.get_profile (i);
profile->add_tagged_component (component
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
}
void
TAO_POA::add_ior_component_to_profile (
TAO_MProfile & mprofile,
const IOP::TaggedComponent &component,
IOP::ProfileId profile_id
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// Add the given tagged component to all profiles matching the given
// ProfileId.
int found_profile = 0;
const CORBA::ULong profile_count = mprofile.profile_count ();
for (CORBA::ULong i = 0; i < profile_count; ++i)
{
TAO_Profile *profile = mprofile.get_profile (i);
if (profile->tag () == profile_id)
{
profile->add_tagged_component (component
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
found_profile = 1;
}
}
// According to the Portable Interceptor specification, we're
// supposed to throw a CORBA::BAD_PARAM exception if no profile
// matched the given ProfileId.
if (found_profile == 0)
ACE_THROW (CORBA::BAD_PARAM (CORBA::OMGVMCID | 29,
CORBA::COMPLETED_NO));
}
void
TAO_POA::adapter_state_changed (
const PortableInterceptor::ObjectReferenceTemplateSeq &seq_obj_ref_template,
PortableInterceptor::AdapterState state
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
/// First get a list of all the interceptors.
TAO_IORInterceptor_List * interceptor_list =
this->orb_core_.ior_interceptor_list ();
if (interceptor_list == 0)
return;
TAO_IORInterceptor_List::TYPE & interceptors =
interceptor_list->interceptors ();
const size_t interceptor_count = interceptors.size ();
if (interceptor_count == 0)
return;
for (size_t i = 0; i < interceptor_count; ++i)
{
interceptors[i]->adapter_state_changed (seq_obj_ref_template,
state
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
}
#if (TAO_HAS_MINIMUM_POA == 0)
PortableServer::ServantManager_ptr
TAO_POA::get_servant_manager_i (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
PortableServer::POA::WrongPolicy))
{
// This operation requires the USE_SERVANT_MANAGER policy; if not
// present, the WrongPolicy exception is raised.
if (this->cached_policies_.request_processing () != PortableServer::USE_SERVANT_MANAGER)
{
ACE_THROW_RETURN (PortableServer::POA::WrongPolicy (),
PortableServer::ServantManager::_nil ());
}
// This operation returns the servant manager associated with the
// POA. If no servant manager has been associated with the POA, it
// returns a null reference.
if (this->cached_policies_.servant_retention () == PortableServer::RETAIN)
return PortableServer::ServantManager::_duplicate (this->servant_activator_.in ());
else
return PortableServer::ServantManager::_duplicate (this->servant_locator_.in ());
}
void
TAO_POA::set_servant_manager_i (PortableServer::ServantManager_ptr imgr
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
PortableServer::POA::WrongPolicy))
{
// This operation requires the USE_SERVANT_MANAGER policy; if not
// present, the WrongPolicy exception is raised.
if (this->cached_policies_.request_processing () != PortableServer::USE_SERVANT_MANAGER)
{
ACE_THROW (PortableServer::POA::WrongPolicy ());
}
// This operation sets the default servant manager associated with
// the POA.
if (this->cached_policies_.servant_retention () == PortableServer::RETAIN)
{
this->servant_activator_ = PortableServer::ServantActivator::_narrow (imgr
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (CORBA::is_nil (this->servant_activator_.in ()))
{
ACE_THROW (PortableServer::POA::WrongPolicy ());
}
}
else
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?