Index: libcfa/src/bits/locks.hfa
===================================================================
--- libcfa/src/bits/locks.hfa	(revision cefd0b9f8d669c3888a7be8acdd78102ec58c3c8)
+++ libcfa/src/bits/locks.hfa	(revision fbb930ec77eae01fe0f6a0d17ebf91b832058985)
@@ -32,4 +32,5 @@
 		extern void disable_interrupts() OPTIONAL_THREAD;
 		extern void enable_interrupts( bool poll = true ) OPTIONAL_THREAD;
+		extern bool poll_interrupts() OPTIONAL_THREAD;
 		#define __cfaabi_dbg_record_lock(x, y)
 	}
Index: libcfa/src/concurrency/preemption.cfa
===================================================================
--- libcfa/src/concurrency/preemption.cfa	(revision cefd0b9f8d669c3888a7be8acdd78102ec58c3c8)
+++ libcfa/src/concurrency/preemption.cfa	(revision fbb930ec77eae01fe0f6a0d17ebf91b832058985)
@@ -357,4 +357,27 @@
 			}
 		}
+	}
+
+	// Check whether or not there is pending preemption
+	// force_yield( __POLL_PREEMPTION ) if appropriate
+	// return true if the thread was in an interruptable state
+	// i.e. on a real processor and not in the kernel
+	// (can return true even if no preemption was pending)
+	bool poll_interrupts() libcfa_public {
+		// Cache the processor now since interrupts can start happening after the atomic store
+		processor   * proc = publicTLS_get( this_processor );
+		if ( ! proc ) return false;
+		if ( ! __preemption_enabled() ) return false;
+
+		with( __cfaabi_tls.preemption_state ){
+			// Signal the compiler that a fence is needed but only for signal handlers
+			__atomic_signal_fence(__ATOMIC_RELEASE);
+			if( proc->pending_preemption ) {
+				proc->pending_preemption = false;
+				force_yield( __POLL_PREEMPTION );
+			}
+		}
+
+		return true;
 	}
 }
Index: libcfa/src/startup.cfa
===================================================================
--- libcfa/src/startup.cfa	(revision cefd0b9f8d669c3888a7be8acdd78102ec58c3c8)
+++ libcfa/src/startup.cfa	(revision fbb930ec77eae01fe0f6a0d17ebf91b832058985)
@@ -43,4 +43,5 @@
 	void disable_interrupts() __attribute__(( weak )) libcfa_public {}
 	void enable_interrupts() __attribute__(( weak )) libcfa_public {}
+	bool poll_interrupts() __attribute__(( weak )) libcfa_public { return false; }
 
 
