object_adapter.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 2,061 行 · 第 1/5 页
CPP
2,061 行
return CORBA::Object::_duplicate (this->root_);
}
CORBA::Object_ptr
TAO_Object_Adapter::create_collocated_object (TAO_Stub *stub,
const TAO_MProfile &mp)
{
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
TAO_ServantBase *sb =
this->get_collocated_servant (mp
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Set the servant ORB. Do not duplicate the ORB here since
// TAO_Stub::servant_orb() duplicates it.
stub->servant_orb (this->orb_core_.orb ());
// It is ok to create a collocated object even when <sb> is
// zero.
CORBA::Object_ptr x;
ACE_NEW_RETURN (x,
CORBA::Object (stub,
1,
sb),
CORBA::Object::_nil ());
// Here we set the strategized Proxy Broker.
x->_proxy_broker (the_tao_collocated_object_proxy_broker ());
// Success.
return x;
}
ACE_CATCHANY
{
// Ignore the exception and continue with the next one.
}
ACE_ENDTRY;
// Failure.
return CORBA::Object::_nil ();
}
CORBA::Long
TAO_Object_Adapter::initialize_collocated_object (TAO_Stub *stub,
CORBA::Object_ptr obj)
{
// @@ What about forwarding. With this approach we are never
// forwarded when we use collocation!
const TAO_MProfile &mp =
stub->base_profiles ();
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
TAO_ServantBase *sb =
this->get_collocated_servant (mp
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Set the servant ORB. Do not duplicate the ORB here since
// TAO_Stub::servant_orb() duplicates it.
stub->servant_orb (this->orb_core_.orb ());
// It is ok to set the object as a collocated object even when
// <sb> is zero.
obj->set_collocated_servant (sb);
// Here we set the strategized Proxy Broker.
obj->_proxy_broker (the_tao_collocated_object_proxy_broker ());
// Success.
return 0;
}
ACE_CATCHANY
{
// Ignore exceptions..
}
ACE_ENDTRY;
// Failure.
return -1;
}
TAO_ServantBase *
TAO_Object_Adapter::get_collocated_servant (const TAO_MProfile &mp
ACE_ENV_ARG_DECL)
{
for (TAO_PHandle j = 0;
j != mp.profile_count ();
++j)
{
const TAO_Profile *profile = mp.get_profile (j);
TAO::ObjectKey_var objkey = profile->_key ();
if (ACE_OS::memcmp (objkey->get_buffer (),
&TAO_POA::objectkey_prefix[0],
TAO_POA::TAO_OBJECTKEY_PREFIX_SIZE) != 0)
continue;
TAO_ServantBase *servant = 0;
this->find_servant (objkey.in (),
servant
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
return servant;
}
return 0;
}
// ****************************************************************
TAO_Object_Adapter_Factory::TAO_Object_Adapter_Factory (void)
{
}
TAO_Adapter*
TAO_Object_Adapter_Factory::create (TAO_ORB_Core *orb_core)
{
return new TAO_Object_Adapter (orb_core->server_factory ()->
active_object_map_creation_parameters (),
*orb_core);
}
int
TAO_Object_Adapter_Factory::init (int /* argc */,
ACE_TCHAR* /* argv */ [])
{
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
/// Register the Messaging ORBInitializer.
PortableInterceptor::ORBInitializer_ptr temp_orb_initializer =
PortableInterceptor::ORBInitializer::_nil ();
ACE_NEW_THROW_EX (temp_orb_initializer,
TAO_PortableServer_ORBInitializer,
CORBA::NO_MEMORY (
CORBA::SystemException::_tao_minor_code (
TAO_DEFAULT_MINOR_CODE,
ENOMEM),
CORBA::COMPLETED_NO));
ACE_TRY_CHECK;
PortableInterceptor::ORBInitializer_var orb_initializer =
temp_orb_initializer;
PortableInterceptor::register_orb_initializer (orb_initializer.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
"(%P | %t) Caught exception:");
return -1;
}
ACE_ENDTRY;
return 0;
}
ACE_FACTORY_DEFINE (TAO_PortableServer, TAO_Object_Adapter_Factory)
ACE_STATIC_SVC_DEFINE (TAO_Object_Adapter_Factory,
ACE_TEXT ("TAO_POA"),
ACE_SVC_OBJ_T,
&ACE_SVC_NAME (TAO_Object_Adapter_Factory),
ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
0)
// ****************************************************************
TAO_Object_Adapter::Hint_Strategy::~Hint_Strategy (void)
{
}
void
TAO_Object_Adapter::Hint_Strategy::object_adapter (TAO_Object_Adapter *oa)
{
this->object_adapter_ = oa;
}
TAO_Object_Adapter::Active_Hint_Strategy::Active_Hint_Strategy (CORBA::ULong map_size)
: persistent_poa_system_map_ (map_size)
{
}
TAO_Object_Adapter::Active_Hint_Strategy::~Active_Hint_Strategy (void)
{
}
int
TAO_Object_Adapter::Active_Hint_Strategy::find_persistent_poa (
const poa_name &system_name,
TAO_POA *&poa
ACE_ENV_ARG_DECL)
{
poa_name folded_name;
int result = this->persistent_poa_system_map_.recover_key (system_name,
folded_name);
if (result == 0)
{
result = this->persistent_poa_system_map_.find (system_name,
poa);
if (result != 0
|| folded_name != poa->folded_name ())
{
result =
this->object_adapter_->persistent_poa_name_map_->find (folded_name,
poa);
if (result != 0)
{
result =
this->object_adapter_->activate_poa (folded_name,
poa
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
}
}
}
return result;
}
int
TAO_Object_Adapter::Active_Hint_Strategy::bind_persistent_poa (
const poa_name &folded_name,
TAO_POA *poa,
poa_name_out system_name)
{
poa_name name = folded_name;
int result = this->persistent_poa_system_map_.bind_modify_key (poa,
name);
if (result == 0)
{
result =
this->object_adapter_->persistent_poa_name_map_->bind (folded_name,
poa);
if (result != 0)
this->persistent_poa_system_map_.unbind (name);
else
ACE_NEW_RETURN (system_name,
poa_name (name),
-1);
}
return result;
}
int
TAO_Object_Adapter::Active_Hint_Strategy::unbind_persistent_poa (
const poa_name &folded_name,
const poa_name &system_name)
{
int result = this->persistent_poa_system_map_.unbind (system_name);
if (result == 0)
result =
this->object_adapter_->persistent_poa_name_map_->unbind (folded_name);
return result;
}
TAO_Object_Adapter::No_Hint_Strategy::~No_Hint_Strategy (void)
{
}
int
TAO_Object_Adapter::No_Hint_Strategy::find_persistent_poa (
const poa_name &system_name,
TAO_POA *&poa
ACE_ENV_ARG_DECL)
{
int result =
this->object_adapter_->persistent_poa_name_map_->find (system_name,
poa);
if (result != 0)
{
result =
this->object_adapter_->activate_poa (system_name,
poa
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
}
return result;
}
int
TAO_Object_Adapter::No_Hint_Strategy::bind_persistent_poa (
const poa_name &folded_name,
TAO_POA *poa,
poa_name_out system_name)
{
int result =
this->object_adapter_->persistent_poa_name_map_->bind (folded_name,
poa);
if (result == 0)
ACE_NEW_RETURN (system_name,
poa_name (folded_name),
-1);
return result;
}
int
TAO_Object_Adapter::No_Hint_Strategy::unbind_persistent_poa (
const poa_name & folded_name,
const poa_name & /* system_name */)
{
return this->object_adapter_->persistent_poa_name_map_->unbind (folded_name);
}
TAO_Object_Adapter::poa_name_iterator::poa_name_iterator (
int begin,
CORBA::ULong size,
const CORBA::Octet *folded_buffer)
: size_ (size),
folded_buffer_ (folded_buffer),
last_separator_ ((CORBA::ULong) ~0)
{
if (begin)
{
this->position_ = (CORBA::ULong) ~0;
this->operator++ ();
}
else
this->position_ = this->size_;
}
int
TAO_Object_Adapter::poa_name_iterator::operator== (const poa_name_iterator &rhs) const
{
return this->position_ == rhs.position_;
}
int
TAO_Object_Adapter::poa_name_iterator::operator!= (const poa_name_iterator &rhs) const
{
return !this->operator== (rhs);
}
ACE_CString
TAO_Object_Adapter::poa_name_iterator::operator* () const
{
CORBA::ULong start_at =
this->last_separator_ +
TAO_POA::name_separator_length ();
CORBA::ULong how_many =
this->position_
- this->last_separator_
- TAO_POA::name_separator_length ();
return ACE_CString (ACE_reinterpret_cast (const char *,
&this->folded_buffer_[start_at]),
how_many);
}
TAO_Object_Adapter::poa_name_iterator &
TAO_Object_Adapter::poa_name_iterator::operator++ (void)
{
for (this->last_separator_ = this->position_;
;
)
{
++this->position_;
if (this->position_ < this->size_)
{
if (this->folded_buffer_[this->position_] == TAO_POA::name_separator ())
break;
}
else
break;
}
return *this;
}
TAO_Object_Adapter::iteratable_poa_name::iteratable_poa_name (
const poa_name &folded_name)
: folded_name_ (folded_name)
{
}
TAO_Object_Adapter::iteratable_poa_name::iterator
TAO_Object_Adapter::iteratable_poa_name::begin (void) const
{
return iterator (1,
this->folded_name_.length (),
this->folded_name_.get_buffer ());
}
TAO_Object_Adapter::iteratable_poa_name::iterator
TAO_Object_Adapter::iteratable_poa_name::end (void) const
{
return iterator (0,
this->folded_name_.length (),
this->folded_name_.get_buffer ());
}
TAO_Object_Adapter::Non_Servant_Upcall::Non_Servant_Upcall (TAO_POA &poa)
: object_adapter_ (poa.object_adapter ()),
poa_ (poa),
previous_ (0)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?