Index: benchmark/readyQ/locality.cfa
===================================================================
--- benchmark/readyQ/locality.cfa	(revision c4241b65cfa6efe7a40dc30450a6a74a14491a08)
+++ benchmark/readyQ/locality.cfa	(revision e112a2422e4e6bf9a9a4884df0f64f67835cc8ff)
@@ -184,7 +184,9 @@
 	unsigned wsize = 2;
 	unsigned wcnt  = 2;
+	unsigned nspots = 0;
 	bool share = false;
 	cfa_option opt[] = {
 		BENCH_OPT,
+		{ 'n', "nspots", "Number of spots where threads sleep (nthreads - nspots are active at the same time)", nspots},
 		{ 'w', "worksize", "Size of the array for each threads, in words (64bit)", wsize},
 		{ 'c', "workcnt" , "Number of words to touch when working (random pick, cells can be picked more than once)", wcnt },
@@ -196,4 +198,6 @@
 	unsigned long long global_gmigs = 0;
 	unsigned long long global_dmigs = 0;
+
+	if( nspots == 0 ) { nspots = nthreads - nprocs; }
 
 	Time start, end;
@@ -205,6 +209,6 @@
 		}
 
-		MySpot * spots[nthreads - nprocs];
-		for(i; nthreads - nprocs) {
+		MySpot * spots[nspots];
+		for(i; nspots) {
 			spots[i] = malloc();
 			(*spots[i]){ i };
@@ -220,5 +224,5 @@
 					data_arrays[i],
 					spots,
-					nthreads - nprocs,
+					nspots,
 					wcnt,
 					share,
@@ -258,5 +262,5 @@
 		}
 
-		for(i; nthreads - nprocs) {
+		for(i; nspots) {
 			^( *spots[i] ){};
 			free( spots[i] );
Index: benchmark/readyQ/locality.cpp
===================================================================
--- benchmark/readyQ/locality.cpp	(revision c4241b65cfa6efe7a40dc30450a6a74a14491a08)
+++ benchmark/readyQ/locality.cpp	(revision e112a2422e4e6bf9a9a4884df0f64f67835cc8ff)
@@ -201,5 +201,5 @@
 
 void thread_main( MyCtx & ctx ) {
-	uint64_t state;
+	uint64_t state = ctx.id;
 
 	// Wait for start
@@ -237,7 +237,9 @@
 	unsigned wsize = 2;
 	unsigned wcnt  = 2;
+	unsigned nspots = 0;
 	bool share = false;
 	option_t opt[] = {
 		BENCH_OPT,
+		{ 'n', "nspots", "Number of spots where threads sleep (nthreads - nspots are active at the same time)", nspots},
 		{ 'w', "worksize", "Size of the array for each threads, in words (64bit)", wsize},
 		{ 'c', "workcnt" , "Number of words to touch when working (random pick, cells can be picked more than once)", wcnt },
@@ -252,4 +254,6 @@
 	unsigned long long global_gmigs = 0;
 	unsigned long long global_dmigs = 0;
+
+	if( nspots == 0 ) { nspots = nthreads - nprocs; }
 
 	uint64_t start, end;
@@ -261,10 +265,10 @@
 		}
 
-		MySpot * spots[nthreads - nprocs];
-		for(size_t i = 0; i < (nthreads - nprocs); i++) {
+		MySpot * spots[nspots];
+		for(unsigned i = 0; i < nspots; i++) {
 			spots[i] = new MySpot{ i };
 		}
 
-		threads_left = nthreads;
+		threads_left = nthreads - nspots;
 		Fibre * threads[nthreads];
 		MyCtx * thddata[nthreads];
@@ -274,5 +278,5 @@
 					data_arrays[i],
 					spots,
-					nthreads - nprocs,
+					nspots,
 					wcnt,
 					share,
@@ -307,5 +311,5 @@
 		}
 
-		for(size_t i = 0; i < (nthreads - nprocs); i++) {
+		for(size_t i = 0; i < nspots; i++) {
 			delete( spots[i] );
 		}
@@ -315,15 +319,15 @@
 	printf("Number of processors   : %'d\n", nprocs);
 	printf("Number of threads      : %'d\n", nthreads);
-	printf("Total Operations(ops)  : %'15llu\n", global_count);
+	printf("Number of spots        : %'d\n", nspots);
 	printf("Work size (64bit words): %'15u\n", wsize);
 	printf("Total Operations(ops)  : %'15llu\n", global_count);
 	printf("Total G Migrations     : %'15llu\n", global_gmigs);
 	printf("Total D Migrations     : %'15llu\n", global_dmigs);
-	printf("Ops per second       : %'18.2lf\n", ((double)global_count) / to_fseconds(end - start));
-	printf("ns per ops           : %'18.2lf\n", ((double)(end - start)) / global_count);
-	printf("Ops per threads      : %'15llu\n", global_count / nthreads);
-	printf("Ops per procs        : %'15llu\n", global_count / nprocs);
-	printf("Ops/sec/procs        : %'18.2lf\n", (((double)global_count) / nprocs) / to_fseconds(end - start));
-	printf("ns per ops/procs     : %'18.2lf\n", ((double)(end - start)) / (global_count / nprocs));
+	printf("Ops per second         : %'18.2lf\n", ((double)global_count) / to_fseconds(end - start));
+	printf("ns per ops             : %'18.2lf\n", ((double)(end - start)) / global_count);
+	printf("Ops per threads        : %'15llu\n", global_count / nthreads);
+	printf("Ops per procs          : %'15llu\n", global_count / nprocs);
+	printf("Ops/sec/procs          : %'18.2lf\n", (((double)global_count) / nprocs) / to_fseconds(end - start));
+	printf("ns per ops/procs       : %'18.2lf\n", ((double)(end - start)) / (global_count / nprocs));
 	fflush(stdout);
 }
Index: benchmark/readyQ/locality.go
===================================================================
--- benchmark/readyQ/locality.go	(revision c4241b65cfa6efe7a40dc30450a6a74a14491a08)
+++ benchmark/readyQ/locality.go	(revision e112a2422e4e6bf9a9a4884df0f64f67835cc8ff)
@@ -221,4 +221,5 @@
 func main() {
 	// Benchmark specific command line arguments
+	nspotsOpt    := flag.Int   ("n", 0    , "Number of spots where threads sleep (nthreads - nspots are active at the same time)")
 	work_sizeOpt := flag.Uint64("w", 2    , "Size of the array for each threads, in words (64bit)")
 	countOpt     := flag.Uint64("c", 2    , "Number of words to touch when working (random pick, cells can be picked more than once)")
@@ -229,7 +230,10 @@
 
 	// Eval command line arguments
+	nspots:= *nspotsOpt
 	size  := *work_sizeOpt
 	cnt   := *countOpt
 	share := *shareOpt
+
+	if nspots == 0 { nspots = nthreads - nprocs; }
 
 	// Check params
@@ -241,7 +245,7 @@
 	// Make global data
 	barrierStart := make(chan struct{})         // Barrier used at the start
-	threads_left = int64(nprocs)                // Counter for active threads (not 'nthreads' because at all times 'nthreads - nprocs' are blocked)
+	threads_left = int64(nthreads - nspots)                // Counter for active threads (not 'nthreads' because at all times 'nthreads - nprocs' are blocked)
 	result  := make(chan Result)                // Channel for results
-	channels := make([]Spot, nthreads - nprocs) // Number of spots
+	channels := make([]Spot, nspots) // Number of spots
 	for i := range channels {
 		channels[i] = Spot{[16]uint64{0},uintptr(0), i,[16]uint64{0}}     // init spots
Index: benchmark/readyQ/locality.rs
===================================================================
--- benchmark/readyQ/locality.rs	(revision c4241b65cfa6efe7a40dc30450a6a74a14491a08)
+++ benchmark/readyQ/locality.rs	(revision e112a2422e4e6bf9a9a4884df0f64f67835cc8ff)
@@ -257,7 +257,8 @@
 	let options = App::new("Locality Tokio")
 		.args(&bench::args())
-		.arg(Arg::with_name("size") .short("w").long("worksize").takes_value(true).default_value("2").help("Size of the array for each threads, in words (64bit)"))
-		.arg(Arg::with_name("work") .short("c").long("workcnt") .takes_value(true).default_value("2").help("Number of words to touch when working (random pick, cells can be picked more than once)"))
-		.arg(Arg::with_name("share").short("s").long("share")   .takes_value(true).default_value("true").help("Pass the work data to the next thread when blocking"))
+		.arg(Arg::with_name("nspots").short("n").long("nspots")  .takes_value(true).default_value("0").help("Number of spots where threads sleep (nthreads - nspots are active at the same time)"))
+		.arg(Arg::with_name("size")  .short("w").long("worksize").takes_value(true).default_value("2").help("Size of the array for each threads, in words (64bit)"))
+		.arg(Arg::with_name("work")  .short("c").long("workcnt") .takes_value(true).default_value("2").help("Number of words to touch when working (random pick, cells can be picked more than once)"))
+		.arg(Arg::with_name("share") .short("s").long("share")   .takes_value(true).default_value("true").help("Pass the work data to the next thread when blocking"))
 		.get_matches();
 
@@ -267,4 +268,12 @@
 	let wcnt       = options.value_of("work").unwrap().parse::<u64>().unwrap();
 	let share      = options.value_of("share").unwrap().parse::<bool>().unwrap();
+	let nspots = {
+		let val = options.value_of("nspots").unwrap().parse::<usize>().unwrap();
+		if val != 0 {
+			val
+		} else {
+			nthreads - nprocs
+		}
+	};
 
 	// Check params
@@ -282,5 +291,5 @@
 
 	let mut data_arrays : Vec<MyData> = (0..nthreads).map(|i| MyData::new(i, wsize)).rev().collect();
-	let spots : Arc<Vec<MySpot>> = Arc::new((0..nthreads - nprocs).map(|i| MySpot::new(i)).rev().collect());
+	let spots : Arc<Vec<MySpot>> = Arc::new((0..nspots).map(|i| MySpot::new(i)).rev().collect());
 	let barr = Arc::new(sync::Barrier::new(nthreads + 1));
 
