Index: doc/theses/thierry_delisle_PhD/code/relaxed_list.cpp
===================================================================
--- doc/theses/thierry_delisle_PhD/code/relaxed_list.cpp	(revision 3bf812bc9893e42830e8a2f1b408a45f288b4262)
+++ doc/theses/thierry_delisle_PhD/code/relaxed_list.cpp	(revision 8e1b1bbad231913602ce8da1d9a30aeb5e4f5ecb)
@@ -918,4 +918,5 @@
 
 	std::cout << "Running " << nthreads << " threads (" << (nthreads * nqueues) << " queues) for " << duration << " seconds" << std::endl;
+	std::cout << "Relaxed list variant: " << relaxed_list<Node>::name() << std::endl;
 	switch(benchmark) {
 		case Churn:
Index: doc/theses/thierry_delisle_PhD/code/relaxed_list.hpp
===================================================================
--- doc/theses/thierry_delisle_PhD/code/relaxed_list.hpp	(revision 3bf812bc9893e42830e8a2f1b408a45f288b4262)
+++ doc/theses/thierry_delisle_PhD/code/relaxed_list.hpp	(revision 8e1b1bbad231913602ce8da1d9a30aeb5e4f5ecb)
@@ -1,3 +1,14 @@
 #pragma once
+
+enum VARIANTS {
+	VANILLA,
+	SNZI,
+	BITMASK,
+	DISCOVER
+};
+
+#ifndef VARIANT
+#define VARIANT VANILLA
+#endif
 
 #ifndef NO_STATS
@@ -13,4 +24,7 @@
 #include "utils.hpp"
 #include "snzi.hpp"
+
+#define MACRO_XSTR(s) MACRO_STR(s)
+#define MACRO_STR(s) #s
 
 using namespace std;
@@ -54,8 +68,12 @@
 
 public:
+	static const char * name() {
+		return MACRO_XSTR(VARIANT);
+	}
+
 	relaxed_list(unsigned numLists)
 	  	: lists(new intrusive_queue_t[numLists])
 		, numLists(numLists)
-		#if defined(SIMPLE_SNZI) || defined(DISCOVER_BITMASK)
+		#if VARIANT == SNZI || VARIANT == DISCOVER
 			, snzi( std::log2( numLists / 8 ) )
 		#endif
@@ -90,5 +108,5 @@
 			if( !lists[i].lock.try_lock() ) continue;
 
-			#if !defined(SIMPLE_SNZI) && !defined(DISCOVER_BITMASK)
+			#if VARIANT != SNZI && VARIANT != DISCOVER
 				__attribute__((unused)) int num = numNonEmpty;
 			#endif
@@ -96,5 +114,5 @@
 			// Actually push it
 			if(lists[i].push(node)) {
-				#if defined(DISCOVER_BITMASK)
+				#if VARIANT == DISCOVER
 					size_t qword = i >> 6ull;
 					size_t bit   = i & 63ull;
@@ -102,7 +120,7 @@
 					bts(tls.mask, bit);
 					snzi.arrive(i);
-				#elif defined(SIMPLE_SNZI)
+				#elif VARIANT == SNZI
 					snzi.arrive(i);
-				#elif !defined(NO_BITMASK)
+				#elif VARIANT == BITMASK
 					numNonEmpty++;
 					size_t qword = i >> 6ull;
@@ -116,5 +134,5 @@
 				#endif
 			}
-			#if !defined(SIMPLE_SNZI) && !defined(DISCOVER_BITMASK)
+			#if VARIANT != SNZI && VARIANT != DISCOVER
 				assert(numNonEmpty <= (int)numLists);
 			#endif
@@ -125,5 +143,5 @@
 			#ifndef NO_STATS
 				tls.pick.push.success++;
-				#if !defined(SIMPLE_SNZI) && !defined(DISCOVER_BITMASK)
+				#if VARIANT != SNZI && VARIANT != DISCOVER
 					tls.empty.push.value += num;
 					tls.empty.push.count += 1;
@@ -135,5 +153,5 @@
 
 	__attribute__((noinline, hot)) node_t * pop() {
-		#if defined(DISCOVER_BITMASK)
+		#if VARIANT == DISCOVER
 			assert(numLists <= 64);
 			while(snzi.query()) {
@@ -164,5 +182,5 @@
 				if(auto node = try_pop(i, j)) return node;
 			}
-		#elif defined(SIMPLE_SNZI)
+		#elif VARIANT == SNZI
 			while(snzi.query()) {
 				// Pick two lists at random
@@ -172,5 +190,5 @@
 				if(auto node = try_pop(i, j)) return node;
 			}
-		#elif !defined(NO_BITMASK)
+		#elif VARIANT == BITMASK
 			int nnempty;
 			while(0 != (nnempty = numNonEmpty)) {
@@ -226,5 +244,5 @@
 		#endif
 
-		#if defined(DISCOVER_BITMASK)
+		#if VARIANT == DISCOVER
 			if(lists[i].ts() > 0) bts(tls.mask, i); else btr(tls.mask, i);
 			if(lists[j].ts() > 0) bts(tls.mask, j); else btr(tls.mask, j);
@@ -244,5 +262,5 @@
 		if( !list.lock.try_lock() ) return nullptr;
 
-		#if !defined(SIMPLE_SNZI) && !defined(DISCOVER_BITMASK)
+		#if VARIANT != SNZI && VARIANT != DISCOVER
 			__attribute__((unused)) int num = numNonEmpty;
 		#endif
@@ -261,5 +279,5 @@
 
 		if(emptied) {
-			#if defined(DISCOVER_BITMASK)
+			#if VARIANT == DISCOVER
 				size_t qword = w >> 6ull;
 				size_t bit   = w & 63ull;
@@ -267,7 +285,7 @@
 				__attribute__((unused)) bool ret = btr(tls.mask, bit);
 				snzi.depart(w);
-			#elif defined(SIMPLE_SNZI)
+			#elif VARIANT == SNZI
 				snzi.depart(w);
-			#elif !defined(NO_BITMASK)
+			#elif VARIANT == BITMASK
 				numNonEmpty--;
 				size_t qword = w >> 6ull;
@@ -284,10 +302,10 @@
 		// Unlock and return
 		list.lock.unlock();
-		#if !defined(SIMPLE_SNZI) && !defined(DISCOVER_BITMASK)
+		#if VARIANT != SNZI && VARIANT != DISCOVER
 			assert(numNonEmpty >= 0);
 		#endif
 		#ifndef NO_STATS
 			tls.pick.pop.success++;
-			#if !defined(SIMPLE_SNZI) && !defined(DISCOVER_BITMASK)
+			#if VARIANT != SNZI && VARIANT != DISCOVER
 				tls.empty.pop.value += num;
 				tls.empty.pop.count += 1;
@@ -435,8 +453,10 @@
 	const unsigned numLists;
 private:
-	#if defined(SIMPLE_SNZI) || defined(DISCOVER_BITMASK)
+	#if VARIANT == SNZI || VARIANT == DISCOVER
 		snzi_t snzi;
 	#else
 		std::atomic_int numNonEmpty  = { 0 };  // number of non-empty lists
+	#endif
+	#if VARIANT == BITMASK
 		std::atomic_size_t list_mask[7] = { {0}, {0}, {0}, {0}, {0}, {0}, {0} }; // which queues are empty
 	#endif
