Index: benchmark/schedint/JavaThread.java
===================================================================
--- benchmark/schedint/JavaThread.java	(revision bf71cfdb7285490eee552b461158846f626cc52f)
+++ benchmark/schedint/JavaThread.java	(revision bf71cfdb7285490eee552b461158846f626cc52f)
@@ -0,0 +1,42 @@
+class Monitor {
+	public static volatile Boolean go = false;
+}
+
+class Signaller extends Thread {
+	Monitor m;
+	Signaller(Monitor m) {
+		this.m = m;
+	}
+
+	public void run() {
+		Monitor.go = true;
+		while( Monitor.go ) {
+			synchronized(this.m) {
+				this.m.notify();
+			}
+		}
+	}
+}
+
+public class JavaThread {
+	public static void main(String[] args) throws InterruptedException {
+		int NoOfTimes = 50000;
+		Monitor m = new Monitor();
+		long start, end;
+		Signaller s = new Signaller(m);
+		synchronized(m) {
+			s.start();
+			while( !Monitor.go ) {
+				Thread.yield();
+			}
+			start = System.nanoTime();
+			for(int i = 1; i <= NoOfTimes; i += 1) {
+				m.wait();
+			}
+			end = System.nanoTime();
+		}
+		Monitor.go = false;
+		s.join();
+		System.out.println( (end - start) / NoOfTimes);
+	}
+}
Index: benchmark/schedint/cfa1.c
===================================================================
--- benchmark/schedint/cfa1.c	(revision bf71cfdb7285490eee552b461158846f626cc52f)
+++ benchmark/schedint/cfa1.c	(revision bf71cfdb7285490eee552b461158846f626cc52f)
@@ -0,0 +1,47 @@
+#include <kernel>
+#include <monitor>
+#include <thread>
+#include <stdio.h>
+
+#include "bench.h"
+
+int argc;
+char** argv;
+volatile int go = 0;
+
+condition c;
+monitor M {};
+M m1;
+
+void __attribute__((noinline)) call( M & mutex a1 ) {
+	signal(c);
+}
+
+int  __attribute__((noinline)) wait( M & mutex a1 ) {
+	go = 1;
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			wait(c);
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+	go = 0;
+	return 0;
+}
+
+thread T {};
+void ^?{}( T & mutex this ) {}
+void main( T & this ) {
+	while(go == 0) { yield(); }
+	while(go == 1) { call(m1); }
+
+}
+
+int main(int margc, char* margv[]) {
+	argc = margc;
+	argv = margv;
+	T t;
+	return wait(m1);
+}
Index: benchmark/schedint/cfa2.c
===================================================================
--- benchmark/schedint/cfa2.c	(revision bf71cfdb7285490eee552b461158846f626cc52f)
+++ benchmark/schedint/cfa2.c	(revision bf71cfdb7285490eee552b461158846f626cc52f)
@@ -0,0 +1,47 @@
+#include <kernel>
+#include <monitor>
+#include <thread>
+#include <stdio.h>
+
+#include "bench.h"
+
+int argc;
+char** argv;
+volatile int go = 0;
+
+condition c;
+monitor M {};
+M m1, m2;
+
+void __attribute__((noinline)) call( M & mutex a1, M & mutex a2 ) {
+	signal(c);
+}
+
+int  __attribute__((noinline)) wait( M & mutex a1, M & mutex a2 ) {
+	go = 1;
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			wait(c);
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+	go = 0;
+	return 0;
+}
+
+thread T {};
+void ^?{}( T & mutex this ) {}
+void main( T & this ) {
+	while(go == 0) { yield(); }
+	while(go == 1) { call(m1, m2); }
+
+}
+
+int main(int margc, char* margv[]) {
+	argc = margc;
+	argv = margv;
+	T t;
+	return wait(m1, m2);
+}
Index: benchmark/schedint/cfa4.c
===================================================================
--- benchmark/schedint/cfa4.c	(revision bf71cfdb7285490eee552b461158846f626cc52f)
+++ benchmark/schedint/cfa4.c	(revision bf71cfdb7285490eee552b461158846f626cc52f)
@@ -0,0 +1,47 @@
+#include <kernel>
+#include <monitor>
+#include <thread>
+#include <stdio.h>
+
+#include "bench.h"
+
+int argc;
+char** argv;
+volatile int go = 0;
+
+condition c;
+monitor M {};
+M m1, m2, m3, m4;
+
+void __attribute__((noinline)) call( M & mutex a1, M & mutex a2, M & mutex a3, M & mutex a4 ) {
+	signal(c);
+}
+
+int  __attribute__((noinline)) wait( M & mutex a1, M & mutex a2, M & mutex a3, M & mutex a4 ) {
+	go = 1;
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			wait(c);
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+	go = 0;
+	return 0;
+}
+
+thread T {};
+void ^?{}( T & mutex this ) {}
+void main( T & this ) {
+	while(go == 0) { yield(); }
+	while(go == 1) { call(m1, m2, m3, m4); }
+
+}
+
+int main(int margc, char* margv[]) {
+	argc = margc;
+	argv = margv;
+	T t;
+	return wait(m1, m2, m3, m4);
+}
Index: benchmark/schedint/pthreads.c
===================================================================
--- benchmark/schedint/pthreads.c	(revision bf71cfdb7285490eee552b461158846f626cc52f)
+++ benchmark/schedint/pthreads.c	(revision bf71cfdb7285490eee552b461158846f626cc52f)
@@ -0,0 +1,55 @@
+#include <pthread.h>
+#include <stdio.h>
+
+#include "bench.h"
+
+int argc;
+char** argv;
+volatile int go = 0;
+
+pthread_cond_t c;
+pthread_mutex_t m;
+
+void __attribute__((noinline)) call() {
+	pthread_mutex_lock(&m);
+	pthread_cond_signal(&c);
+	pthread_mutex_unlock(&m);
+}
+
+int  __attribute__((noinline)) wait() {
+	pthread_mutex_lock(&m);
+	go = 1;
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			pthread_cond_wait(&c, &m);
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+	go = 0;
+	pthread_mutex_unlock(&m);
+	return 0;
+}
+
+void* thread_main(void * a) {
+	while(go == 0) { sched_yield(); }
+	while(go == 1) { call(); }
+	return NULL;
+}
+
+int main(int margc, char* margv[]) {
+	argc = margc;
+	argv = margv;
+	pthread_t thread;
+	if (pthread_create(&thread, NULL, thread_main, NULL) < 0) {
+		perror( "failure" );
+		return 1;
+	}
+	wait();
+	if (pthread_join( thread, NULL) < 0) {
+		perror( "failure" );
+		return 1;
+	}
+	return 0;
+}
Index: benchmark/schedint/upp.cc
===================================================================
--- benchmark/schedint/upp.cc	(revision bf71cfdb7285490eee552b461158846f626cc52f)
+++ benchmark/schedint/upp.cc	(revision bf71cfdb7285490eee552b461158846f626cc52f)
@@ -0,0 +1,46 @@
+#include <cstdio>
+
+#include "bench.h"
+
+int argc;
+char** argv;
+volatile int go = 0;
+
+_Monitor M {
+	uCondition cond;
+public:
+	void __attribute__((noinline)) call() {
+		cond.signal();
+	}
+
+	int __attribute__((noinline)) wait() {
+		go = 1;
+		BENCH(
+			for (size_t i = 0; i < n; i++) {
+				cond.wait();
+			},
+			result
+		)
+
+		printf("%llu\n", result);
+		go = 0;
+		return 0;
+	}
+};
+
+M m;
+
+_Task T {
+	void main() {
+		while(go == 0) { yield(); }
+		while(go == 1) { m.call(); }
+
+	}
+};
+
+int main(int margc, char* margv[]) {
+	argc = margc;
+	argv = margv;
+	T t;
+	return m.wait();
+}
