Index: libcfa/src/concurrency/kernel.cfa
===================================================================
--- libcfa/src/concurrency/kernel.cfa	(revision c1c95b170b12b5d8d9988a2c2ce855a01393976c)
+++ libcfa/src/concurrency/kernel.cfa	(revision c6c7e6cd5d9e1471e24ed99b383e023f0fc0bf04)
@@ -110,4 +110,5 @@
 static $thread * __next_thread(cluster * this);
 static $thread * __next_thread_slow(cluster * this);
+static inline bool __must_unpark( $thread * thrd ) __attribute((nonnull(1)));
 static void __run_thread(processor * this, $thread * dst);
 static void __wake_one(cluster * cltr);
@@ -496,35 +497,36 @@
 }
 
-void unpark( $thread * thrd ) {
-	if( !thrd ) return;
-
+static inline bool __must_unpark( $thread * thrd ) {
 	int old_ticket = __atomic_fetch_add(&thrd->ticket, 1, __ATOMIC_SEQ_CST);
 	switch(old_ticket) {
 		case TICKET_RUNNING:
 			// Wake won the race, the thread will reschedule/rerun itself
-			break;
+			return false;
 		case TICKET_BLOCKED:
 			/* paranoid */ verify( ! thrd->preempted != __NO_PREEMPTION );
 			/* paranoid */ verify( thrd->state == Blocked );
-
-			{
-				/* paranoid */ verify( publicTLS_get(this_proc_id) );
-				disable_interrupts();
-
-				/* paranoid */ verify( ! __preemption_enabled() );
-
-				// Wake lost the race,
-				__schedule_thread( thrd );
-
-				/* paranoid */ verify( ! __preemption_enabled() );
-
-				enable_interrupts_noPoll();
-				/* paranoid */ verify( publicTLS_get(this_proc_id) );
-			}
-
-			break;
+			return true;
 		default:
 			// This makes no sense, something is wrong abort
 			abort("Thread %p (%s) has mismatch park/unpark\n", thrd, thrd->self_cor.name);
+	}
+}
+
+void unpark( $thread * thrd ) {
+	if( !thrd ) return;
+
+	if(__must_unpark(thrd)) {
+		/* paranoid */ verify( publicTLS_get(this_proc_id) );
+		disable_interrupts();
+
+		/* paranoid */ verify( ! __preemption_enabled() );
+
+		// Wake lost the race,
+		__schedule_thread( thrd );
+
+		/* paranoid */ verify( ! __preemption_enabled() );
+
+		enable_interrupts_noPoll();
+		/* paranoid */ verify( publicTLS_get(this_proc_id) );
 	}
 }
