Index: src/tests/sched-int-wait.c
===================================================================
--- src/tests/sched-int-wait.c	(revision 9737ffeba379a793d918a4f50f36c0869f7e64ff)
+++ src/tests/sched-int-wait.c	(revision 19801aa0dcfe89d8ca8f114f1b8f4d0ec4642a29)
@@ -4,4 +4,6 @@
 #include <stdlib>
 #include <thread>
+
+static const int N = 10_000;
 
 monitor global_t {};
@@ -13,15 +15,5 @@
 condition condAB, condAC, condBC, condABC;
 
-thread Signaler {
-	int signals[4];
-};
-
-void ?{}( Signaler * this ){
-	this->signals[0] = 0;
-	this->signals[1] = 0;
-	this->signals[2] = 0;
-	this->signals[3] = 0;
-}
-
+thread Signaler {};
 thread WaiterAB {};
 thread WaiterAC {};
@@ -29,5 +21,5 @@
 thread WaiterABC{};
 
-volatile bool done;
+volatile int waiter_left;
 
 //----------------------------------------------------------------------------------------------------
@@ -53,23 +45,6 @@
 void main( Signaler* this ) {
 
-	while( true ) {
-		int action = (unsigned)rand48() % 4;
-		bool finished = true;
-
-		for(int i = 0; i < 4; i++) {
-			if( this->signals[action] < 10_000 ) {
-				finished = false;
-				break;
-			}
-			else {
-				action = (action + 1) % 4;
-			}
-		}
-
-		this->signals[action]++;
-		if( finished ) break;
-
-		//sout | action | this->signals[0] | this->signals[1] | this->signals[2] | this->signals[3] | endl;
-
+	while( waiter_left != 0 ) {
+		unsigned action = (unsigned)rand48() % 4;
 		switch( action ) {
 			case 0: 
@@ -89,4 +64,5 @@
 				abort();
 		}
+		yield();
 	}	
 }
@@ -95,7 +71,9 @@
 // Waiter ABC
 void main( WaiterABC* this ) {
-	while( !done ) {
+	for( int i = 0; i < N; i++ ) {
 		wait( &condABC, &globalA, &globalB, &globalC );
 	}
+
+	__sync_fetch_and_sub_4( &waiter_left, 1);
 }
 
@@ -103,7 +81,9 @@
 // Waiter AB
 void main( WaiterAB* this ) {
-	while( !done ) {
+	for( int i = 0; i < N; i++ ) {
 		wait( &condAB , &globalA, &globalB );
 	}
+
+	__sync_fetch_and_sub_4( &waiter_left, 1);
 }
 
@@ -111,7 +91,9 @@
 // Waiter AC
 void main( WaiterAC* this ) {
-	while( !done ) {
+	for( int i = 0; i < N; i++ ) {
 		wait( &condAC , &globalA, &globalC );
 	}
+
+	__sync_fetch_and_sub_4( &waiter_left, 1);
 }
 
@@ -119,7 +101,9 @@
 // Waiter BC
 void main( WaiterBC* this ) {
-	while( !done ) {
+	for( int i = 0; i < N; i++ ) {
 		wait( &condBC , &globalB, &globalC );
 	}
+
+	__sync_fetch_and_sub_4( &waiter_left, 1);
 }
 
@@ -127,19 +111,14 @@
 // Main
 int main(int argc, char* argv[]) {
-	done = false;
+	waiter_left = 4;
 	processor p;
 	{
-		WaiterABC a;
-		WaiterAB  b;
-		WaiterBC  c;
-		WaiterAC  d;
+		Signaler  e;
 		{
-			Signaler  e;
+			WaiterABC a;
+			WaiterAB  b;
+			WaiterBC  c;
+			WaiterAC  d;
 		}
-		done = true;
-		signal( &condABC, &globalA, &globalB, &globalC );
-		signal( &condAB , &globalA, &globalB );
-		signal( &condBC , &globalB, &globalC );
-		signal( &condAC , &globalA, &globalC );
 	}
 }
