rt_orb.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 478 行 · 第 1/2 页
CPP
478 行
// RT_ORB.cpp,v 1.11 2003/08/17 07:26:27 ossama Exp
#include "RT_ORB.h"
#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
#include "RT_Policy_i.h"
#include "RT_Mutex.h"
#include "Priority_Mapping_Manager.h"
#include "tao/ORB_Core.h"
#include "tao/ORB.h"
#include "tao/RTCORBA/Thread_Pool.h"
#include "tao/RTCORBA/RT_Thread_Lane_Resources_Manager.h"
#include "ace/Sched_Params.h"
#if ! defined (__ACE_INLINE__)
#include "RT_ORB.i"
#endif /* __ACE_INLINE__ */
ACE_RCSID(TAO, RT_ORB, "RT_ORB.cpp,v 1.11 2003/08/17 07:26:27 ossama Exp")
TAO_RT_ORB::TAO_RT_ORB (TAO_ORB_Core *orb_core)
: orb_core_ (orb_core),
mutex_mgr_ (),
tp_manager_ (0)
{
TAO_Thread_Lane_Resources_Manager *thread_lane_resources_manager =
&this->orb_core_->thread_lane_resources_manager ();
TAO_RT_Thread_Lane_Resources_Manager *rt_thread_lane_resources_manager =
(TAO_RT_Thread_Lane_Resources_Manager *) thread_lane_resources_manager;
this->tp_manager_ =
&rt_thread_lane_resources_manager->tp_manager ();
}
TAO_RT_ORB::~TAO_RT_ORB (void)
{
}
RTCORBA::Mutex_ptr
TAO_RT_ORB::create_mutex (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
return this->mutex_mgr_.create_mutex (ACE_ENV_SINGLE_ARG_PARAMETER);
}
void
TAO_RT_ORB::destroy_mutex (RTCORBA::Mutex_ptr mutex
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
this->mutex_mgr_.destroy_mutex (mutex
ACE_ENV_ARG_PARAMETER);
}
RTCORBA::Mutex_ptr
TAO_RT_ORB::create_named_mutex (const char *name,
CORBA::Boolean_out created_flag
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
return this->mutex_mgr_.create_named_mutex (name,
created_flag
ACE_ENV_ARG_PARAMETER);
}
RTCORBA::Mutex_ptr
TAO_RT_ORB::open_named_mutex (const char *name
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
RTCORBA::RTORB::MutexNotFound))
{
return this->mutex_mgr_.open_named_mutex (name
ACE_ENV_ARG_PARAMETER);
}
////////////////////////////////////////////////////////////////////////////////
TAO_Named_RT_Mutex_Manager::TAO_Named_RT_Mutex_Manager (void)
{
}
TAO_Named_RT_Mutex_Manager::~TAO_Named_RT_Mutex_Manager (void)
{
}
RTCORBA::Mutex_ptr
TAO_Named_RT_Mutex_Manager::create_mutex (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
TAO_RT_Mutex *mutex = 0;
ACE_NEW_THROW_EX (mutex,
TAO_RT_Mutex (),
CORBA::NO_MEMORY (
CORBA::SystemException::_tao_minor_code (
TAO_DEFAULT_MINOR_CODE,
ENOMEM),
CORBA::COMPLETED_NO));
ACE_CHECK_RETURN (RTCORBA::Mutex::_nil ());
return mutex;
}
// If Named RT_Mutexes aren't enabled, this function is a nop
// as also indicated by the comment below.
#if (TAO_HAS_NAMED_RT_MUTEXES == 1)
void
TAO_Named_RT_Mutex_Manager::destroy_mutex (RTCORBA::Mutex_ptr mutex
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
TAO_RT_Mutex *tao_mutex =
ACE_dynamic_cast (TAO_RT_Mutex *,
mutex);
// If this mutex is named, then we need to remove it from our table.
// Otherwise, we don't have to do anything.
const char *name = tao_mutex->name ();
if (name != 0)
{
// The following should be atomic.
ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX,
monitor,
this->lock_,
CORBA::INTERNAL ());
ACE_CHECK;
int result =
this->map_.unbind (name);
if (result != 0)
ACE_THROW (CORBA::INTERNAL ());
}
}
#else /* TAO_HAS_NAMED_RT_MUTEXES == 1 */
void
TAO_Named_RT_Mutex_Manager::destroy_mutex (RTCORBA::Mutex_ptr
ACE_ENV_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
}
#endif /* TAO_HAS_NAMED_RT_MUTEXES == 1 */
RTCORBA::Mutex_ptr
TAO_Named_RT_Mutex_Manager::create_named_mutex (const char *name,
CORBA::Boolean_out created_flag
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
#if (TAO_HAS_NAMED_RT_MUTEXES == 1)
// The following should be atomic.
ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX,
monitor,
this->lock_,
CORBA::INTERNAL ());
ACE_CHECK_RETURN (RTCORBA::Mutex::_nil ());
// Optimistic that we'll find it.
created_flag = 0;
// If we find the mutex, simply return it.
RTCORBA::Mutex_var mutex;
if (this->map_.find (name,
mutex) != 0)
{
// Oops, we didn't find it.
created_flag = 1;
RTCORBA::Mutex_ptr tmp_mutex;
// Create a new one.
ACE_NEW_THROW_EX (tmp_mutex,
TAO_Named_RT_Mutex (name),
CORBA::NO_MEMORY (
CORBA::SystemException::_tao_minor_code (
TAO_DEFAULT_MINOR_CODE,
ENOMEM),
CORBA::COMPLETED_NO));
ACE_CHECK_RETURN (RTCORBA::Mutex::_nil ());
mutex = tmp_mutex;
// Add it to the map.
int result =
this->map_.bind (name,
mutex);
if (result != 0)
ACE_THROW_RETURN (CORBA::INTERNAL (),
RTCORBA::Mutex::_nil ());
}
// Return the one we found or created.
return mutex._retn ();
#else /* TAO_HAS_NAMED_RT_MUTEXES */
ACE_UNUSED_ARG (name);
ACE_UNUSED_ARG (created_flag);
ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
RTCORBA::Mutex::_nil ());
#endif /* TAO_HAS_NAMED_RT_MUTEXES */
}
RTCORBA::Mutex_ptr
TAO_Named_RT_Mutex_Manager::open_named_mutex (const char *name
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
RTCORBA::RTORB::MutexNotFound))
{
#if (TAO_HAS_NAMED_RT_MUTEXES == 1)
// The following should be atomic.
ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX,
monitor,
this->lock_,
CORBA::INTERNAL ());
ACE_CHECK_RETURN (RTCORBA::Mutex::_nil ());
// If we find the mutex, simply return it.
RTCORBA::Mutex_var mutex;
if (this->map_.find (name,
mutex) != 0)
ACE_THROW_RETURN (RTCORBA::RTORB::MutexNotFound (),
RTCORBA::Mutex::_nil ());
// Return the one we found.
return mutex._retn ();
#else /* TAO_HAS_NAMED_RT_MUTEXES */
ACE_UNUSED_ARG (name);
ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
RTCORBA::Mutex::_nil ());
#endif /* TAO_HAS_NAMED_RT_MUTEXES */
}
///////////////////////////////////////////////////////////////////////////////
RTCORBA::TCPProtocolProperties_ptr
TAO_RT_ORB::create_tcp_protocol_properties (CORBA::Long send_buffer_size,
CORBA::Long recv_buffer_size,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?