load_balancer_i.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 545 行 · 第 1/2 页
CPP
545 行
// Remove all entries for this member.
members_.unbind (member_id);
Object_Group_i::ITERATOR iter (member_id_list_);
while (member_id != *(iter.next ()))
iter.advance ();
delete (iter.next ());
iter.remove ();
ACE_DEBUG ((LM_DEBUG,
"Load_Balancer: Removed member with id <%s>"
"from <%s> object group\n", id, id_.c_str ()));
}
CORBA::Object_ptr
Object_Group_i::resolve_with_id (const char * id
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
Load_Balancer::no_such_member))
{
CORBA::Object_var obj;
ACE_CString member_id (id);
if (members_.find (member_id, obj) == -1)
ACE_THROW_RETURN (Load_Balancer::no_such_member (),
obj._retn ());
return obj._retn ();
}
Load_Balancer::Member_ID_List *
Object_Group_i::members (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
Load_Balancer::Member_ID_List * list;
// Figure out the length of the list.
CORBA::ULong len = members_.current_size ();
// Allocate the list of <len> length.
ACE_NEW_THROW_EX (list,
Load_Balancer::Member_ID_List (len),
CORBA::NO_MEMORY ());
ACE_CHECK_RETURN (list);
list->length (len);
// Create an iterator for <member_id_list_> to populate the list.
Object_Group_i::ITERATOR id_iter (member_id_list_);
// Iterate over groups and populate the list.
for (CORBA::ULong i = 0; i < len; i++)
{
(*list)[i] = id_iter.next ()->c_str ();
id_iter.advance ();
}
return list;
}
void
Object_Group_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// Deregister with POA.
PortableServer::POA_var poa =
this->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
PortableServer::ObjectId_var id =
poa->servant_to_id (this
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
poa->deactivate_object (id.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
ACE_DEBUG ((LM_DEBUG,
"Load_Balancer: Destroyed object group"
"with id <%s>\n", id_.c_str ()));
}
Random_Object_Group::Random_Object_Group (const char *id,
Object_Group_Factory_i *my_factory)
: Object_Group_i (id, my_factory)
{
// Seed the random number generator.
ACE_OS::srand (ACE_OS::time ());
}
Random_Object_Group::~Random_Object_Group (void)
{
}
void
Random_Object_Group::destroy (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
//Deregisters this <Object_Group> with its
// <Object_Group_Factory>.
my_factory_->remove_group (id_, 1);
Object_Group_i::destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
}
CORBA::Object_ptr
Random_Object_Group::resolve (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
Load_Balancer::no_such_member))
{
CORBA::Object_var obj;
size_t group_size = members_.current_size ();
if (group_size == 0)
ACE_THROW_RETURN (Load_Balancer::no_such_member (),
obj._retn ());
// Generate random number in the range [0, group_size - 1]
size_t member = ACE_OS::rand() % group_size;
// Get the id of the member to return to the client.
ACE_CString *id;
member_id_list_.get (id, member);
ACE_DEBUG ((LM_DEBUG, "Load_Balancer: In <%s> Group resolved to <%s>\n",
id_.c_str (),
id->c_str()));
// Return the object reference corresponding to the found id to the client.
members_.find (*id, obj);
return obj._retn ();
}
RR_Object_Group::RR_Object_Group (const char *id,
Object_Group_Factory_i *my_factory)
: Object_Group_i (id, my_factory),
next_ (0)
{
}
RR_Object_Group::~RR_Object_Group (void)
{
}
void
RR_Object_Group::destroy (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
//Deregisters this <Object_Group> with its
// <Object_Group_Factory>.
my_factory_->remove_group (id_, 0);
Object_Group_i::destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
}
CORBA::Object_ptr
RR_Object_Group::resolve (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
Load_Balancer::no_such_member))
{
CORBA::Object_var obj;
size_t group_size = members_.current_size ();
if (group_size == 0)
ACE_THROW_RETURN (Load_Balancer::no_such_member (),
obj._retn ());
// Get the id of the member to return to the client.
ACE_CString *id;
member_id_list_.get (id, next_);
ACE_DEBUG ((LM_DEBUG, "Load_Balancer: In <%s> Group resolved to <%s>\n",
id_.c_str (),
id->c_str ()));
// Adjust <next_> for the next invocation.
next_ = (next_ + 1) % group_size;
// Return the object reference corresponding to the found id to the client.
if (members_.find (*id, obj) == -1)
ACE_THROW_RETURN (CORBA::INTERNAL (),
CORBA::Object::_nil ());
return obj._retn ();
}
void
RR_Object_Group::unbind (const char *id
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
Load_Balancer::no_such_member))
{
ACE_CString member_id (id);
// Check to make sure we have it.
if (members_.find (member_id) == -1)
ACE_THROW (Load_Balancer::no_such_member ());
// Remove all entries for this member.
members_.unbind (member_id);
// As we remove the id from the <member_id_list>, we note the
// position of the id in the list.
size_t position = 0;
Object_Group_i::ITERATOR iter (member_id_list_);
while (member_id != *(iter.next ()))
{
iter.advance ();
position++;
}
delete (iter.next ());
iter.remove ();
// Update <next_> if necessary to reflect the deletion.
if (position < next_)
next_--;
else if (position == next_)
next_ = next_ % (members_.current_size ());
ACE_DEBUG ((LM_DEBUG,
"Load_Balancer: Removed member with id <%s>"
"from <%s> object group\n", id, id_.c_str ()));
}
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, Load_Balancer::Object_Group_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Iterator<ACE_CString, Load_Balancer::Object_Group_var, ACE_Null_Mutex>;
template class ACE_Hash_Map_Iterator_Ex<ACE_CString, Load_Balancer::Object_Group_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, Load_Balancer::Object_Group_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, CORBA::Object_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Manager_Ex<ACE_CString, Load_Balancer::Object_Group_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Manager<ACE_CString, Load_Balancer::Object_Group_var, ACE_Null_Mutex>;
template class ACE_Hash_Map_Entry<ACE_CString, Load_Balancer::Object_Group_var>;
template class ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, CORBA::Object_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Iterator<ACE_CString, CORBA::Object_var, ACE_Null_Mutex>;
template class ACE_Hash_Map_Iterator_Ex<ACE_CString, CORBA::Object_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Manager_Ex<ACE_CString, CORBA::Object_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Manager<ACE_CString, CORBA::Object_var, ACE_Null_Mutex>;
template class ACE_Hash_Map_Entry<ACE_CString, CORBA::Object_var>;
template class ACE_DLList<ACE_CString>;
template class ACE_DLList_Iterator<ACE_CString>;
template class ACE_Auto_Basic_Ptr<Object_Group_i>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, Load_Balancer::Object_Group_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Iterator<ACE_CString, Load_Balancer::Object_Group_var, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Iterator_Ex<ACE_CString, Load_Balancer::Object_Group_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString,Load_Balancer::Object_Group_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, CORBA::Object_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Manager_Ex<ACE_CString, Load_Balancer::Object_Group_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Manager<ACE_CString, Load_Balancer::Object_Group_var, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Entry<ACE_CString, Load_Balancer::Object_Group_var>
#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, CORBA::Object_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Iterator<ACE_CString, CORBA::Object_var, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Iterator_Ex<ACE_CString, CORBA::Object_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Manager_Ex<ACE_CString, CORBA::Object_var, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Manager<ACE_CString, CORBA::Object_var, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Entry<ACE_CString, CORBA::Object_var>
#pragma instantiate ACE_DLList<ACE_CString>
#pragma instantiate ACE_DLList_Iterator<ACE_CString>
#pragma instantiate ACE_Auto_Basic_Ptr<Object_Group_i>
#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?