Index: libcfa/src/concurrency/coroutine.cfa
===================================================================
--- libcfa/src/concurrency/coroutine.cfa	(revision 72a3aff1a5539f7902f2fb2ec6468b2cd5fec852)
+++ libcfa/src/concurrency/coroutine.cfa	(revision 852ae0eadf725a60480bf20abd6249d378714821)
@@ -10,6 +10,6 @@
 // Created On       : Mon Nov 28 12:27:26 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Oct 23 23:05:24 2020
-// Update Count     : 22
+// Last Modified On : Tue Dec 15 12:06:04 2020
+// Update Count     : 23
 //
 
@@ -88,4 +88,5 @@
 static const size_t MinStackSize = 1000;
 extern size_t __page_size;				// architecture pagesize HACK, should go in proper runtime singleton
+extern int __map_prot;
 
 void __stack_prepare( __stack_info_t * this, size_t create_size );
@@ -206,5 +207,5 @@
 		__cfaabi_dbg_debug_do(
 			storage = (char*)(storage) - __page_size;
-			if ( mprotect( storage, __page_size, PROT_READ | PROT_WRITE ) == -1 ) {
+			if ( mprotect( storage, __page_size, __map_prot ) == -1 ) {
 				abort( "(coStack_t *)%p.^?{}() : internal error, mprotect failure, error(%d) %s.", &this, errno, strerror( errno ) );
 			}
Index: libcfa/src/concurrency/invoke.h
===================================================================
--- libcfa/src/concurrency/invoke.h	(revision 72a3aff1a5539f7902f2fb2ec6468b2cd5fec852)
+++ libcfa/src/concurrency/invoke.h	(revision 852ae0eadf725a60480bf20abd6249d378714821)
@@ -189,4 +189,10 @@
 		struct __monitor_group_t monitors;
 
+		// used to put threads on user data structures
+		struct {
+			struct $thread * next;
+			struct $thread * back;
+		} seqable;
+
 		struct {
 			struct $thread * next;
@@ -218,4 +224,16 @@
 		}
 
+		static inline $thread *& Back( $thread * this ) __attribute__((const)) {
+			return this->seqable.back;
+		}
+
+		static inline $thread *& Next( $thread * this ) __attribute__((const)) {
+			return this->seqable.next;
+		}
+
+		static inline bool listed( $thread * this ) {
+			return this->seqable.next != 0p;
+		}
+
 		static inline void ?{}(__monitor_group_t & this) {
 			(this.data){0p};
Index: libcfa/src/concurrency/kernel/startup.cfa
===================================================================
--- libcfa/src/concurrency/kernel/startup.cfa	(revision 72a3aff1a5539f7902f2fb2ec6468b2cd5fec852)
+++ libcfa/src/concurrency/kernel/startup.cfa	(revision 852ae0eadf725a60480bf20abd6249d378714821)
@@ -117,5 +117,5 @@
 }
 
-size_t __page_size = 0;
+extern size_t __page_size;
 
 //-----------------------------------------------------------------------------
@@ -161,6 +161,4 @@
 	/* paranoid */ verify( ! __preemption_enabled() );
 	__cfadbg_print_safe(runtime_core, "Kernel : Starting\n");
-
-	__page_size = sysconf( _SC_PAGESIZE );
 
 	__cfa_dbg_global_clusters.list{ __get };
@@ -681,5 +679,5 @@
 	#if CFA_PROCESSOR_USE_MMAP
 		stacksize = ceiling( stacksize, __page_size ) + __page_size;
-		stack = mmap(0p, stacksize, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
+		stack = mmap(0p, stacksize, __map_prot, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
 		if(stack == ((void*)-1)) {
 			abort( "pthread stack creation : internal error, mmap failure, error(%d) %s.", errno, strerror( errno ) );
Index: libcfa/src/concurrency/locks.cfa
===================================================================
--- libcfa/src/concurrency/locks.cfa	(revision 72a3aff1a5539f7902f2fb2ec6468b2cd5fec852)
+++ libcfa/src/concurrency/locks.cfa	(revision 852ae0eadf725a60480bf20abd6249d378714821)
@@ -29,4 +29,16 @@
 
 	void ^?{}( info_thread(L) & this ){ }
+
+	info_thread(L) *& Back( info_thread(L) * this ) {
+		return (info_thread(L) *)Back( (Seqable *)this );
+	}
+
+	info_thread(L) *& Next( info_thread(L) * this ) {
+		return (info_thread(L) *)Next( (Colable *)this );
+	}
+
+	bool listed( info_thread(L) * this ) {
+		return Next( (Colable *)this ) != 0p;
+	}
 }
 
@@ -58,5 +70,5 @@
 		abort("A single acquisition lock holder attempted to reacquire the lock resulting in a deadlock.");
 	} else if ( owner != 0p && owner != active_thread() ) {
-		append( blocked_threads, active_thread() );
+		addTail( blocked_threads, *active_thread() );
 		wait_count++;
 		unlock( lock );
@@ -96,5 +108,5 @@
 
 void pop_and_set_new_owner( blocking_lock & this ) with( this ) {
-	$thread * t = pop_head( blocked_threads );
+	$thread * t = &dropHead( blocked_threads );
 	owner = t;
 	recursion_count = ( t ? 1 : 0 );
@@ -128,5 +140,5 @@
     lock( lock __cfaabi_dbg_ctx2 );
 	if ( owner != 0p ) {
-		append( blocked_threads, t );
+		addTail( blocked_threads, *t );
 		wait_count++;
 		unlock( lock );
@@ -257,5 +269,4 @@
 		size_t recursion_count = 0;
 		if (i->lock) {
-			i->t->link.next = 1p;
 			recursion_count = get_recursion_count(*i->lock);
 			remove_( *i->lock );
Index: libcfa/src/concurrency/locks.hfa
===================================================================
--- libcfa/src/concurrency/locks.hfa	(revision 72a3aff1a5539f7902f2fb2ec6468b2cd5fec852)
+++ libcfa/src/concurrency/locks.hfa	(revision 852ae0eadf725a60480bf20abd6249d378714821)
@@ -43,4 +43,8 @@
 	void ?{}( info_thread(L) & this, $thread * t, uintptr_t info );
 	void ^?{}( info_thread(L) & this );
+
+	info_thread(L) *& Back( info_thread(L) * this );
+	info_thread(L) *& Next( info_thread(L) * this );
+	bool listed( info_thread(L) * this );
 }
 
@@ -64,5 +68,5 @@
 
 	// List of blocked threads
-	__queue_t( $thread ) blocked_threads;
+	Sequence( $thread ) blocked_threads;
 
 	// Count of current blocked threads
Index: libcfa/src/concurrency/thread.cfa
===================================================================
--- libcfa/src/concurrency/thread.cfa	(revision 72a3aff1a5539f7902f2fb2ec6468b2cd5fec852)
+++ libcfa/src/concurrency/thread.cfa	(revision 852ae0eadf725a60480bf20abd6249d378714821)
@@ -43,4 +43,7 @@
 		canary = 0x0D15EA5E0D15EA5Ep;
 	#endif
+
+	seqable.next = 0p;
+	seqable.back = 0p;
 
 	node.next = 0p;
