summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.cpp')
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.cpp175
1 files changed, 175 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.cpp
new file mode 100644
index 00000000000..63d7801689e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.cpp
@@ -0,0 +1,175 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.h"
+#include "../Utils/resolve_init.h"
+#include "orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Identification_Service.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Become_Primary_Listener.h"
+#include "../Utils/Log.h"
+
+//#include "../Utils/log_obj_endpoints.h"
+
+ACE_RCSID (EventChannel,
+ GroupInfoPublisher,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+GroupInfoPublisherBase::GroupInfoPublisherBase()
+ : info_(new Info)
+{
+ info_->primary = false;
+}
+
+
+
+void
+GroupInfoPublisherBase::subscribe(TAO_FTEC_Become_Primary_Listener* listener)
+{
+ subscribers_.push_back(listener);
+}
+
+void GroupInfoPublisherBase::set_naming_context(CosNaming::NamingContext_var naming_context)
+{
+ naming_context_ = naming_context;
+}
+
+bool
+GroupInfoPublisherBase::is_primary() const
+{
+ return info_->primary;
+}
+
+CORBA::Object_var
+GroupInfoPublisherBase::group_reference() const
+{
+ return info_->iogr;
+}
+
+FtRtecEventChannelAdmin::EventChannel_var
+GroupInfoPublisherBase::successor() const
+{
+ return info_->successor;
+}
+
+
+
+const GroupInfoPublisherBase::BackupList&
+GroupInfoPublisherBase::backups() const
+{
+ return info_->backups;
+}
+
+
+
+GroupInfoPublisherBase::Info*
+GroupInfoPublisherBase::setup_info(const FTRT::ManagerInfoList & info_list,
+ int my_position,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL)
+{
+ Info_ptr result(new Info);
+
+ result->primary = (my_position == 0);
+
+ /// create the object group
+ size_t len = info_list.length();
+
+ TAO_IOP::TAO_IOR_Manipulation::IORList iors;
+ iors.length(len);
+
+ size_t i;
+ for (i = 0; i < len; ++i) {
+ iors[i] = CORBA::Object::_duplicate(info_list[i].ior.in());
+ }
+
+ CORBA::Object_var obj =
+ IOGR_Maker::instance()->make_iogr(iors,object_group_ref_version
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ result->iogr =
+ ::FtRtecEventChannelAdmin::EventChannel::_narrow(obj.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ ACE_DEBUG((LM_DEBUG, "In setup_info\n"));
+ //log_obj_endpoints(result->iogr.in());
+
+ /// check if sucessor changed
+ size_t successors_length = info_list.length() - my_position -1;
+
+ if (successors_length /*!= info_->backups.length() */) {
+ // successor changed, update successor
+ iors.length(successors_length);
+ for (i = 0; i < successors_length; ++i) {
+ iors[i] = CORBA::Object::_duplicate(info_list[i+ my_position+1].ior.in());
+ }
+
+ obj = IOGR_Maker::instance()->merge_iors(iors
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ result->successor =
+ FtRtecEventChannelAdmin::EventChannel::_narrow(obj.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ }
+ /*
+ else {
+ result->successor = info_->successor;
+ }
+
+ if (!CORBA::is_nil(result->successor.in()))
+ {
+ CORBA::PolicyList_var pols;
+ result->successor->_validate_connection (pols.out ());
+ }
+ */
+
+ // update backups
+ result->backups.length(successors_length);
+ for (i = 0; i < successors_length; ++i) {
+ result->backups[i] =
+ FtRtecEventChannelAdmin::EventChannel::_narrow(
+ info_list[i+ my_position+1].ior.in()
+ ACE_ENV_ARG_PARAMETER);
+ //CORBA::PolicyList_var pols;
+ //result->backups[i]->_validate_connection (pols.out ());
+ ACE_CHECK_RETURN(0);
+ }
+ return result.release();
+}
+
+void
+GroupInfoPublisherBase::update_info(GroupInfoPublisherBase::Info_ptr& info)
+{
+ if (info->primary) {
+ if (!info_->primary) {
+ // now we become the primary, notify the subscribers
+ for (size_t i = 0; i < subscribers_.size(); ++i)
+ subscribers_[i]->become_primary();
+ }
+
+ if (!CORBA::is_nil(naming_context_.in())) {
+ TAO_FTRTEC::Log(1, "Registering to the Name Service\n");
+ ACE_TRY_NEW_ENV {
+ naming_context_->rebind(FTRTEC::Identification_Service::instance()->name(),
+ info->iogr.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL {
+ /// there's nothing we can do if the naming service is down
+ }
+ ACE_ENDTRY;
+ }
+ }
+ info_ = info;
+}
+
+#if defined (ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION)
+template ACE_Singleton<GroupInfoPublisherBase, ACE_Thread_Mutex> *ACE_Singleton<GroupInfoPublisherBase, ACE_Thread_Mutex>::singleton_;
+#endif /* ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION */
+
+TAO_END_VERSIONED_NAMESPACE_DECL