aboutsummaryrefslogtreecommitdiffstats
path: root/src/atimer.c
diff options
context:
space:
mode:
authorDmitry Antipov2014-07-28 18:50:55 +0400
committerDmitry Antipov2014-07-28 18:50:55 +0400
commit2daa203c3eb983433b86b841bf31d3e91bb51ab4 (patch)
tree3e5c62bcf52d6ffea9254e6ce4f8a1393038d479 /src/atimer.c
parentda41ffdd089b529c3d5216412d95840e065c3fe3 (diff)
downloademacs-2daa203c3eb983433b86b841bf31d3e91bb51ab4.tar.gz
emacs-2daa203c3eb983433b86b841bf31d3e91bb51ab4.zip
Fix Gnus-related issues reported by David Kastrup <dak@gnu.org> in
<http://lists.gnu.org/archive/html/emacs-devel/2014-07/msg00370.html>. * atimer.c (timerfd_callback): Always read expiration data. Add comment. (turn_on_atimers) [HAVE_TIMERFD]: Disarm timerfd timer. * process.c (add_timer_wait_descriptor): Add timer descriptor to input_wait_mask and non_process_wait_mask as well.
Diffstat (limited to 'src/atimer.c')
-rw-r--r--src/atimer.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/atimer.c b/src/atimer.c
index 9079e7712e0..c03ac96c6da 100644
--- a/src/atimer.c
+++ b/src/atimer.c
@@ -410,9 +410,19 @@ handle_alarm_signal (int sig)
410 410
411#ifdef HAVE_TIMERFD 411#ifdef HAVE_TIMERFD
412 412
413/* Called from wait_reading_process_output when FD, which
414 should be equal to TIMERFD, is available for reading. */
415
413void 416void
414timerfd_callback (int fd, void *arg) 417timerfd_callback (int fd, void *arg)
415{ 418{
419 char buf[8];
420 ptrdiff_t nbytes;
421
422 eassert (fd == timerfd);
423 nbytes = emacs_read (fd, buf, sizeof (buf));
424 /* Just discard an expiration count for now. */
425 eassert (nbytes == sizeof (buf));
416 do_pending_atimers (); 426 do_pending_atimers ();
417} 427}
418 428
@@ -442,7 +452,18 @@ turn_on_atimers (bool on)
442 if (on) 452 if (on)
443 set_alarm (); 453 set_alarm ();
444 else 454 else
445 alarm (0); 455 {
456#ifdef HAVE_TIMERFD
457 if (special_timer_available > 1)
458 {
459 struct itimerspec ispec;
460 memset (&ispec, 0, sizeof (ispec));
461 /* Writing zero expiration time should disarm it. */
462 timerfd_settime (timerfd, TFD_TIMER_ABSTIME, &ispec, 0);
463 }
464#endif /* HAVE_TIMERFD */
465 alarm (0);
466 }
446} 467}
447 468
448/* This is intended to use from automated tests. */ 469/* This is intended to use from automated tests. */