Index: src/tests/.expect/concurrent/preempt.txt
===================================================================
--- src/tests/.expect/concurrent/preempt.txt	(revision 11dbfe1a3caa7b8b2ac60e61a9bee57433ea08bf)
+++ src/tests/.expect/concurrent/preempt.txt	(revision 11dbfe1a3caa7b8b2ac60e61a9bee57433ea08bf)
@@ -0,0 +1,10 @@
+100
+200
+300
+400
+500
+600
+700
+800
+900
+1000
Index: src/tests/preempt.c
===================================================================
--- src/tests/preempt.c	(revision 11dbfe1a3caa7b8b2ac60e61a9bee57433ea08bf)
+++ src/tests/preempt.c	(revision 11dbfe1a3caa7b8b2ac60e61a9bee57433ea08bf)
@@ -0,0 +1,42 @@
+#include <kernel>
+#include <thread>
+
+#ifndef PREEMPTION_RATE
+#define PREEMPTION_RATE 10_000ul
+#endif
+
+unsigned int default_preemption() {
+	return PREEMPTION_RATE;
+}
+
+static volatile int counter = 0;
+
+thread Worker {
+	int value;
+};
+
+void ?{}( Worker * this, int value ) {
+	this->value = value;
+}
+
+void main(Worker * this) {
+	while(counter < 1000) {
+		if( (counter % 7) == this->value ) {
+			int next = __atomic_add_fetch_4(&counter, 1, __ATOMIC_SEQ_CST);
+			if( (next % 100) == 0 ) printf("%d\n", next);
+		}
+	}
+}
+
+int main(int argc, char* argv[]) {
+	processor p;
+	{
+		Worker w0 = 0;
+		Worker w1 = 1;
+		Worker w2 = 2;
+		Worker w3 = 3;
+		Worker w4 = 4;
+		Worker w5 = 5;
+		Worker w6 = 6;
+	}
+}
