Index: libcfa/src/concurrency/io/setup.cfa
===================================================================
--- libcfa/src/concurrency/io/setup.cfa	(revision b0f6190a766740c15ebaa39f0b0f60de7fe5d3be)
+++ libcfa/src/concurrency/io/setup.cfa	(revision 50202fa54956464dfd0374ddcf0876f797e37bec)
@@ -314,6 +314,6 @@
 	}
 
-	extern void signal_block( int sig );
-	extern void signal_unblock( int sig );
+	extern void __disable_interrupts_hard();
+	extern void __enable_interrupts_hard();
 
 	static void __io_create( __io_data & this, const io_context_params & params_in ) {
@@ -434,5 +434,5 @@
 		// io_uring_register is so f*cking slow on some machine that it
 		// will never succeed if preemption isn't hard blocked
-		signal_block( SIGUSR1 );
+		__disable_interrupts_hard();
 
 		int efd = eventfd(0, 0);
@@ -446,5 +446,5 @@
 		}
 
-		signal_unblock( SIGUSR1 );
+		__enable_interrupts_hard();
 
 		// some paranoid checks
Index: libcfa/src/concurrency/preemption.cfa
===================================================================
--- libcfa/src/concurrency/preemption.cfa	(revision b0f6190a766740c15ebaa39f0b0f60de7fe5d3be)
+++ libcfa/src/concurrency/preemption.cfa	(revision 50202fa54956464dfd0374ddcf0876f797e37bec)
@@ -394,5 +394,5 @@
 
 // sigprocmask wrapper : unblock a single signal
-void signal_unblock( int sig ) {
+static inline void signal_unblock( int sig ) {
 	sigset_t mask;
 	sigemptyset( &mask );
@@ -405,5 +405,5 @@
 
 // sigprocmask wrapper : block a single signal
-void signal_block( int sig ) {
+static inline void signal_block( int sig ) {
 	sigset_t mask;
 	sigemptyset( &mask );
@@ -424,4 +424,38 @@
 static void timeout( $thread * this ) {
 	unpark( this );
+}
+
+void __disable_interrupts_hard() {
+	sigset_t oldset;
+	int ret;
+	ret = pthread_sigmask(0, ( const sigset_t * ) 0p, &oldset);  // workaround trac#208: cast should be unnecessary
+	if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); }
+
+	ret = sigismember(&oldset, SIGUSR1);
+	if(ret <  0) { abort("ERROR sigismember returned %d", ret); }
+	if(ret == 1) { abort("ERROR SIGUSR1 is disabled"); }
+
+	ret = sigismember(&oldset, SIGALRM);
+	if(ret <  0) { abort("ERROR sigismember returned %d", ret); }
+	if(ret == 0) { abort("ERROR SIGALRM is enabled"); }
+
+	signal_block( SIGUSR1 );
+}
+
+void __enable_interrupts_hard() {
+	signal_unblock( SIGUSR1 );
+
+	sigset_t oldset;
+	int ret;
+	ret = pthread_sigmask(0, ( const sigset_t * ) 0p, &oldset);  // workaround trac#208: cast should be unnecessary
+	if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); }
+
+	ret = sigismember(&oldset, SIGUSR1);
+	if(ret <  0) { abort("ERROR sigismember returned %d", ret); }
+	if(ret == 1) { abort("ERROR SIGUSR1 is disabled"); }
+
+	ret = sigismember(&oldset, SIGALRM);
+	if(ret <  0) { abort("ERROR sigismember returned %d", ret); }
+	if(ret == 0) { abort("ERROR SIGALRM is enabled"); }
 }
 
