Index: benchmark/schedext/cfa1.cfa
===================================================================
--- benchmark/schedext/cfa1.cfa	(revision 2316525c0ab1029715c0c8bc2f6fe53ca84525fe)
+++ benchmark/schedext/cfa1.cfa	(revision 7ac3151ffdbb4779f79b19e57c4c6ce4e353b491)
@@ -6,23 +6,17 @@
 #include "../bench.h"
 
-volatile int go = 0;
-
 monitor M {} m1;
 
 void __attribute__((noinline)) call( M & mutex p1 ) {}
-
 void __attribute__((noinline)) wait( M & mutex p1 ) {
-	go = 1;
 	for ( times ) {
 		waitfor( call : p1 );
 	}
-	go = 0;
 }
 
 thread T {};
 void main( T & ) {
-	while ( go == 0 ) { yield(); }
 	BENCH(
-		while ( go == 1 ) { call( m1 ); },
+		for ( times ) { call( m1 ); },
 		result
 	)
Index: benchmark/schedext/cfa2.cfa
===================================================================
--- benchmark/schedext/cfa2.cfa	(revision 2316525c0ab1029715c0c8bc2f6fe53ca84525fe)
+++ benchmark/schedext/cfa2.cfa	(revision 7ac3151ffdbb4779f79b19e57c4c6ce4e353b491)
@@ -4,25 +4,20 @@
 #include <stdio.h>
 
-#include "bench.h"
-
-volatile int go = 0;
+#include "../bench.h"
 
 monitor M {} m1, m2;
 
 void __attribute__((noinline)) call( M & mutex p1, M & mutex p2 ) {}
-
 void __attribute__((noinline)) wait( M & mutex p1, M & mutex p2 ) {
-	go = 1;
 	for ( times ) {
 		waitfor( call : p1, p2 );
 	}
-	go = 0;
 }
-
 thread T {};
 void main( T & ) {
-	while( go == 0 ) { yield(); }
 	BENCH(
-		while ( go == 1 ) { call( m1, m2 ); },
+		for ( times ) {
+			call( m1, m2 );
+		},
 		result
 	)
Index: benchmark/schedext/cfa4.cfa
===================================================================
--- benchmark/schedext/cfa4.cfa	(revision 2316525c0ab1029715c0c8bc2f6fe53ca84525fe)
+++ benchmark/schedext/cfa4.cfa	(revision 7ac3151ffdbb4779f79b19e57c4c6ce4e353b491)
@@ -4,25 +4,20 @@
 #include <stdio.h>
 
-#include "bench.h"
-
-volatile int go = 0;
+#include "../bench.h"
 
 monitor M {} m1, m2, m3, m4;
 
 void __attribute__((noinline)) call( M & mutex p1, M & mutex p2, M & mutex p3, M & mutex p4 ) {}
-
 void __attribute__((noinline)) wait( M & mutex p1, M & mutex p2, M & mutex p3, M & mutex p4 ) {
-	go = 1;
 	for ( times ) {
 		waitfor( call : p1, p2, p3, p4 );
 	}
-	go = 0;
 }
-
 thread T {};
 void main( T & ) {
-	while( go == 0 ) { yield(); }
 	BENCH(
-		while( go == 1 ) { call( m1, m2, m3, m4 ); },
+		for ( times ) {
+			call( m1, m2, m3, m4 );
+		},
 		result
 	)
Index: benchmark/schedext/goroutine.go
===================================================================
--- benchmark/schedext/goroutine.go	(revision 7ac3151ffdbb4779f79b19e57c4c6ce4e353b491)
+++ benchmark/schedext/goroutine.go	(revision 7ac3151ffdbb4779f79b19e57c4c6ce4e353b491)
@@ -0,0 +1,42 @@
+package main
+
+import (
+	"fmt"
+	"time"
+	"os"
+	"strconv"
+)
+
+func main() {
+	shake := make( chan bool )
+	ch := make( chan int )
+
+	acceptor := func(times int) {
+		var v int
+		v += 1 // need usage
+		for i := 0; i < times; i += 1 {
+			select {
+				case v = <- ch :
+			}
+		}
+		shake <- true   // indicate completion
+	}
+
+	var times int = 10000000
+	if len( os.Args ) > 2 { os.Exit( 1 ) }
+	if len( os.Args ) == 2 { times, _ = strconv.Atoi(os.Args[1]) }
+
+	go acceptor( times )
+	start := time.Now()
+	for i := 0; i < times; i += 1 {
+		ch <- 1
+	}
+	end := time.Now()
+	fmt.Printf("%d\n", end.Sub(start) / time.Duration(times))
+	<- shake
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "go run goroutine.go" //
+// End: //
Index: benchmark/schedext/upp.cc
===================================================================
--- benchmark/schedext/upp.cc	(revision 2316525c0ab1029715c0c8bc2f6fe53ca84525fe)
+++ benchmark/schedext/upp.cc	(revision 7ac3151ffdbb4779f79b19e57c4c6ce4e353b491)
@@ -3,17 +3,11 @@
 #include "bench.h"
 
-volatile int go = 0;
-
 _Monitor M {
 public:
 	void __attribute__((noinline)) call() {}
-
-	int __attribute__((noinline)) wait() {
-		go = 1;
+	void __attribute__((noinline)) wait() {
 		for ( size_t i = 0; i < times; i++ ) {
 			_Accept(call);
 		}
-		go = 0;
-		return 0;
 	}
 } m;
@@ -21,7 +15,8 @@
 _Task T {
 	void main() {
-		while ( go == 0 ) { yield(); }
 		BENCH(
-			while ( go == 1 ) { m.call(); },
+			for ( size_t i = 0; i < times; i++ ) {
+				m.call();
+			},
 			result
 		)
@@ -33,5 +28,5 @@
 	BENCH_START()
 	T t;
-	return m.wait();
+	m.wait();
 }
 
