diff options
Diffstat (limited to 'trunk/TAO/orbsvcs/orbsvcs/Event_Utilities.cpp')
-rw-r--r-- | trunk/TAO/orbsvcs/orbsvcs/Event_Utilities.cpp | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/trunk/TAO/orbsvcs/orbsvcs/Event_Utilities.cpp b/trunk/TAO/orbsvcs/orbsvcs/Event_Utilities.cpp new file mode 100644 index 00000000000..9438282afce --- /dev/null +++ b/trunk/TAO/orbsvcs/orbsvcs/Event_Utilities.cpp @@ -0,0 +1,221 @@ +// $Id$ + +#include "orbsvcs/Event_Utilities.h" +#include "ace/Log_Msg.h" +#include "ace/OS_NS_stdio.h" +#include "ace/OS_NS_string.h" + +#if !defined (__ACE_INLINE__) +#include "orbsvcs/Event_Utilities.inl" +#endif /* __ACE_INLINE__ */ + +ACE_RCSID (orbsvcs, + Event_Utilities, + "$Id$") + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +ACE_ConsumerQOS_Factory:: + ACE_ConsumerQOS_Factory (TAO_EC_Event_Initializer initializer) + : designator_set_ (0), + event_initializer_ (initializer) +{ + qos_.is_gateway = 0; +} + +ACE_ConsumerQOS_Factory::~ACE_ConsumerQOS_Factory (void) +{ +} + +int +ACE_ConsumerQOS_Factory::start_conjunction_group (int nchildren) +{ + int l = qos_.dependencies.length (); + qos_.dependencies.length (l + 1); + if (this->event_initializer_ != 0) + (*this->event_initializer_) (qos_.dependencies[l].event); + qos_.dependencies[l].event.header.type = ACE_ES_CONJUNCTION_DESIGNATOR; + qos_.dependencies[l].event.header.source = nchildren; + qos_.dependencies[l].rt_info = 0; + this->designator_set_ = 1; + return 0; +} + +int +ACE_ConsumerQOS_Factory::start_disjunction_group (int nchildren) +{ + int l = qos_.dependencies.length (); + qos_.dependencies.length (l + 1); + if (this->event_initializer_ != 0) + (*this->event_initializer_) (qos_.dependencies[l].event); + qos_.dependencies[l].event.header.type = ACE_ES_DISJUNCTION_DESIGNATOR; + qos_.dependencies[l].event.header.source = nchildren; + qos_.dependencies[l].rt_info = 0; + this->designator_set_ = 1; + return 0; +} + +int +ACE_ConsumerQOS_Factory::start_logical_and_group (int nchildren) +{ + int l = qos_.dependencies.length (); + qos_.dependencies.length (l + 1); + if (this->event_initializer_ != 0) + (*this->event_initializer_) (qos_.dependencies[l].event); + qos_.dependencies[l].event.header.type = ACE_ES_LOGICAL_AND_DESIGNATOR; + qos_.dependencies[l].event.header.source = nchildren; + qos_.dependencies[l].rt_info = 0; + this->designator_set_ = 1; + return 0; +} + +int +ACE_ConsumerQOS_Factory::start_negation (void) +{ + int l = qos_.dependencies.length (); + qos_.dependencies.length (l + 1); + if (this->event_initializer_ != 0) + (*this->event_initializer_) (qos_.dependencies[l].event); + qos_.dependencies[l].event.header.type = ACE_ES_NEGATION_DESIGNATOR; + qos_.dependencies[l].rt_info = 0; + this->designator_set_ = 1; + return 0; +} + +int +ACE_ConsumerQOS_Factory::start_bitmask (CORBA::ULong source_mask, + CORBA::ULong type_mask) +{ + int l = qos_.dependencies.length (); + qos_.dependencies.length (l + 2); + if (this->event_initializer_ != 0) + { + (*this->event_initializer_) (qos_.dependencies[l].event); + (*this->event_initializer_) (qos_.dependencies[l + 1].event); + } + qos_.dependencies[l].event.header.type = ACE_ES_BITMASK_DESIGNATOR; + qos_.dependencies[l].rt_info = 0; + + qos_.dependencies[l+1].event.header.source = source_mask; + qos_.dependencies[l+1].event.header.type = type_mask; + qos_.dependencies[l+1].rt_info = 0; + + this->designator_set_ = 1; + return 0; +} + +int +ACE_ConsumerQOS_Factory::insert (const RtecEventChannelAdmin::Dependency &subscribe) +{ + // Make sure that a designator is first. + if (designator_set_ == 0) + { + int l = qos_.dependencies.length (); + qos_.dependencies.length (l + 1); + if (this->event_initializer_ != 0) + (*this->event_initializer_) (qos_.dependencies[l].event); + qos_.dependencies[l].rt_info = 0; + qos_.dependencies[l].event.header.type = ACE_ES_GLOBAL_DESIGNATOR; + + this->designator_set_ = 1; + } + + int l = qos_.dependencies.length (); + qos_.dependencies.length (l + 1); + qos_.dependencies[l] = subscribe; + return 0; +} + +void event_debug (const char* p, + const RtecEventComm::Event& event) +{ + size_t l = ACE_OS::strlen (p); + ACE_DEBUG ((LM_DEBUG, + "%*.*s - event.source: %d (0x%x)\n" + "%*.*s event.type: %d (0x%x)\n", + l, l, p, event.header.source, event.header.source, + l, l, p, event.header.type, event.header.type)); +} + +void +ACE_ConsumerQOS_Factory::debug (const RtecEventChannelAdmin::ConsumerQOS& qos) +{ + ACE_DEBUG ((LM_DEBUG, "ConsumerQOS { \n")); + ACE_DEBUG ((LM_DEBUG, " is_gateway: %d\n", qos.is_gateway)); + + for (u_int i = 0; i < qos.dependencies.length (); ++i) + { + char buf[128]; + ACE_OS::sprintf (buf, " dep[%d]", i); + event_debug (buf, qos.dependencies[i].event); + ACE_DEBUG ((LM_DEBUG, "%s rt_info: %d\n", + buf, qos.dependencies[i].rt_info)); + } + ACE_DEBUG ((LM_DEBUG, "}\n")); +} + +// ************************************************************ +ACE_SupplierQOS_Factory:: + ACE_SupplierQOS_Factory (TAO_EC_Event_Initializer initializer, + int qos_max_len) + : event_initializer_ (initializer) +{ + qos_.is_gateway = 0; + + // Allocate the space requested by the application.... + qos_.publications.length (qos_max_len); + + // ... now reset the length, we do not want to use any elements in + // the sequence that have not been initialized.... + qos_.publications.length (0); +} + +int +ACE_SupplierQOS_Factory::insert (RtecEventComm::EventSourceID sid, + RtecEventComm::EventType type, + RtecBase::handle_t rt_info, + u_int ncalls) +{ + CORBA::ULong l = this->qos_.publications.length (); + if (l >= this->qos_.publications.maximum ()) + { + // There is not enough space for the next element, grow the + // buffer. + this->qos_.publications.length (l + 1); + + // @@ TODO We may want to consider more efficient growing + // strategies here, for example, duplicating the size of the + // buffer, or growing in fixed sized chunks... + } + + if (this->event_initializer_ != 0) + (*this->event_initializer_) (qos_.publications[l].event); + this->qos_.publications[l].event.header.source = sid; + this->qos_.publications[l].event.header.type = type; + // TODO: IDL union this->qos_.publications[l].event.data_.lval (0); + this->qos_.publications[l].dependency_info.rt_info = rt_info; + this->qos_.publications[l].dependency_info.number_of_calls = ncalls; + return 0; +} + +void ACE_SupplierQOS_Factory::debug (const RtecEventChannelAdmin::SupplierQOS& qos) +{ + ACE_DEBUG ((LM_DEBUG, "SupplierQOS { \n")); + ACE_DEBUG ((LM_DEBUG, " is_gateway: %d\n", qos.is_gateway)); + + for (u_int i = 0; i < qos.publications.length (); ++i) + { + char buf[128] = { 0 }; + ACE_OS::sprintf (buf, " publications[%d]", i); + event_debug (buf, qos.publications[i].event); + ACE_DEBUG ((LM_DEBUG, + "%s dependency_info.rt_info: %d\n" + "%s dependency_info.number_of_calls: %d\n", + buf, qos.publications[i].dependency_info.rt_info, + buf, qos.publications[i].dependency_info.number_of_calls)); + } + ACE_DEBUG ((LM_DEBUG, "}\n")); + +} + +TAO_END_VERSIONED_NAMESPACE_DECL |