Index: benchmark/Makefile.am
===================================================================
--- benchmark/Makefile.am	(revision c12869e252446e2346b620e01a91c06700f67b70)
+++ benchmark/Makefile.am	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 09:08:15 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Mon Jan 20 11:50:13 2020
-## Update Count     : 244
+## Last Modified On : Tue Jan 21 17:56:31 2020
+## Update Count     : 250
 ###############################################################################
 
@@ -75,9 +75,9 @@
 .ONESHELL:		# use one shell to execute recipe
 .NOTPARALLEL:
-.PHONY: compile.csv basic.csv ctxswitch.csv mutex.csv signal.csv
-
-## =========================================================================================================
-
-all : basic$(EXEEXT) ctxswitch$(EXEEXT) mutex$(EXEEXT) signal$(EXEEXT) waitfor$(EXEEXT) creation$(EXEEXT)
+.PHONY: compile.csv basic.csv ctxswitch.csv mutex.csv schedint.csv
+
+## =========================================================================================================
+
+all : basic$(EXEEXT) ctxswitch$(EXEEXT) mutex$(EXEEXT) schedint$(EXEEXT) schedext$(EXEEXT) creation$(EXEEXT)
 
 basic_loop_DURATION = 15000000000
@@ -91,16 +91,17 @@
 ctxswitch_DURATION = 100000000
 
-mutex_java_DURATION = 10000000
+#mutex_java_DURATION = 10000000
 mutex_DURATION = 50000000
 
-signal_pthread_DURATION = 1000000
-signal_java_DURATION = $(signal_pthread_DURATION)
-signal_rust_DURATION = $(signal_pthread_DURATION)
-signal_DURATION = 10000000
-
-waitfor_DURATION = 10000000
+schedint_pthread_DURATION = 1000000
+schedint_java_DURATION = $(schedint_pthread_DURATION)
+schedint_rust_DURATION = $(schedint_pthread_DURATION)
+schedint_DURATION = 10000000
+
+schedext_DURATION = 10000000
 
 creation_pthread_DURATION = 250000
-creation_rust_DURATION = ${creation_pthread_DURATION}
+creation_rust_thread_DURATION = ${creation_pthread_DURATION}
+creation_java_thread_DURATION = ${creation_pthread_DURATION}
 creation_cfa_coroutine_DURATION = 100000000
 creation_cfa_coroutine_eager_DURATION = 10000000
@@ -151,6 +152,6 @@
 	+make mutex.csv
 	-+make mutex.diff.csv
-	+make signal.csv
-	-+make signal.diff.csv
+	+make schedint.csv
+	-+make schedint.diff.csv
 @DOifskipcompile@
 	cat compile.csv
@@ -163,6 +164,6 @@
 	cat mutex.csv
 	-cat mutex.diff.csv
-	cat signal.csv
-	-cat signal.diff.csv
+	cat schedint.csv
+	-cat schedint.diff.csv
 
 compile.csv:
@@ -198,10 +199,10 @@
 	$(srcdir)/fixcsv.sh $@
 
-signal.csv:
-	echo "signal-1,signal-2,waitfor-1,waitfor-2" > $@
-	+make signal-cfa1.runquiet >> $@ && echo -n ',' >> $@
-	+make signal-cfa2.runquiet >> $@ && echo -n ',' >> $@
-	+make waitfor-cfa1.runquiet >> $@ && echo -n ',' >> $@
-	+make waitfor-cfa2.runquiet >> $@
+schedint.csv:
+	echo "schedint-1,schedint-2,schedext-1,schedext-2" > $@
+	+make schedint-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	+make schedint-cfa2.runquiet >> $@ && echo -n ',' >> $@
+	+make schedext-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	+make schedext-cfa2.runquiet >> $@
 	$(srcdir)/fixcsv.sh $@
 
@@ -351,60 +352,66 @@
 ## =========================================================================================================
 
