Index: benchmark/readyQ/churn.cfa
===================================================================
--- benchmark/readyQ/churn.cfa	(revision b029e310a1f8c23ce729205f17e9c08e8b462305)
+++ benchmark/readyQ/churn.cfa	(revision 111a2ab3e38e9a482e065aa6feb44c420adb6b6f)
@@ -1,11 +1,13 @@
 #include "rq_bench.hfa"
 
+#include <locks.hfa>
+
 unsigned spot_cnt = 2;
-bench_sem * volatile * spots;
+semaphore * spots;
 
 thread BThrd {
 	unsigned long long count;
 	unsigned long long blocks;
-	bench_sem sem;
+	bool skip;
 };
 
@@ -14,4 +16,5 @@
 	this.count  = 0;
 	this.blocks = 0;
+	this.skip = false;
 }
 
@@ -19,10 +22,12 @@
 
 void main( BThrd & this ) with( this ) {
-	wait( sem );
+	park();
 	for() {
-		uint32_t r = prng();
-		bench_sem * next = __atomic_exchange_n(&spots[r % spot_cnt], &sem, __ATOMIC_SEQ_CST);
-		if(next) post( *next );
-		blocks += wait( sem );
+		uint32_t r = prng(this);
+		semaphore & sem = spots[r % spot_cnt];
+		if(!skip) V( sem );
+		blocks += P( sem );
+		skip = false;
+
 		count ++;
 		if( clock_mode && stop) break;
@@ -49,5 +54,5 @@
 			spots = aalloc(spot_cnt);
 			for(i; spot_cnt) {
-				spots[i] = 0p;
+				(spots[i]){ 0 };
 			}
 
@@ -55,6 +60,7 @@
 			BThrd * threads[nthreads];
 			for(i; nthreads ) {
-				threads[i] = malloc();
-				(*threads[i]){};
+				BThrd & t = *(threads[i] = malloc());
+				(t){};
+				t.skip = i < spot_cnt;
 			}
 			printf("Starting\n");
@@ -64,5 +70,5 @@
 
 			for(i; nthreads) {
-				post( threads[i]->sem );
+				unpark( *threads[i] );
 			}
 			wait(start, is_tty);
@@ -72,6 +78,9 @@
 			printf("\nDone\n");
 
+			for(i; spot_cnt) {
+				for(10000) V( spots[i] );
+			}
+
 			for(i; nthreads) {
-				post( threads[i]->sem );
 				BThrd & thrd = join( *threads[i] );
 				global_counter += thrd.count;
