Index: tests/concurrent/.expect/once.txt
===================================================================
--- tests/concurrent/.expect/once.txt	(revision e50d9cb8bcb9d4dee3eb25c5c5ffe27efe455a18)
+++ tests/concurrent/.expect/once.txt	(revision e50d9cb8bcb9d4dee3eb25c5c5ffe27efe455a18)
@@ -0,0 +1,2 @@
+starting
+done
Index: tests/concurrent/once.cfa
===================================================================
--- tests/concurrent/once.cfa	(revision e50d9cb8bcb9d4dee3eb25c5c5ffe27efe455a18)
+++ tests/concurrent/once.cfa	(revision e50d9cb8bcb9d4dee3eb25c5c5ffe27efe455a18)
@@ -0,0 +1,44 @@
+#include <barrier.hfa>
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <once.hfa>
+#include <thread.hfa>
+
+once_flag global;
+
+volatile int check;
+
+void reset() {
+	(global){};
+	check = 0;
+}
+
+void must_once(void) {
+	int prev = __atomic_fetch_add( &check, 1, __ATOMIC_SEQ_CST );
+	if(prev != 0) {
+		abort | "'must_once' appears to have been called more than once, check was" | prev;
+	}
+}
+
+barrier barr = { 11 };
+
+thread Tester {};
+
+void main( Tester & this ) {
+	for(500) {
+		block( barr, reset );
+
+		// sometime yields
+		yield(prng(this, 3));
+	}
+}
+
+int main() {
+	processor p[2];
+
+	sout | "starting";
+	{
+		Tester testers[11];
+	}
+	sout | "done";
+}
