object_adapter.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 2,061 行 · 第 1/5 页
CPP
2,061 行
// Object_Adapter.cpp,v 1.63 2003/12/23 17:07:43 bala Exp
// -- PortableServer Include --
#include "Object_Adapter.h"
#include "POA.h"
#include "ServerRequestInfo.h"
#include "Default_Servant_Dispatcher.h"
#include "ServerInterceptorAdapter.h"
#include "PortableServer_ORBInitializer.h"
#include "Collocated_Object_Proxy_Broker.h"
// -- ACE Include --
#include "ace/Auto_Ptr.h"
// -- TAO Include --
#include "tao/ORB.h"
#include "tao/ORB_Core.h"
#include "tao/TSS_Resources.h"
#include "tao/TAO_Server_Request.h"
#include "tao/Stub.h"
#include "tao/Profile.h"
#include "tao/MProfile.h"
#include "tao/debug.h"
#include "tao/PortableInterceptor.h"
#include "tao/ORBInitializer_Registry.h"
#include "tao/Thread_Lane_Resources_Manager.h"
#include "tao/Thread_Lane_Resources.h"
#include "tao/Protocols_Hooks.h"
#if !defined (__ACE_INLINE__)
# include "Object_Adapter.i"
#endif /* __ACE_INLINE__ */
ACE_RCSID (TAO_PortableServer,
Object_Adapter,
"Object_Adapter.cpp,v 1.63 2003/12/23 17:07:43 bala Exp")
// Timeprobes class
#include "tao/Timeprobe.h"
#if defined (ACE_ENABLE_TIMEPROBES)
static const char *TAO_Object_Adapter_Timeprobe_Description[] =
{
"Object_Adapter::dispatch_servant - start",
"Object_Adapter::dispatch_servant - end",
"POA::parse_key - start",
"POA::parse_key - end",
"Object_Adapter::find_poa - start",
"Object_Adapter::find_poa - end",
"POA::locate_servant - start",
"POA::locate_servant - end",
"Servant::_dispatch - start",
"Servant::_dispatch - end",
};
enum
{
// Timeprobe description table start key
TAO_OBJECT_ADAPTER_DISPATCH_SERVANT_START = 200,
TAO_OBJECT_ADAPTER_DISPATCH_SERVANT_END,
TAO_POA_PARSE_KEY_START,
TAO_POA_PARSE_KEY_END,
TAO_OBJECT_ADAPTER_FIND_POA_START,
TAO_OBJECT_ADAPTER_FIND_POA_END,
TAO_POA_LOCATE_SERVANT_START,
TAO_POA_LOCATE_SERVANT_END,
TAO_SERVANT_DISPATCH_START,
TAO_SERVANT_DISPATCH_END
};
// Setup Timeprobes
ACE_TIMEPROBE_EVENT_DESCRIPTIONS (TAO_Object_Adapter_Timeprobe_Description,
TAO_OBJECT_ADAPTER_DISPATCH_SERVANT_START);
#endif /* ACE_ENABLE_TIMEPROBES */
/* static */
CORBA::ULong TAO_Object_Adapter::transient_poa_name_size_ = 0;
void
TAO_Object_Adapter::set_transient_poa_name_size (const TAO_Server_Strategy_Factory::Active_Object_Map_Creation_Parameters &creation_parameters)
{
if (TAO_Object_Adapter::transient_poa_name_size_ == 0)
{
switch (creation_parameters.poa_lookup_strategy_for_transient_id_policy_)
{
#if (TAO_HAS_MINIMUM_POA_MAPS == 0)
case TAO_LINEAR:
TAO_Object_Adapter::transient_poa_name_size_ =
sizeof (CORBA::ULong);
break;
case TAO_DYNAMIC_HASH:
TAO_Object_Adapter::transient_poa_name_size_ =
sizeof (CORBA::ULong);
break;
#endif /* TAO_HAS_MINIMUM_POA_MAPS == 0 */
case TAO_ACTIVE_DEMUX:
default:
TAO_Object_Adapter::transient_poa_name_size_ =
ACE_static_cast (CORBA::ULong,
ACE_Active_Map_Manager_Key::size ());
break;
}
}
}
TAO_Object_Adapter::TAO_Object_Adapter (const TAO_Server_Strategy_Factory::Active_Object_Map_Creation_Parameters &creation_parameters,
TAO_ORB_Core &orb_core)
: hint_strategy_ (0),
servant_dispatcher_ (0),
persistent_poa_name_map_ (0),
transient_poa_map_ (0),
orb_core_ (orb_core),
enable_locking_ (orb_core_.server_factory ()->enable_poa_locking ()),
thread_lock_ (),
lock_ (TAO_Object_Adapter::create_lock (enable_locking_,
thread_lock_)),
reverse_lock_ (*lock_),
non_servant_upcall_condition_ (thread_lock_),
non_servant_upcall_in_progress_ (0),
non_servant_upcall_nesting_level_ (0),
non_servant_upcall_thread_ (ACE_OS::NULL_thread),
root_ (0),
default_validator_ (orb_core),
default_poa_policies_ ()
{
TAO_Object_Adapter::set_transient_poa_name_size (creation_parameters);
Hint_Strategy *hint_strategy = 0;
if (creation_parameters.use_active_hint_in_poa_names_)
ACE_NEW (hint_strategy,
Active_Hint_Strategy (creation_parameters.poa_map_size_));
else
ACE_NEW (hint_strategy,
No_Hint_Strategy);
// Give ownership to the auto pointer.
auto_ptr<Hint_Strategy> new_hint_strategy (hint_strategy);
new_hint_strategy->object_adapter (this);
persistent_poa_name_map *ppnm;
switch (creation_parameters.poa_lookup_strategy_for_persistent_id_policy_)
{
case TAO_LINEAR:
#if (TAO_HAS_MINIMUM_POA_MAPS == 0)
ACE_NEW (ppnm,
persistent_poa_name_linear_map (creation_parameters.poa_map_size_));
break;
#else
ACE_ERROR ((LM_ERROR,
"linear option for -ORBPersistentidPolicyDemuxStrategy "
"not supported with minimum POA maps. "
"Ingoring option to use default... \n"));
/* FALL THROUGH */
#endif /* TAO_HAS_MINIMUM_POA_MAPS == 0 */
case TAO_DYNAMIC_HASH:
default:
ACE_NEW (ppnm,
persistent_poa_name_hash_map (creation_parameters.poa_map_size_));
break;
}
// Give ownership to the auto pointer.
auto_ptr<persistent_poa_name_map> new_persistent_poa_name_map (ppnm);
transient_poa_map *tpm = 0;
switch (creation_parameters.poa_lookup_strategy_for_transient_id_policy_)
{
#if (TAO_HAS_MINIMUM_POA_MAPS == 0)
case TAO_LINEAR:
ACE_NEW (tpm,
transient_poa_linear_map (creation_parameters.poa_map_size_));
break;
case TAO_DYNAMIC_HASH:
ACE_NEW (tpm,
transient_poa_hash_map (creation_parameters.poa_map_size_));
break;
#else
case TAO_LINEAR:
case TAO_DYNAMIC_HASH:
ACE_ERROR ((LM_ERROR,
"linear and dynamic options for -ORBTransientidPolicyDemuxStrategy "
"are not supported with minimum POA maps. "
"Ingoring option to use default... \n"));
/* FALL THROUGH */
#endif /* TAO_HAS_MINIMUM_POA_MAPS == 0 */
case TAO_ACTIVE_DEMUX:
default:
ACE_NEW (tpm,
transient_poa_active_map (creation_parameters.poa_map_size_));
break;
}
// Give ownership to the auto pointer.
auto_ptr<transient_poa_map> new_transient_poa_map (tpm);
this->hint_strategy_ =
new_hint_strategy.release ();
this->persistent_poa_name_map_ =
new_persistent_poa_name_map.release ();
this->transient_poa_map_ =
new_transient_poa_map.release ();
}
void
TAO_Object_Adapter::init_default_policies (TAO_POA_Policy_Set &policies
ACE_ENV_ARG_DECL)
{
// Initialize the default policies.
#if (TAO_HAS_MINIMUM_POA == 0)
// Thread policy.
TAO_Thread_Policy thread_policy (PortableServer::ORB_CTRL_MODEL);
policies.merge_policy (&thread_policy ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
#endif /* TAO_HAS_MINIMUM_POA == 0 */
// Lifespan policy.
TAO_Lifespan_Policy lifespan_policy (PortableServer::TRANSIENT);
policies.merge_policy (&lifespan_policy ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
// ID uniqueness policy.
TAO_Id_Uniqueness_Policy id_uniqueness_policy (PortableServer::UNIQUE_ID);
policies.merge_policy (&id_uniqueness_policy ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
// ID assignment policy.
TAO_Id_Assignment_Policy id_assignment_policy (PortableServer::SYSTEM_ID);
policies.merge_policy (&id_assignment_policy ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
#if (TAO_HAS_MINIMUM_POA == 0)
// Implicit activation policy.
TAO_Implicit_Activation_Policy implicit_activation_policy
(PortableServer::NO_IMPLICIT_ACTIVATION);
policies.merge_policy (&implicit_activation_policy ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
// Servant retention policy.
TAO_Servant_Retention_Policy servant_retention_policy (PortableServer::RETAIN);
policies.merge_policy (&servant_retention_policy ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
// Request processing policy.
TAO_Request_Processing_Policy request_processing_policy
(PortableServer::USE_ACTIVE_OBJECT_MAP_ONLY);
policies.merge_policy (&request_processing_policy ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
#endif /* TAO_HAS_MINIMUM_POA == 0 */
}
TAO_Object_Adapter::~TAO_Object_Adapter (void)
{
delete this->hint_strategy_;
delete this->persistent_poa_name_map_;
delete this->transient_poa_map_;
delete this->lock_;
delete this->servant_dispatcher_;
}
/* static */
ACE_Lock *
TAO_Object_Adapter::create_lock (int enable_locking,
TAO_SYNCH_MUTEX &thread_lock)
{
#if defined (ACE_HAS_THREADS)
if (enable_locking)
{
ACE_Lock *the_lock;
ACE_NEW_RETURN (the_lock,
ACE_Lock_Adapter<TAO_SYNCH_MUTEX> (thread_lock),
0);
return the_lock;
}
#else
ACE_UNUSED_ARG (enable_locking);
ACE_UNUSED_ARG (thread_lock);
#endif /* ACE_HAS_THREADS */
ACE_Lock *the_lock;
ACE_NEW_RETURN (the_lock,
ACE_Lock_Adapter<ACE_SYNCH_NULL_MUTEX> (),
0);
return the_lock;
}
int
TAO_Object_Adapter::dispatch_servant (const TAO::ObjectKey &key,
TAO_ServerRequest &req,
CORBA::Object_out forward_to
ACE_ENV_ARG_DECL)
{
ACE_FUNCTION_TIMEPROBE (TAO_OBJECT_ADAPTER_DISPATCH_SERVANT_START);
// This object is magical, i.e., it has a non-trivial constructor
// and destructor.
Servant_Upcall servant_upcall (&this->orb_core_);
// Set up state in the POA et al (including the POA Current), so
// that we know that this servant is currently in an upcall.
const char *operation = req.operation ();
int result =
servant_upcall.prepare_for_upcall (key,
operation,
forward_to
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (result);
if (result != TAO_Adapter::DS_OK)
return result;
// Preprocess remote request.
servant_upcall.pre_invoke_remote_request (req
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (result);
// Servant dispatch.
{
ACE_FUNCTION_TIMEPROBE (TAO_SERVANT_DISPATCH_START);
servant_upcall.servant ()->_dispatch (req,
&servant_upcall
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (result);
}
return result;
}
void
TAO_Object_Adapter::locate_poa (const TAO::ObjectKey &key,
PortableServer::ObjectId &system_id,
TAO_POA *&poa
ACE_ENV_ARG_DECL)
{
TAO_Object_Adapter::poa_name poa_system_name;
CORBA::Boolean is_root = 0;
CORBA::Boolean is_persistent = 0;
CORBA::Boolean is_system_id = 0;
TAO_Temporary_Creation_Time poa_creation_time;
int result = 0;
{
ACE_FUNCTION_TIMEPROBE (TAO_POA_PARSE_KEY_START);
result = TAO_POA::parse_key (key,
poa_system_name,
system_id,
is_root,
is_persistent,
is_system_id,
poa_creation_time);
}
if (result != 0)
ACE_THROW (CORBA::OBJ_ADAPTER ());
{
ACE_FUNCTION_TIMEPROBE (TAO_OBJECT_ADAPTER_FIND_POA_START);
result = this->find_poa (poa_system_name,
is_persistent,
is_root,
poa_creation_time,
poa
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
if (result != 0)
ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
}
int
TAO_Object_Adapter::activate_poa (const poa_name &folded_name,
TAO_POA *&poa
ACE_ENV_ARG_DECL)
{
int result = -1;
#if (TAO_HAS_MINIMUM_POA == 0)
iteratable_poa_name ipn (folded_name);
iteratable_poa_name::iterator iterator = ipn.begin ();
iteratable_poa_name::iterator end = ipn.end ();
TAO_POA *parent = this->root_;
if (parent == 0 || parent->name () != *iterator)
ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
-1);
else
++iterator;
// 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 adapter
// activator(s) upcalls; reacquiring once the upcalls complete.
// Even though we are releasing the lock, other threads will not be
// able to make progress since
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?