Index: src/libcfa/concurrency/preemption.c
===================================================================
--- src/libcfa/concurrency/preemption.c	(revision b1a43005e87089482731ec24b33f9461080e8ceb)
+++ src/libcfa/concurrency/preemption.c	(revision a83ffa4028911fea2bf6ed4bcb989b611f3c6a1e)
@@ -15,4 +15,5 @@
 
 #include "preemption.h"
+#include <assert.h>
 
 extern "C" {
@@ -350,6 +351,9 @@
 	kernelTLS.preemption_state.in_progress = true;
 
-	// We are about to CtxSwitch out of the signal handler, let other handlers in
-	signal_unblock( SIGUSR1 );
+	// Clear sighandler mask before context switching.
+	static_assert( sizeof( sigset_t ) == sizeof( cxt->uc_sigmask ), "Expected cxt->uc_sigmask to be of sigset_t" );
+	if ( pthread_sigmask( SIG_SETMASK, (sigset_t *)&(cxt->uc_sigmask), NULL ) == -1 ) {
+		abort( "internal error, sigprocmask" );
+	}
 
 	// TODO: this should go in finish action
@@ -435,11 +439,18 @@
 	sigset_t oldset;
 	int ret;
-	ret = sigprocmask(0, NULL, &oldset);
+	ret = pthread_sigmask(0, NULL, &oldset);
 	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"); }
+
+	ret = sigismember(&oldset, SIGTERM);
+	if(ret <  0) { abort("ERROR sigismember returned %d", ret); }
+	if(ret == 1) { abort("ERROR SIGTERM is disabled"); }
 }
 
Index: src/tests/concurrent/preempt.c
===================================================================
--- src/tests/concurrent/preempt.c	(revision b1a43005e87089482731ec24b33f9461080e8ceb)
+++ src/tests/concurrent/preempt.c	(revision a83ffa4028911fea2bf6ed4bcb989b611f3c6a1e)
@@ -44,5 +44,5 @@
 
 int main(int argc, char* argv[]) {
-	processor p;
+	// processor p;
 	{
 		worker_t w0 = 0;
