Index: tests/concurrent/preempt.cfa
===================================================================
--- tests/concurrent/preempt.cfa	(revision c9c1c1cb39a44ae90eba78b399195de9a940648d)
+++ tests/concurrent/preempt.cfa	(revision 8e5e945add9eb57f6a0fcc7bcdcf139fc2cabea9)
@@ -1,2 +1,3 @@
+#include <clock.hfa>
 #include <fstream.hfa>
 #include <kernel.hfa>
@@ -18,4 +19,6 @@
 #else
 static const unsigned long N = 500ul;
+static volatile Time prev;
+static Duration preempt_durations[6] = { 0 };
 #endif
 
@@ -26,5 +29,5 @@
 thread worker_t {
 	int value;
-	unsigned spin;
+	unsigned long long spin;
 };
 
@@ -36,11 +39,25 @@
 void main(worker_t & this) {
 	while(TEST(counter < N)) {
-		if(this.spin > 100_000_000) abort | "Worker" | this.value | "has been spinning too long! (" | this.spin | ")";
+		if(this.spin > 50_000_000_000) abort | "Worker" | this.value | "has been spinning too long! (" | this.spin | ")";
 		__cfaabi_check_preemption();
 		if( (counter % 7) == this.value ) {
 			__cfaabi_check_preemption();
+			#if !defined(TEST_LONG)
+				Time now = timeHiRes();
+				Duration diff = now - prev;
+				prev = now;
+			#endif
 			int next = __atomic_add_fetch( &counter, 1, __ATOMIC_SEQ_CST );
 			__cfaabi_check_preemption();
-			if( (next % 100) == 0 ) printf("%d\n", (int)next);
+			if( (next % 100) == 0 ) {
+				#if !defined(TEST_LONG)
+					unsigned idx = next / 100;
+					if (idx >= 6) abort | "Idx from next is invalid: " | idx | "vs" | next;
+					preempt_durations[idx] = diff;
+					if(diff > 12`s) serr | "Duration suspiciously large:" | diff;
+				#endif
+				printf("%d\n", (int)next);
+
+			}
 			__cfaabi_check_preemption();
 			this.spin = 0;
@@ -55,4 +72,5 @@
 	processor p;
 	{
+		prev = timeHiRes();
 		worker_t w0 = 0;
 		worker_t w1 = 1;
