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.



git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12452 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/helgrind/tests/annotate_hbefore.c b/helgrind/tests/annotate_hbefore.c
index 5f96942..af3fa04 100644
--- a/helgrind/tests/annotate_hbefore.c
+++ b/helgrind/tests/annotate_hbefore.c
@@ -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;
 }