Index: libcfa/src/concurrency/preemption.cfa
===================================================================
--- libcfa/src/concurrency/preemption.cfa	(revision 941e14acf71a35fcfc0c89401d4b7aeac4fae297)
+++ libcfa/src/concurrency/preemption.cfa	(revision becb85b97dc1a9442bf01215f96bdbbeaa1b9a9b)
@@ -251,7 +251,18 @@
 	bool enabled = __cfaabi_tls.preemption_state.enabled;
 
+	// Check if there is a pending preemption
+	processor   * proc = __cfaabi_tls.this_processor;
+	bool pending = proc ? proc->pending_preemption : false;
+	if( enabled && pending ) proc->pending_preemption = false;
+
 	// create a assembler label after
 	// marked as clobber all to avoid movement
 	__cfaasm_label(check, after);
+
+	// If we can preempt and there is a pending one
+	// this is a good time to yield
+	if( enabled && pending ) {
+		force_yield( __POLL_PREEMPTION );
+	}
 	return enabled;
 }
@@ -282,4 +293,6 @@
 	// marked as clobber all to avoid movement
 	__cfaasm_label(get, after);
+
+	// This is used everywhere, to avoid cost, we DO NOT poll pending preemption
 	return val;
 }
@@ -358,5 +371,5 @@
 	if(!ready) { abort("Preemption should be ready"); }
 
-	__cfaasm_label(debug, before);
+	// __cfaasm_label(debug, before);
 
 		sigset_t oldset;
@@ -377,5 +390,5 @@
 		if(ret == 1) { abort("ERROR SIGTERM is disabled"); }
 
-	__cfaasm_label(debug, after);
+	// __cfaasm_label(debug, after);
 }
 
@@ -548,5 +561,5 @@
 	__cfaasm_label( check  );
 	__cfaasm_label( dsable );
-	__cfaasm_label( debug  );
+	// __cfaasm_label( debug  );
 
 	// Check if preemption is safe
@@ -555,5 +568,5 @@
 	if( __cfaasm_in( ip, check  ) ) { ready = false; goto EXIT; };
 	if( __cfaasm_in( ip, dsable ) ) { ready = false; goto EXIT; };
-	if( __cfaasm_in( ip, debug  ) ) { ready = false; goto EXIT; };
+	// if( __cfaasm_in( ip, debug  ) ) { ready = false; goto EXIT; };
 	if( !__cfaabi_tls.preemption_state.enabled) { ready = false; goto EXIT; };
 	if( __cfaabi_tls.preemption_state.in_progress ) { ready = false; goto EXIT; };
