Skip to contentSkip to conversation

sem_wait: Setting a range for time checking.

PATCH In review tangchen 2 participants 3 messages Mar 16, 2011 – Mar 31, 2011 1 message not in the archive

lore
Share & tools
lore

tangchen

author
#0 lore raw

PATCH 1/1 sem_wait: Setting a range for time checking.

Hi,

According to POSIX, many historical implementations (including Version 7 and System V) allow an alarm to occur up to a second early. Other implementations allow alarms up to half a second or one clock tick early or do not allow them to occur early at all. That means, the SIGALRM sent by alarm() could arrive a little earlier. So, even if sem_wait() is blocked, test could still fail.
Setting a range for time checking would be better. When sem_wait() is block and then be interrupted by SIGALRM, if the time is in this range, test is passed.

---
  .../conformance/interfaces/sem_wait/13-1.c         |    6 ++++--
  1 files changed, 4 insertions(+), 2 deletions(-)
(quoted diff) +0 -0

a/testcases/open_posix_testsuite/conformance/interfaces/sem_wait/13-1.c b/testcases/open_posix_testsuite/conformance/interfaces/sem_wait/13-1.c index 7bf547c..f30bba5 100644

testcases/open_posix_testsuite/conformance/interfaces/sem_wait/13-1.c +0 -0
@@ -83,6 +83,8 @@
  /******************************************************************************/
  /***************************    Test case   

***********************************/
/******************************************************************************/
+#define RANGE 1000000 /* 1000000 nsec */
+
sem_t sem;

void handler(int sig)
@@ -163,7 +165,7 @@ int main(int argc, char * argv[])

      }

      if (((ts_fin.tv_sec - ts_ref.tv_sec) * 1000000000) +
-        (ts_fin.tv_nsec - ts_ref.tv_nsec) < 1000000000)
+        (ts_fin.tv_nsec - ts_ref.tv_nsec) < (1000000000 - RANGE))
      {
          output("Ts: %d.%9.9d  ->  %d.%9.9d\n", ts_ref.tv_sec, 
ts_ref.tv_nsec, ts_fin.tv_sec, ts_fin.tv_nsec);
          FAILED("The sem_wait call did not block");

@@ -185,4 +187,4 @@ int main(int argc, char * argv[])
#endif

      PASSED;

-}
\ No newline at end of file
+}

Signature · 18 lines
1.7.1

-- 
Best Regards,
Tang chen
--------------------------------------------------



------------------------------------------------------------------------------
Colocation vs. Managed Hosting
A question and answer guide to determining the best fit
for your organization - today and in the future.
http://p.sf.net/sfu/internap-sfd2d
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
#1 lore raw

Hi!

Quoted 9 lines

According to POSIX, many historical implementations (including Version 7 and System V) allow an alarm to occur up to a second early. Other implementations allow alarms up to half a second or one clock tick early or do not allow them to occur early at all. That means, the SIGALRM sent by alarm() could arrive a little earlier. So, even if sem_wait() is blocked, test could still fail.
Setting a range for time checking would be better. When sem_wait() is block and then be interrupted by SIGALRM, if the time is in this range, test is passed.

Out of curiosity, what system is this? The signal seems to arrives after more than 1 second on all linux boxes that I have.

Signature · 13 lines
Cyril Hrubis
[email protected]

------------------------------------------------------------------------------
Enable your software for Intel(R) Active Management Technology to meet the
growing manageability and security demands of your customers. Businesses
are taking advantage of Intel(R) vPro (TM) technology - will your software 
be a part of the solution? Download the Intel(R) Manageability Checker 
today! http://p.sf.net/sfu/intel-dev2devmar
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

A message that is not in the archive (sent off-list or not yet received): [email protected]

#3 lore raw

Hi!

Quoted 18 lines
Quoted 11 lines
Quoted 9 lines

According to POSIX, many historical implementations (including Version 7 and System V) allow an alarm to occur up to a second early. Other implementations allow alarms up to half a second or one clock tick early or do not allow them to occur early at all. That means, the SIGALRM sent by alarm() could arrive a little earlier. So, even if sem_wait() is blocked, test could still fail.
Setting a range for time checking would be better. When sem_wait() is block and then be interrupted by SIGALRM, if the time is in this range, test is passed.

Out of curiosity, what system is this? The signal seems to arrives after more than 1 second on all linux boxes that I have.

My box is like the following:

OS: RHEL5.5 x86-64.
Memory: 2GB
CPU: Intel(R) Xeon(TM) CPU 3.00GHz (4 CPUs)

Quoted 5 lines

Sometimes it worked normally, but sometimes I got the following messages:

Ts: 1300437153.432960442 -> 1300437154.432457949 Test ../../../conformance/interfaces/sem_wait/13-1.c
FAILED: The sem_wait call did not block

Okay, I've did a little different fix. Now the alarm is set to wait for two seconds and we expects it to last at least one.

Signature · 12 lines
Cyril Hrubis
[email protected]

------------------------------------------------------------------------------
Create and publish websites with WebMatrix
Use the most popular FREE web apps or write code yourself; 
WebMatrix provides all the features you need to develop and 
publish your website. http://p.sf.net/sfu/ms-webmatrix-sf
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list