summaryrefslogtreecommitdiff
path: root/TAO/examples/Load_Balancing/Load_Balancer_i.cpp
diff options
context:
space:
mode:
authorWilliam R. Otte <wotte@dre.vanderbilt.edu>2006-07-24 15:50:11 +0000
committerWilliam R. Otte <wotte@dre.vanderbilt.edu>2006-07-24 15:50:11 +0000
commit8008dd09ccf88d4edef237a184a698cac42f2952 (patch)
treeda50d054f9c761c3f6a5923f6979e93306c56d68 /TAO/examples/Load_Balancing/Load_Balancer_i.cpp
parent13d6e89af439164c0ade48e6f5c3e9b3f971e8c9 (diff)
downloadATCD-8008dd09ccf88d4edef237a184a698cac42f2952.tar.gz
Repo restructuring
Diffstat (limited to 'TAO/examples/Load_Balancing/Load_Balancer_i.cpp')
-rw-r--r--TAO/examples/Load_Balancing/Load_Balancer_i.cpp499
1 files changed, 0 insertions, 499 deletions
diff --git a/TAO/examples/Load_Balancing/Load_Balancer_i.cpp b/TAO/examples/Load_Balancing/Load_Balancer_i.cpp
deleted file mode 100644
index f438dba3874..00000000000
--- a/TAO/examples/Load_Balancing/Load_Balancer_i.cpp
+++ /dev/null
@@ -1,499 +0,0 @@
-// $Id$
-// ============================================================================
-//
-// = FILENAME
-// Load_Balancer_i.cpp
-//
-// = AUTHOR
-// Marina Spivak <marina@cs.wustl.edu>
-//
-// ============================================================================
-
-#include "Load_Balancer_i.h"
-#include "ace/Auto_Ptr.h"
-#include "ace/OS_NS_time.h"
-
-Object_Group_Factory_i::Object_Group_Factory_i (void)
-{
-}
-
-Object_Group_Factory_i::~Object_Group_Factory_i (void)
-{
-}
-
-void
-Object_Group_Factory_i::remove_group (const ACE_CString &id,
- int random)
-{
- // Remove the entry from the appropriate map of groups.
- if (random)
- random_groups_.unbind (id);
- else
- rr_groups_.unbind (id);
-}
-
-Load_Balancer::Object_Group_ptr
-Object_Group_Factory_i::make_round_robin (const char * id
- ACE_ENV_ARG_DECL)
- ACE_THROW_SPEC ((CORBA::SystemException,
- Load_Balancer::duplicate_group))
-{
- return make_group (0,
- id
- ACE_ENV_ARG_PARAMETER);
-}
-
-Load_Balancer::Object_Group_ptr
-Object_Group_Factory_i::make_random (const char * id
- ACE_ENV_ARG_DECL)
- ACE_THROW_SPEC ((CORBA::SystemException,
- Load_Balancer::duplicate_group))
-{
- return make_group (1,
- id
- ACE_ENV_ARG_PARAMETER);
-}
-
-Load_Balancer::Object_Group_ptr
-Object_Group_Factory_i::make_group (int random,
- const char * id
- ACE_ENV_ARG_DECL)
- ACE_THROW_SPEC ((CORBA::SystemException,
- Load_Balancer::duplicate_group))
-{
- ACE_CString group_id (id);
-
- // Check to make sure we don't already have a group with the same
- // <id>.
- if (rr_groups_.find (group_id) == 0
- || random_groups_.find (group_id) == 0)
- ACE_THROW_RETURN (Load_Balancer::duplicate_group (),
- Load_Balancer::Object_Group::_nil ());
- else
- {
- // Store our result here for return.
- Load_Balancer::Object_Group_var group;
-
- // Create an appropriate servant.
- Object_Group_i * group_servant;
- if (random)
- ACE_NEW_THROW_EX (group_servant,
- Random_Object_Group (id, this),
- CORBA::NO_MEMORY ());
- else
- ACE_NEW_THROW_EX (group_servant,
- RR_Object_Group (id, this),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (group._retn ());
-
- // Temporarily put the servant into the auto_ptr.
- ACE_Auto_Basic_Ptr<Object_Group_i> temp (group_servant);
-
- // Register with the poa, begin using ref. counting.
- group = group_servant->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
- ACE_CHECK_RETURN (group._retn ());
-
- group_servant->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
- ACE_CHECK_RETURN (Load_Balancer::Object_Group::_nil ());
- temp.release ();
-
- // Make an entry in appropriate map of groups.
- if (random)
- {
- if (random_groups_.bind (group_id, group) == -1)
- ACE_THROW_RETURN (CORBA::INTERNAL (),
- Load_Balancer::Object_Group::_nil ());
-
- ACE_DEBUG ((LM_DEBUG,
- "Load_Balancer: Created new Random Group"
- " with id <%s>\n", id));
- }
- else
- {
- if (rr_groups_.bind (group_id, group) == -1)
- ACE_THROW_RETURN (CORBA::INTERNAL (),
- Load_Balancer::Object_Group::_nil ());
- ACE_DEBUG ((LM_DEBUG,
- "Load_Balancer: Created new Round Robin Group"
- " with id <%s>\n", id));
- }
- // Return.
- return group._retn ();
- }
-}
-
-Load_Balancer::Object_Group_ptr
-Object_Group_Factory_i::resolve (const char * id
- ACE_ENV_ARG_DECL)
- ACE_THROW_SPEC ((CORBA::SystemException,
- Load_Balancer::no_such_group))
-{
- ACE_CString group_id (id);
- Load_Balancer::Object_Group_var group;
-
- if (rr_groups_.find (group_id, group) == -1
- && random_groups_.find (group_id, group) == -1)
- ACE_THROW_RETURN (Load_Balancer::no_such_group (),
- Load_Balancer::Object_Group::_nil ());
- else
- return group._retn ();
-}
-
-Load_Balancer::Group_List *
-Object_Group_Factory_i::list_groups (int random
- ACE_ENV_ARG_DECL)
-{
- Load_Balancer::Group_List * list;
-
- // Figure out the length of the list.
- CORBA::ULong len;
- if (random)
- len = random_groups_.current_size ();
- else
- len = rr_groups_.current_size ();
-
- // Allocate the list of <len> length.
- ACE_NEW_THROW_EX (list,
- Load_Balancer::Group_List (len),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (list);
- list->length (len);
-
- // Create an iterator for group structure to populate the list.
- Object_Group_Factory_i::HASH_MAP::ITERATOR *group_iter;
- Object_Group_Factory_i::HASH_MAP::ITERATOR random_iter (random_groups_);
- Object_Group_Factory_i::HASH_MAP::ITERATOR rr_iter (rr_groups_);
- if (random)
- group_iter = &random_iter;
- else
- group_iter = &rr_iter;
-
- // Iterate over groups and populate the list.
- Object_Group_Factory_i::HASH_MAP::ENTRY *hash_entry = 0;
- for (CORBA::ULong i = 0; i < len; i++)
- {
- group_iter->next (hash_entry);
- group_iter->advance ();
-
- (*list)[i] = hash_entry->ext_id_.c_str ();
- }
-
- return list;
-}
-
-Load_Balancer::Group_List *
-Object_Group_Factory_i::round_robin_groups (ACE_ENV_SINGLE_ARG_DECL)
- ACE_THROW_SPEC ((CORBA::SystemException))
-{
- return list_groups (0 ACE_ENV_ARG_PARAMETER);
-}
-
-Load_Balancer::Group_List *
-Object_Group_Factory_i::random_groups (ACE_ENV_SINGLE_ARG_DECL)
- ACE_THROW_SPEC ((CORBA::SystemException))
-{
- return list_groups (1 ACE_ENV_ARG_PARAMETER);
-}
-
-Object_Group_i::Object_Group_i (const char * id,
- Object_Group_Factory_i *my_factory)
- : id_ (id),
- my_factory_ (my_factory)
-{
-}
-
-Object_Group_i::~Object_Group_i (void)
-{
- // Need to delete all the items from the member_id_list, to avoid
- // memory leaks.
- Object_Group_i::ITERATOR iter (member_id_list_);
-
- do
- {
- delete (iter.next ());
- } while (iter.advance ());
-}
-
-char *
-Object_Group_i::id (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
- ACE_THROW_SPEC ((CORBA::SystemException))
-{
- return CORBA::string_dup (id_.c_str ());
-}
-
-void
-Object_Group_i::bind (const Load_Balancer::Member & member
- ACE_ENV_ARG_DECL)
- ACE_THROW_SPEC ((CORBA::SystemException,
- Load_Balancer::duplicate_member))
-{
- ACE_CString member_id (member.id);
- CORBA::Object_var obj = CORBA::Object::_duplicate (member.obj.in ());
-
- // Insert new member into <members_> and check for duplicates/failures.
- int result = members_.trybind (member_id, obj);
- if (result == 1)
- ACE_THROW (Load_Balancer::duplicate_member ());
- else if (result == -1)
- ACE_THROW (CORBA::INTERNAL ());
-
- // Insert new member's id into <member_id_list_>.
- ACE_CString *new_id;
- ACE_NEW_THROW_EX (new_id,
- ACE_CString (member.id),
- CORBA::NO_MEMORY ());
- ACE_CHECK;
- if (member_id_list_.insert_tail (new_id) == 0)
- ACE_THROW (CORBA::NO_MEMORY ());
-
- // Theoretically, we should deal with memory failures more
- // thoroughly. But, practically, the whole system is going to be
- // hosed anyways ...
-
- ACE_DEBUG ((LM_DEBUG,
- "Load_Balancer: Added member <%s> to <%s> Group\n",
- member_id.c_str (),
- id_.c_str ()));
-}
-
-void
-Object_Group_i::unbind (const char * id
- ACE_ENV_ARG_DECL)
- ACE_THROW_SPEC ((CORBA::SystemException,
- Load_Balancer::no_such_member))
-{
- ACE_CString member_id (id);
-
- // Code below works iff list and hash map states are consistent,
- // which is the case unless the system experienced major problems,
- // e.g., ran out of memory ...
-
- // 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);
-
- 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 = 0;
- 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 = 0;
- 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 ()));
-}
-