Index: doc/theses/thierry_delisle_PhD/code/relaxed_list.hpp
===================================================================
--- doc/theses/thierry_delisle_PhD/code/relaxed_list.hpp	(revision 591f0842aee71406b0041d2087937ce445fc80fa)
+++ doc/theses/thierry_delisle_PhD/code/relaxed_list.hpp	(revision 03045f18fa5097ff8e2893f44401cfb1034cdfa3)
@@ -73,5 +73,5 @@
 			"SNZI",
 			"BITMASK",
-			"DISCOVER",
+			"SNZI + DISCOVERED MASK",
 			"SNZI + MASK"
 		};
@@ -82,7 +82,7 @@
 	  	: lists(new intrusive_queue_t[numLists])
 		, numLists(numLists)
-		#if VARIANT == SNZI || VARIANT == DISCOVER
+		#if VARIANT == SNZI
 			, snzi( std::log2( numLists / 8 ), 2 )
-		#elif VARIANT == SNZM
+		#elif VARIANT == SNZM || VARIANT == DISCOVER
 			, snzm( numLists )
 		#endif
@@ -128,5 +128,5 @@
 					assert(qword == 0);
 					bts(tls.mask, bit);
-					snzi.arrive(i);
+					snzm.arrive(i);
 				#elif VARIANT == SNZI
 					snzi.arrive(i);
@@ -166,5 +166,5 @@
 		#if VARIANT == DISCOVER
 			assert(numLists <= 64);
-			while(snzi.query()) {
+			while(snzm.query()) {
 				tls.pick.pop.mask_attempt++;
 				unsigned i, j;
@@ -180,4 +180,5 @@
 						tls.pick.pop.mask_reset++;
 						mask = (1U << numLists) - 1;
+						tls.mask.store(mask, std::memory_order_relaxed);
 					}
 
@@ -202,4 +203,5 @@
 			}
 		#elif VARIANT == SNZM
+			//*
 			while(snzm.query()) {
 				tls.pick.pop.mask_attempt++;
@@ -235,4 +237,13 @@
 				if(auto node = try_pop(i, j)) return node;
 			}
+			/*/
+			while(snzm.query()) {
+				// Pick two lists at random
+				int i = tls.rng.next() % numLists;
+				int j = tls.rng.next() % numLists;
+
+				if(auto node = try_pop(i, j)) return node;
+			}
+			//*/
 		#elif VARIANT == BITMASK
 			int nnempty;
@@ -329,5 +340,5 @@
 				assert(qword == 0);
 				__attribute__((unused)) bool ret = btr(tls.mask, bit);
-				snzi.depart(w);
+				snzm.depart(w);
 			#elif VARIANT == SNZI
 				snzi.depart(w);
@@ -500,7 +511,7 @@
 	const unsigned numLists;
 private:
-	#if VARIANT == SNZI || VARIANT == DISCOVER
+	#if VARIANT == SNZI
 		snzi_t snzi;
-	#elif VARIANT == SNZM
+	#elif VARIANT == SNZM || VARIANT == DISCOVER
 		snzm_t snzm;
 	#else
@@ -591,10 +602,15 @@
 		double pop_sur  = (100.0 * double(global.pick.pop .success) / global.pick.pop .attempt);
 		double mpop_sur = (100.0 * double(global.pick.pop .success) / global.pick.pop .mask_attempt);
-		double rpop_sur = (100.0 * double(global.pick.pop .mask_reset) / global.pick.pop .mask_attempt);
-
-		os << "Push   Pick % : " << push_sur << "(" << global.pick.push.success << " / " << global.pick.push.attempt << ")\n";
-		os << "Pop    Pick % : " << pop_sur  << "(" << global.pick.pop .success << " / " << global.pick.pop .attempt << ")\n";
-		os << "TryPop Pick % : " << mpop_sur << "(" << global.pick.pop .success << " / " << global.pick.pop .mask_attempt << ")\n";
-		os << "Pop M Reset % : " << rpop_sur << "(" << global.pick.pop .mask_reset << " / " << global.pick.pop .mask_attempt << ")\n";
+		double rpop_sur = (100.0 * double(global.pick.pop .success) / global.pick.pop .mask_reset);
+
+		double push_len = double(global.pick.push.attempt     ) / global.pick.push.success;
+		double pop_len  = double(global.pick.pop .attempt     ) / global.pick.pop .success;
+		double mpop_len = double(global.pick.pop .mask_attempt) / global.pick.pop .success;
+		double rpop_len = double(global.pick.pop .mask_reset  ) / global.pick.pop .success;
+
+		os << "Push   Pick   : " << push_sur << " %, len " << push_len << " (" << global.pick.push.attempt      << " / " << global.pick.push.success << ")\n";
+		os << "Pop    Pick   : " << pop_sur  << " %, len " << pop_len  << " (" << global.pick.pop .attempt      << " / " << global.pick.pop .success << ")\n";
+		os << "TryPop Pick   : " << mpop_sur << " %, len " << mpop_len << " (" << global.pick.pop .mask_attempt << " / " << global.pick.pop .success << ")\n";
+		os << "Pop M Reset   : " << rpop_sur << " %, len " << rpop_len << " (" << global.pick.pop .mask_reset   << " / " << global.pick.pop .success << ")\n";
 
 		double avgQ_push = double(global.qstat.push.value) / global.qstat.push.count;
