diff --git a/libc/signal.cc b/libc/signal.cc
index 5505a10fc9ade179803d4e7bafe7d1543886cc24..c4bb7a604e4b58fd55a476675ed4bd915dfc90d9 100644
--- a/libc/signal.cc
+++ b/libc/signal.cc
@@ -267,6 +267,18 @@ void alarm_thread_func()
     }
 }
 
+static void cancel_alarm_ll()
+{
+    alarm_due = 0;
+    alarm_cond.wake_one();
+}
+
+static void set_alarm_ll(s64 new_alarm_due)
+{
+    alarm_due = new_alarm_due;
+    alarm_cond.wake_one();
+}
+
 unsigned int alarm(unsigned int seconds)
 {
     unsigned int ret = 0;
@@ -280,12 +292,11 @@ unsigned int alarm(unsigned int seconds)
             ret = (alarm_due - now) / 1_s;
         }
         if (seconds) {
-            alarm_due = now + seconds*1_s;
+            set_alarm_ll(now + seconds*1_s);
         } else {
             // alarm(0) means cancel alarm, not an alarm in 0 seconds.
-            alarm_due = 0;
+            cancel_alarm_ll();
         }
-        alarm_cond.wake_one();
     }
     return ret;
 }