|
From: <sv...@va...> - 2012-03-19 20:19:30
|
philippe 2012-03-19 20:19:23 +0000 (Mon, 19 Mar 2012)
New Revision: 12452
Log:
Modify test so that scheduling events are generated.
Even without fair scheduling, this ensures the progress
of each thread.
This avoids the test looping forever in an outer/inner
setup.
Modified files:
trunk/helgrind/tests/annotate_hbefore.c
Modified: trunk/helgrind/tests/annotate_hbefore.c (+15 -7)
===================================================================
--- trunk/helgrind/tests/annotate_hbefore.c 2012-03-19 13:22:21 +00:00 (rev 12451)
+++ trunk/helgrind/tests/annotate_hbefore.c 2012-03-19 20:19:23 +00:00 (rev 12452)
@@ -235,10 +235,18 @@
int shared_var = 0; // is not raced upon
-void delay500ms ( void )
+void delayXms ( int i )
{
- struct timespec ts = { 0, 500 * 1000 * 1000 };
- nanosleep(&ts, NULL);
+ struct timespec ts = { 0, 1 * 1000 * 1000 };
+ // We do the sleep in small pieces to have scheduling
+ // events ensuring a fair switch between threads, even
+ // without --fair-sched=yes. This is a.o. needed for
+ // running this test under an outer helgrind or an outer
+ // sgcheck.
+ while (i > 0) {
+ nanosleep(&ts, NULL);
+ i--;
+ }
}
void do_wait ( UWord* w )
@@ -246,7 +254,7 @@
UWord w0 = *w;
UWord volatile * wV = w;
while (*wV == w0)
- ;
+ delayXms(1); // small sleeps, ensuring context switches
ANNOTATE_HAPPENS_AFTER(w);
}
@@ -261,11 +269,11 @@
void* thread_fn1 ( void* arg )
{
UWord* w = (UWord*)arg;
- delay500ms(); // ensure t2 gets to its wait first
+ delayXms(500); // ensure t2 gets to its wait first
shared_var = 1; // first access
do_signal(w); // cause h-b edge to second thread
- delay500ms();
+ delayXms(500);
return NULL;
}
@@ -275,7 +283,7 @@
do_wait(w); // wait for h-b edge from first thread
shared_var = 2; // second access
- delay500ms();
+ delayXms(500);
return NULL;
}
|