]> git.eshelyaron.com Git - emacs.git/commitdiff
Always start the SIGALRM atimers
authorLars Ingebrigtsen <larsi@gnus.org>
Wed, 27 Oct 2021 12:58:08 +0000 (14:58 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Wed, 27 Oct 2021 12:58:08 +0000 (14:58 +0200)
* src/atimer.c (init_atimer): Always start the SIGALRM alarms,
even if we're using timerfd (bug#19776).  See long, long
discussion in the bug report for why this is necessary.

src/atimer.c

index 9b198675ab49633cc55ee2bd5b687e324f1bb940..802f3c6a596b4e70ed455a6c00d7b5d00384e9be 100644 (file)
@@ -583,15 +583,16 @@ init_atimer (void)
   timerfd = (egetenv ("EMACS_IGNORE_TIMERFD") || have_buggy_timerfd () ? -1 :
             timerfd_create (CLOCK_REALTIME, TFD_NONBLOCK | TFD_CLOEXEC));
 # endif
-  if (timerfd < 0)
-    {
-      struct sigevent sigev;
-      sigev.sigev_notify = SIGEV_SIGNAL;
-      sigev.sigev_signo = SIGALRM;
-      sigev.sigev_value.sival_ptr = &alarm_timer;
-      alarm_timer_ok
-       = timer_create (CLOCK_REALTIME, &sigev, &alarm_timer) == 0;
-    }
+  /* We're starting the alarms even if we have timerfd, because
+     timerfd events do not fired while Emacs Lisp is busy.  This might
+     or might not mean that the timerfd code doesn't really give us
+     anything and should be removed, see discussion in bug#19776.  */
+  struct sigevent sigev;
+  sigev.sigev_notify = SIGEV_SIGNAL;
+  sigev.sigev_signo = SIGALRM;
+  sigev.sigev_value.sival_ptr = &alarm_timer;
+  alarm_timer_ok
+    = timer_create (CLOCK_REALTIME, &sigev, &alarm_timer) == 0;
 #endif
   free_atimers = stopped_atimers = atimers = NULL;