summaryrefslogtreecommitdiff
path: root/ace/Timer_Queue_Adapters.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ace/Timer_Queue_Adapters.cpp')
-rw-r--r--ace/Timer_Queue_Adapters.cpp31
1 files changed, 23 insertions, 8 deletions
diff --git a/ace/Timer_Queue_Adapters.cpp b/ace/Timer_Queue_Adapters.cpp
index 13489a858a2..00f21d10ff3 100644
--- a/ace/Timer_Queue_Adapters.cpp
+++ b/ace/Timer_Queue_Adapters.cpp
@@ -1,14 +1,14 @@
// $Id$
+#ifndef ACE_TIMER_QUEUE_ADAPTERS_CPP
+#define ACE_TIMER_QUEUE_ADAPTERS_CPP
+
#include "ace/Timer_Queue_Adapters.h"
#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
-#ifndef ACE_TIMER_QUEUE_ADAPTERS_CPP
-#define ACE_TIMER_QUEUE_ADAPTERS_CPP
-
# if !defined (__ACE_INLINE__)
# include "ace/Timer_Queue_Adapters.inl"
# endif /* __ACE_INLINE__ */
@@ -16,6 +16,8 @@
#include "ace/OS_NS_unistd.h"
#include "ace/OS_NS_sys_time.h"
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+
template <class TQ> TQ &
ACE_Async_Timer_Queue_Adapter<TQ>::timer_queue (void)
{
@@ -256,11 +258,19 @@ ACE_Thread_Timer_Queue_Adapter<TQ>::svc (void)
{
// Compute the remaining time, being careful not to sleep
// for "negative" amounts of time.
- ACE_Time_Value tv = this->timer_queue_->earliest_time ();
-
- // ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("waiting until %u.%3.3u secs\n"),
- // tv.sec(), tv.msec()));
- this->condition_.wait (&tv);
+ const ACE_Time_Value tv_curr = this->timer_queue_->gettimeofday ();
+ const ACE_Time_Value tv_earl = this->timer_queue_->earliest_time ();
+
+ if (tv_earl > tv_curr)
+ {
+ // The earliest time on the Timer_Queue is in future, so
+ // use ACE_OS::gettimeofday() to convert the tv to the
+ // absolute time.
+ const ACE_Time_Value tv = ACE_OS::gettimeofday () + (tv_earl - tv_curr);
+ // ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("waiting until %u.%3.3u secs\n"),
+ // tv.sec(), tv.msec()));
+ this->condition_.wait (&tv);
+ }
}
// Expire timers anyway, at worst this is a no-op.
@@ -290,6 +300,9 @@ ACE_Thread_Timer_Queue_Adapter<TQ>::activate (long flags,
// Macros to avoid "warning: unused parameter" type warning.
ACE_UNUSED_ARG (thread_handles);
+ // Make sure to set this flag in case we were deactivated earlier.
+ this->active_ = 1;
+
// Make sure that we only allow a single thread to be spawned for
// our adapter. Otherwise, too many weird things can happen.
return ACE_Task_Base::activate (flags, 1, 0, priority, grp_id, task, 0,
@@ -340,4 +353,6 @@ ACE_Thread_Timer_Queue_Adapter<TQ>::dispatch_commands (void)
# endif /* ACE_HAS_DEFERRED_TIMER_COMMANDS */
+ACE_END_VERSIONED_NAMESPACE_DECL
+
#endif /* ACE_TIMER_QUEUE_ADAPTERS_CPP */