-signal$(EXEEXT) :		\
-	signal-cfa1.run		\
-	signal-cfa2.run		\
-	signal-cfa4.run		\
-	signal-upp.run		\
-	signal-rust.run		\
-	signal-java.run		\
-	signal-pthread.run
-
-signal-pthread$(EXEEXT):
+schedint$(EXEEXT) :		\
+	schedint-cfa1.run	\
+	schedint-cfa2.run	\
+	schedint-cfa4.run	\
+	schedint-upp.run	\
+	schedint-rust.run	\
+	schedint-java.run	\
+	schedint-pthread.run
+
+schedint-cfa1$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa1.cfa
+
+schedint-cfa2$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa2.cfa
+
+schedint-cfa4$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa4.cfa
+
+schedint-upp$(EXEEXT):
+	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/schedint/upp.cc
+
+schedint-rust$(EXEEXT):
+	$(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/schedint/rust.rs
+
+schedint-java$(EXEEXT):
+	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/schedint/JavaThread.java
+	echo "#!/bin/sh" > a.out
+	echo "java JavaThread" >> a.out
+	chmod a+x a.out
+
+schedint-pthread$(EXEEXT):
 	$(BENCH_V_CC)$(COMPILE) $(srcdir)/schedint/pthreads.c
 
-signal-upp$(EXEEXT):
-	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/schedint/upp.cc
-
-signal-cfa1$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa1.cfa
-
-signal-cfa2$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa2.cfa
-
-signal-cfa4$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa4.cfa
-
-signal-rust$(EXEEXT):
-	$(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/schedint/rust.rs
-
-signal-java$(EXEEXT):
-	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/schedint/JavaThread.java
-	echo "#!/bin/sh" > a.out
-	echo "java JavaThread" >> a.out
-	chmod a+x a.out
-
-## =========================================================================================================
-
-waitfor$(EXEEXT) :		\
-	waitfor-cfa1.run	\
-	waitfor-cfa2.run	\
-	waitfor-cfa4.run	\
-	waitfor-upp.run
-
-waitfor-upp$(EXEEXT):
+## =========================================================================================================
+
+schedext$(EXEEXT) :		\
+	schedext-cfa1.run	\
+	schedext-cfa2.run	\
+	schedext-cfa4.run	\
+	schedext-upp.run	\
+	schedext-goroutine.run
+
+schedext-cfa1$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa1.cfa
+
+schedext-cfa2$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa2.cfa
+
+schedext-cfa4$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa4.cfa
+
+schedext-upp$(EXEEXT):
 	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/schedext/upp.cc
 
-waitfor-cfa1$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa1.cfa
-
-waitfor-cfa2$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa2.cfa
-
-waitfor-cfa4$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa4.cfa
+schedext-goroutine$(EXEEXT):
+	$(BENCH_V_GOC)go build -o a.out $(srcdir)/schedext/goroutine.go
+
 
 ## =========================================================================================================
 
 creation$(EXEEXT) :				\
+	creation-cfa_generator.run		\
 	creation-cfa_coroutine.run		\
 	creation-cfa_coroutine_eager.run	\
@@ -419,4 +426,7 @@
 	creation-pthread.run
 
+creation-cfa_generator$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_gen.cfa
+
 creation-cfa_coroutine$(EXEEXT):
 	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_cor.cfa
@@ -450,5 +460,5 @@
 	$(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/creation/rust_thrd.rs
 
-creation-java$(EXEEXT):
+creation-java_thread$(EXEEXT):
 	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/creation/JavaThread.java
 	echo "#!/bin/sh" > a.out
Index: benchmark/Makefile.in
===================================================================
--- benchmark/Makefile.in	(revision c12869e252446e2346b620e01a91c06700f67b70)
+++ benchmark/Makefile.in	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -427,13 +427,15 @@
 ctxswitch_cfa_generator_DURATION = 5000000000
 ctxswitch_DURATION = 100000000
-mutex_java_DURATION = 10000000
+
+#mutex_java_DURATION = 10000000
 mutex_DURATION = 50000000
-signal_pthread_DURATION = 1000000
-signal_java_DURATION = $(signal_pthread_DURATION)
-signal_rust_DURATION = $(signal_pthread_DURATION)
-signal_DURATION = 10000000
-waitfor_DURATION = 10000000
+schedint_pthread_DURATION = 1000000
+schedint_java_DURATION = $(schedint_pthread_DURATION)
+schedint_rust_DURATION = $(schedint_pthread_DURATION)
+schedint_DURATION = 10000000
+schedext_DURATION = 10000000
 creation_pthread_DURATION = 250000
-creation_rust_DURATION = ${creation_pthread_DURATION}
+creation_rust_thread_DURATION = ${creation_pthread_DURATION}
+creation_java_thread_DURATION = ${creation_pthread_DURATION}
 creation_cfa_coroutine_DURATION = 100000000
 creation_cfa_coroutine_eager_DURATION = 10000000
@@ -784,7 +786,7 @@
 .ONESHELL:		# use one shell to execute recipe
 .NOTPARALLEL:
-.PHONY: compile.csv basic.csv ctxswitch.csv mutex.csv signal.csv
-
-all : basic$(EXEEXT) ctxswitch$(EXEEXT) mutex$(EXEEXT) signal$(EXEEXT) waitfor$(EXEEXT) creation$(EXEEXT)
+.PHONY: compile.csv basic.csv ctxswitch.csv mutex.csv schedint.csv
+
+all : basic$(EXEEXT) ctxswitch$(EXEEXT) mutex$(EXEEXT) schedint$(EXEEXT) schedext$(EXEEXT) creation$(EXEEXT)
 
 %.run : %$(EXEEXT) ${REPEAT}
@@ -825,6 +827,6 @@
 	+make mutex.csv
 	-+make mutex.diff.csv
-	+make signal.csv
-	-+make signal.diff.csv
+	+make schedint.csv
+	-+make schedint.diff.csv
 @DOifskipcompile@
 	cat compile.csv
@@ -837,6 +839,6 @@
 	cat mutex.csv
 	-cat mutex.diff.csv
-	cat signal.csv
-	-cat signal.diff.csv
+	cat schedint.csv
+	-cat schedint.diff.csv
 
 compile.csv:
@@ -872,10 +874,10 @@
 	$(srcdir)/fixcsv.sh $@
 
-signal.csv:
-	echo "signal-1,signal-2,waitfor-1,waitfor-2" > $@
-	+make signal-cfa1.runquiet >> $@ && echo -n ',' >> $@
-	+make signal-cfa2.runquiet >> $@ && echo -n ',' >> $@
-	+make waitfor-cfa1.runquiet >> $@ && echo -n ',' >> $@
-	+make waitfor-cfa2.runquiet >> $@
+schedint.csv:
+	echo "schedint-1,schedint-2,schedext-1,schedext-2" > $@
+	+make schedint-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	+make schedint-cfa2.runquiet >> $@ && echo -n ',' >> $@
+	+make schedext-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	+make schedext-cfa2.runquiet >> $@
 	$(srcdir)/fixcsv.sh $@
 
@@ -989,32 +991,29 @@
 	chmod a+x a.out
 
-signal$(EXEEXT) :		\
-	signal-cfa1.run		\
-	signal-cfa2.run		\
-	signal-cfa4.run		\
-	signal-upp.run		\
-	signal-rust.run		\
-	signal-java.run		\
-	signal-pthread.run
-
-signal-pthread$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE) $(srcdir)/schedint/pthreads.c
-
-signal-upp$(EXEEXT):
+schedint$(EXEEXT) :		\
+	schedint-cfa1.run	\
+	schedint-cfa2.run	\
+	schedint-cfa4.run	\
+	schedint-upp.run	\
+	schedint-rust.run	\
+	schedint-java.run	\
+	schedint-pthread.run
+
+schedint-cfa1$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa1.cfa
+
+schedint-cfa2$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa2.cfa
+
+schedint-cfa4$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa4.cfa
+
+schedint-upp$(EXEEXT):
 	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/schedint/upp.cc
 
-signal-cfa1$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa1.cfa
-
-signal-cfa2$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa2.cfa
-
-signal-cfa4$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa4.cfa
-
-signal-rust$(EXEEXT):
+schedint-rust$(EXEEXT):
 	$(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/schedint/rust.rs
 
-signal-java$(EXEEXT):
+schedint-java$(EXEEXT):
 	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/schedint/JavaThread.java
 	echo "#!/bin/sh" > a.out
@@ -1022,23 +1021,31 @@
 	chmod a+x a.out
 
-waitfor$(EXEEXT) :		\
-	waitfor-cfa1.run	\
-	waitfor-cfa2.run	\
-	waitfor-cfa4.run	\
-	waitfor-upp.run
-
-waitfor-upp$(EXEEXT):
+schedint-pthread$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/schedint/pthreads.c
+
+schedext$(EXEEXT) :		\
+	schedext-cfa1.run	\
+	schedext-cfa2.run	\
+	schedext-cfa4.run	\
+	schedext-upp.run	\
+	schedext-goroutine.run
+
+schedext-cfa1$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa1.cfa
+
+schedext-cfa2$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa2.cfa
+
+schedext-cfa4$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa4.cfa
+
+schedext-upp$(EXEEXT):
 	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/schedext/upp.cc
 
-waitfor-cfa1$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa1.cfa
-
-waitfor-cfa2$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa2.cfa
-
-waitfor-cfa4$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa4.cfa
+schedext-goroutine$(EXEEXT):
+	$(BENCH_V_GOC)go build -o a.out $(srcdir)/schedext/goroutine.go
 
 creation$(EXEEXT) :				\
+	creation-cfa_generator.run		\
 	creation-cfa_coroutine.run		\
 	creation-cfa_coroutine_eager.run	\
@@ -1053,4 +1060,7 @@
 	creation-pthread.run
 
+creation-cfa_generator$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_gen.cfa
+
 creation-cfa_coroutine$(EXEEXT):
 	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_cor.cfa
@@ -1084,5 +1094,5 @@
 	$(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/creation/rust_thrd.rs
 
-creation-java$(EXEEXT):
+creation-java_thread$(EXEEXT):
 	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/creation/JavaThread.java
 	echo "#!/bin/sh" > a.out
Index: benchmark/creation/cfa_cor.cfa
===================================================================
--- benchmark/creation/cfa_cor.cfa	(revision c12869e252446e2346b620e01a91c06700f67b70)
+++ benchmark/creation/cfa_cor.cfa	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -1,14 +1,7 @@
-#include <stdio.h>
-#include <coroutine.hfa>
-
 #include "bench.h"
 
-coroutine MyCoroutine {};
-void ?{}( MyCoroutine & this ) {
-#ifdef EAGER
-	resume( this );
-#endif
-}
-void main( MyCoroutine & ) {}
+typedef struct {
+	void * next;
+} C;
 
 int main( int argc, char * argv[] ) {
@@ -16,5 +9,5 @@
 	BENCH(
 		for ( times ) {
-			MyCoroutine c;
+			C c;
 		},
 		result
Index: benchmark/creation/cfa_gen.cfa
===================================================================
--- benchmark/creation/cfa_gen.cfa	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
+++ benchmark/creation/cfa_gen.cfa	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -0,0 +1,27 @@
+#include <stdio.h>
+#include <coroutine.hfa>
+
+#include "bench.h"
+
+coroutine MyCoroutine {};
+void ?{}( MyCoroutine & this ) {
+#ifdef EAGER
+	resume( this );
+#endif
+}
+void main( MyCoroutine & ) {}
+
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	BENCH(
+		for ( times ) {
+			MyCoroutine c;
+		},
+		result
+	)
+	printf( "%g\n", result );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/schedext/cfa1.cfa
===================================================================
--- benchmark/schedext/cfa1.cfa	(revision c12869e252446e2346b620e01a91c06700f67b70)
+++ benchmark/schedext/cfa1.cfa	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -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 c12869e252446e2346b620e01a91c06700f67b70)
+++ benchmark/schedext/cfa2.cfa	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -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 c12869e252446e2346b620e01a91c06700f67b70)
+++ benchmark/schedext/cfa4.cfa	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -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 26fd986f03393501efae80e424071cb9eedeaa81)
+++ benchmark/schedext/goroutine.go	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -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 c12869e252446e2346b620e01a91c06700f67b70)
+++ benchmark/schedext/upp.cc	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -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();
 }
 
Index: benchmark/schedint/JavaThread.java
===================================================================
--- benchmark/schedint/JavaThread.java	(revision c12869e252446e2346b620e01a91c06700f67b70)
+++ benchmark/schedint/JavaThread.java	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -63,5 +63,5 @@
 		synchronized(m) {
 			s.start();
-			while( !Monitor.go ) {
+			while( ! Monitor.go ) { // waiter must start first
 				Thread.yield();
 			}
Index: benchmark/schedint/cfa1.cfa
===================================================================
--- benchmark/schedint/cfa1.cfa	(revision c12869e252446e2346b620e01a91c06700f67b70)
+++ benchmark/schedint/cfa1.cfa	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -7,4 +7,5 @@
 
 volatile int go = 0;
+
 condition c;
 monitor M {} m1;
@@ -13,5 +14,4 @@
 	signal( c );
 }
-
 void __attribute__((noinline)) wait( M & mutex p1 ) {
 	go = 1;
@@ -19,12 +19,11 @@
 		wait( c );
 	}
-	go = 0;
 }
 
 thread T {};
 void main( T & ) {
-	while ( go == 0 ) { yield(); }
+	while ( go == 0 ) { yield(); } // waiter must start first
 	BENCH(
-		while ( go == 1 ) { call( m1 ); },
+		for ( times ) { call( m1 ); },
 		result
 	)
Index: benchmark/schedint/cfa2.cfa
===================================================================
--- benchmark/schedint/cfa2.cfa	(revision c12869e252446e2346b620e01a91c06700f67b70)
+++ benchmark/schedint/cfa2.cfa	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -7,4 +7,5 @@
 
 volatile int go = 0;
+
 condition c;
 monitor M {} m1, m2;
@@ -13,5 +14,4 @@
 	signal( c );
 }
-
 void __attribute__((noinline)) wait( M & mutex p1, M & mutex p2 ) {
 	go = 1;
@@ -19,12 +19,11 @@
 		wait( c );
 	}
-	go = 0;
 }
 
 thread T {};
 void main( T & ) {
-	while ( go == 0 ) { yield(); }
+	while ( go == 0 ) { yield(); } // waiter must start first
 	BENCH(
-		while ( go == 1 ) { call( m1, m2 ); },
+		for ( times ) { call( m1, m2 ); },
 		result
 	)
Index: benchmark/schedint/cfa4.cfa
===================================================================
--- benchmark/schedint/cfa4.cfa	(revision c12869e252446e2346b620e01a91c06700f67b70)
+++ benchmark/schedint/cfa4.cfa	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -4,7 +4,8 @@
 #include <stdio.h>
 
-#include "bench.h"
+#include "../bench.h"
 
 volatile int go = 0;
+
 condition c;
 monitor M {} m1, m2, m3, m4;
@@ -13,5 +14,4 @@
 	signal( c );
 }
