diff options
Diffstat (limited to 'trunk/TAO/tao/Transport_Queueing_Strategies.cpp')
-rw-r--r-- | trunk/TAO/tao/Transport_Queueing_Strategies.cpp | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/trunk/TAO/tao/Transport_Queueing_Strategies.cpp b/trunk/TAO/tao/Transport_Queueing_Strategies.cpp new file mode 100644 index 00000000000..fbf6595904a --- /dev/null +++ b/trunk/TAO/tao/Transport_Queueing_Strategies.cpp @@ -0,0 +1,229 @@ +// $Id$ + +#include "tao/Transport_Queueing_Strategies.h" +#include "tao/Buffering_Constraint_Policy.h" +#include "tao/Stub.h" +#include "tao/debug.h" + +#include "ace/Log_Msg.h" +#include "ace/OS_NS_sys_time.h" + +ACE_RCSID (tao, + Transport_Queueing_Strategies, + "$Id$") + + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +namespace TAO +{ + Transport_Queueing_Strategy::~Transport_Queueing_Strategy (void) + { + } + +// **************************************************************** + + bool + Default_Transport_Queueing_Strategy::must_queue (bool) const + { + return false; + } + + bool + Default_Transport_Queueing_Strategy::buffering_constraints_reached ( + TAO_Stub *, + size_t , + size_t , + bool &must_flush, + const ACE_Time_Value &, + bool &set_timer, + ACE_Time_Value &) const + { + set_timer = false; + must_flush = false; + return true; + } + +// **************************************************************** + + bool + Flush_Transport_Queueing_Strategy::must_queue (bool) const + { + return false; + } + + bool + Flush_Transport_Queueing_Strategy::buffering_constraints_reached ( + TAO_Stub *, + size_t , + size_t , + bool &must_flush, + const ACE_Time_Value &, + bool &set_timer, + ACE_Time_Value &) const + { + set_timer = false; + must_flush = true; + return true; + } + +// **************************************************************** + + #if (TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1) + + bool + Eager_Transport_Queueing_Strategy::must_queue (bool) const + { + return true; + } + + bool + Eager_Transport_Queueing_Strategy::buffering_constraints_reached ( + TAO_Stub *stub, + size_t msg_count, + size_t total_bytes, + bool &must_flush, + const ACE_Time_Value ¤t_deadline, + bool &set_timer, + ACE_Time_Value &new_deadline) const + { + must_flush = false; + set_timer = false; + + TAO::BufferingConstraint buffering_constraint; + + ACE_TRY_NEW_ENV + { + CORBA::Policy_var bcp_policy = + stub->get_cached_policy (TAO_CACHED_POLICY_BUFFERING_CONSTRAINT + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + TAO::BufferingConstraintPolicy_var bcpv = + TAO::BufferingConstraintPolicy::_narrow (bcp_policy.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + TAO_Buffering_Constraint_Policy* bcp = + dynamic_cast<TAO_Buffering_Constraint_Policy *> (bcpv.in ()); + if (bcp == 0) + { + return true; + } + bcp->get_buffering_constraint (buffering_constraint); + } + ACE_CATCHANY + { + return true; + } + ACE_ENDTRY; + + + if (buffering_constraint.mode == TAO::BUFFER_FLUSH) + { + must_flush = true; + return true; + } + + bool constraints_reached = false; + + if (ACE_BIT_ENABLED (buffering_constraint.mode, + TAO::BUFFER_MESSAGE_COUNT) + && msg_count >= buffering_constraint.message_count) + { + constraints_reached = true; + } + + if (ACE_BIT_ENABLED (buffering_constraint.mode, + TAO::BUFFER_MESSAGE_BYTES) + && total_bytes >= buffering_constraint.message_bytes) + { + constraints_reached = true; + } + + if (this->timer_check (buffering_constraint, + current_deadline, + set_timer, + new_deadline)) + { + constraints_reached = true; + } + + return constraints_reached; + } + + bool + Eager_Transport_Queueing_Strategy::timer_check ( + const TAO::BufferingConstraint &buffering_constraint, + const ACE_Time_Value ¤t_deadline, + bool &set_timer, + ACE_Time_Value &new_deadline) const + { + set_timer = false; + + if (!ACE_BIT_ENABLED (buffering_constraint.mode, + TAO::BUFFER_TIMEOUT)) + { + return false; + } + + // Compute the next deadline... + ACE_Time_Value now = ACE_OS::gettimeofday (); + ACE_Time_Value timeout = + this->time_conversion (buffering_constraint.timeout); + new_deadline = now + timeout; + + // Check if the new deadline is more stringent, or if the deadline + // has expired and thus must be reset anyway. + if (current_deadline > new_deadline + || current_deadline < now) + { + set_timer = true; + } + + // ... if there is no deadline we don't want to schedule output (the + // deadline will be set because set_timer is set to 1 in that case). + // If there is a deadline but but it has not been reached, we + // don't want to schedule any output either... + if (current_deadline == ACE_Time_Value::zero + || current_deadline >= now) + { + return false; + } + + if (TAO_debug_level > 6) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - TAO_Eager_Buffering_Sync_Strategy::timer_check, " + "Now = %u, Current = %u, New = %u\n", + now.msec (), current_deadline.msec (), + new_deadline.msec ())); + } + + return true; + } + + ACE_Time_Value + Eager_Transport_Queueing_Strategy::time_conversion ( + const TimeBase::TimeT &time) const + { + TimeBase::TimeT seconds = time / 10000000u; + TimeBase::TimeT microseconds = (time % 10000000u) / 10; + return ACE_Time_Value (ACE_U64_TO_U32 (seconds), + ACE_U64_TO_U32 (microseconds)); + } + +// **************************************************************** + + bool + Delayed_Transport_Queueing_Strategy::must_queue (bool queue_empty) const + { + // If the queue is empty we want to send immediately + return !queue_empty; + } + + #endif /* TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1 */ + +} + +TAO_END_VERSIONED_NAMESPACE_DECL |