#include <kernel.hfa>
#include <monitor.hfa>
#include <thread.hfa>
#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);
}