-
 void __attribute__((noinline)) wait( M & mutex p1, M & mutex p2, M & mutex p3, M & mutex p4 ) {
 	go = 1;
@@ -19,12 +19,11 @@
 		wait( c );
 	}
-	go = 0;
 }
 
 thread T {};
 void main( T & ) {
-	while ( go == 0 ) { yield(); }
+	while ( go == 0 ) { yield(); } // waiter must start first
 	BENCH(
-		while ( go == 1 ) { call( m1, m2, m3, m4 ); },
+		for ( times ) { call( m1, m2, m3, m4 ); },
 		result
 	)
Index: benchmark/schedint/pthreads.c
===================================================================
--- benchmark/schedint/pthreads.c	(revision c12869e252446e2346b620e01a91c06700f67b70)
+++ benchmark/schedint/pthreads.c	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -6,31 +6,31 @@
 volatile int go = 0;
 
+pthread_mutex_t m;
 pthread_cond_t c;
-pthread_mutex_t m;
 
 void __attribute__((noinline)) call() {
-	pthread_mutex_lock(&m);
-	pthread_cond_signal(&c);
-	pthread_mutex_unlock(&m);
+	pthread_mutex_lock( &m );
+	pthread_cond_signal( &c );
+	pthread_mutex_unlock( &m );
 }
 
-int  __attribute__((noinline)) wait() {
+void __attribute__((noinline)) wait() {
 	pthread_mutex_lock(&m);
 	go = 1;
+	for ( size_t i = 0; i < times; i++ ) {
+		pthread_cond_wait( &c, &m );
+	}
+	go = 0;
+	pthread_mutex_unlock( &m );
+}
+
+void * thread_main( __attribute__((unused)) void * arg ) {
+	while ( go == 0 ) { sched_yield(); } // waiter must start first
+	// barging for lock acquire => may not execute N times
 	BENCH(
-		for (size_t i = 0; i < times; i++) {
-			pthread_cond_wait(&c, &m);
-		},
+		while ( go == 1 ) { call(); },
 		result
 	)
 	printf( "%g\n", result );
-	go = 0;
-	pthread_mutex_unlock(&m);
-	return 0;
-}
-
-void* thread_main(__attribute__((unused)) void * arg ) {
-	while(go == 0) { sched_yield(); }
-	while(go == 1) { call(); }
 	return NULL;
 }
@@ -39,10 +39,10 @@
 	BENCH_START()
 	pthread_t thread;
-	if (pthread_create(&thread, NULL, thread_main, NULL) < 0) {
+	if ( pthread_create( &thread, NULL, thread_main, NULL ) < 0 ) {
 		perror( "failure" );
 		return 1;
 	}
 	wait();
-	if (pthread_join( thread, NULL) < 0) {
+	if ( pthread_join( thread, NULL ) < 0 ) {
 		perror( "failure" );
 		return 1;
Index: benchmark/schedint/rust.rs
===================================================================
--- benchmark/schedint/rust.rs	(revision c12869e252446e2346b620e01a91c06700f67b70)
+++ benchmark/schedint/rust.rs	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -18,5 +18,5 @@
 
 	let th = thread::spawn( move || {
-		while *m2.lock().unwrap() == 0 {
+		while *m2.lock().unwrap() == 0 { // waiter must start first
 			thread::yield_now();
 		}
Index: benchmark/schedint/upp.cc
===================================================================
--- benchmark/schedint/upp.cc	(revision c12869e252446e2346b620e01a91c06700f67b70)
+++ benchmark/schedint/upp.cc	(revision 26fd986f03393501efae80e424071cb9eedeaa81)
@@ -11,26 +11,22 @@
 		cond.signal();
 	}
+	void __attribute__((noinline)) wait() {
+		go = 1;
+		for ( size_t i = 0; i < times; i++ ) {
+			cond.wait();
+		}
+	}
+} m;
 
-	int __attribute__((noinline)) wait() {
-		go = 1;
+_Task T {
+	void main() {
+		while ( go == 0 ) { yield(); } // waiter must start first
 		BENCH(
-			for (size_t i = 0; i < times; i++) {
-				cond.wait();
+			for ( size_t i = 0; i < times; i++ ) {
+				m.call();
 			},
 			result
 		)
 		printf( "%g\n", result );
-		go = 0;
-		return 0;
-	}
-};
-
-M m;
-
-_Task T {
-	void main() {
-		while(go == 0) { yield(); }
-		while(go == 1) { m.call(); }
-
 	}
 };
@@ -39,5 +35,5 @@
 	BENCH_START()
 	T t;
-	return m.wait();
+	m.wait();
 }
 
