[Ace-users] Re: [ace-bugs] Bug with ACE_OS::sema_wait (ACE_sema_t
*s,
ACE_Time_Value &tv) when ACE_USES_WINCE_SEMA_SIMULATION is defined
Steve Huston
shuston at riverace.com
Wed Jun 20 16:29:00 CDT 2007
Hi Shaolong,
Thank you for the PROBLEM-REPORT-FORM. Can you please try the below
fix and let me know how this goes?
Thanks,
-Steve
Index: OS_NS_Thread.inl
===================================================================
--- OS_NS_Thread.inl (revision 78573)
+++ OS_NS_Thread.inl (working copy)
@@ -2352,12 +2352,21 @@
// timeout. In that case, we'll need to restart the process with
// updated timeout value.
- // <tv> is an absolute time
- ACE_Time_Value relative_time = tv - ACE_OS::gettimeofday ();
+ // tv is an absolute time, but we need relative to work with the
Windows
+ // API. Also, some users have become accustomed to using a 0 time
value
+ // as a shortcut for "now", which works on non-Windows because 0 is
+ // always earlier than now. However, the need to convert to
relative time
+ // means we need to watch out for this case.
+ ACE_Time_Value end_time = tv;
+ if (tv == ACE_Time_Value::zero)
+ end_time = ACE_OS::gettimeofday ();
+ ACE_Time_Value relative_time = end_time - ACE_OS::gettimeofday ();
int result = -1;
- // While we are not timeout yet.
- while (relative_time > ACE_Time_Value::zero)
+ // While we are not timeout yet. >= 0 will let this go through once
+ // and if not able to get the object, it should hit WAIT_TIMEOUT
+ // right away.
+ while (relative_time >= ACE_Time_Value::zero)
{
// Wait for our turn to get the object.
switch (::WaitForSingleObject (s->count_nonzero_,
relative_time.msec ()))
@@ -2402,7 +2411,7 @@
// Haven't been able to get the semaphore yet, update the
// timeout value to reflect the remaining time we want to wait.
- relative_time = tv - ACE_OS::gettimeofday ();
+ relative_time = end_time - ACE_OS::gettimeofday ();
}
// We have timed out.
--
Steve Huston, Riverace Corporation
Would you like ACE to run great on your platform?
See http://www.riverace.com/sponsor.htm
-----Original Message-----
From: ace-bugs-bounces at cse.wustl.edu
[mailto:ace-bugs-bounces at cse.wustl.edu] On Behalf Of shaolong xiang
Sent: Tuesday, May 22, 2007 1:02 AM
To: ace-bugs at cse.wustl.edu
Subject: [ace-bugs] Bug with ACE_OS::sema_wait (ACE_sema_t
*s,ACE_Time_Value &tv) when ACE_USES_WINCE_SEMA_SIMULATION is defined
HOST MACHINE:ArmVi and Windows Mobile 5.0: WINSOCK 2
THE $ACE_ROOT/ace/win32- config.h
AREA/CLASS/EXAMPLE AFFECTED:
ACE_OS::sema_wait (ACE_sema_t *s, ACE_Time_Value &tv) is bugged when
WINCE is defined
Semaphore simulation might be inaccurate.
DOES THE PROBLEM AFFECT:
EXECUTION?
Application blocks in ACE_OS::sema_wait when wait time is specified as
ACE_Time_Value(0,0).
SYNOPSIS:
>From what I understand, application should return immediately when
tv, ie. wait time is specified as ACE_Time_Value(0,0).
This happens in the case when !defined ACE_USES_WINCE_SEMA_SIMULATION
because of the check below
if (tv.sec () == 0 && tv.usec () == 0)
msec_timeout = 0; // Do a "poll."
However, such a check is missing when defined
ACE_USES_WINCE_SEMA_SIMULATION.
Function goes straight on to calculate relative time.
ACE_Time_Value relative_time = tv - ACE_OS::gettimeofday ();
relative_time becomes negative because we have 0 - timeofday.
Even though it is negative,
while (relative_time > ACE_Time_Value::zero) is true.
Then the function blocks for the negative waiting time which seems
like forever.
SAMPLE FIX/WORKAROUND:
Do a check,
if (tv.sec () == 0 && tv.usec () == 0) relative_time =
ACE_Time_Value::zero.
More information about the Ace-users
mailing list