diff options
| author | Dmitry Antipov | 2014-07-28 18:50:55 +0400 |
|---|---|---|
| committer | Dmitry Antipov | 2014-07-28 18:50:55 +0400 |
| commit | 2daa203c3eb983433b86b841bf31d3e91bb51ab4 (patch) | |
| tree | 3e5c62bcf52d6ffea9254e6ce4f8a1393038d479 /src/atimer.c | |
| parent | da41ffdd089b529c3d5216412d95840e065c3fe3 (diff) | |
| download | emacs-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.c | 23 |
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 | |||
| 413 | void | 416 | void |
| 414 | timerfd_callback (int fd, void *arg) | 417 | timerfd_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. */ |