diff options
| author | Dmitry Antipov | 2014-07-28 10:28:15 +0400 |
|---|---|---|
| committer | Dmitry Antipov | 2014-07-28 10:28:15 +0400 |
| commit | 768b24eb0e880c0b39e36fd089905cdca572a758 (patch) | |
| tree | 75899b103fedc549e5d17294d39bfcb4ed0a9bc9 /src/process.c | |
| parent | 7daa4ff121ad8da6e609b959d5c95796e5d3a9eb (diff) | |
| download | emacs-768b24eb0e880c0b39e36fd089905cdca572a758.tar.gz emacs-768b24eb0e880c0b39e36fd089905cdca572a758.zip | |
On GNU/Linux, use timerfd for asynchronous timers.
* configure.ac (toplevel): Check whether GNU/Linux-specific
timerfd functions and macros are available.
* m4/clock_time.m4 (gl_CLOCK_TIME): Check for clock_getres as well.
* src/atimer.c (toplevel) [HAVE_TIMERFD]: Include sys/timerfd.h.
(toplevel): Rename alarm_timer_ok to special_timer_available.
[HAVE_TIMERFD]: Declare timerfd.
[HAVE_CLOCK_GETRES]: Declare resolution.
(start_atimer) [HAVE_CLOCK_GETRES]: Round up timestamp to
system timer resolution.
(set_alarm) [HAVE_TIMERFD]: Use timerfd_settime.
(timerfd_callback) [HAVE_TIMERFD]: New function.
(atimer_result, debug_timer_callback, Fdebug_timer_check)
[ENABLE_CHECKING]: New function for the sake of automated tests.
(init_atimer) [HAVE_TIMERFD]: Setup timerfd.
[HAVE_CLOCK_GETRES]: Likewise for system timer resolution.
[ENABLE_CHECKING]: Defsubr test function.
* src/atimer.h (timerfd_callback) [HAVE_TIMERFD]: Add prototype.
* src/lisp.h (add_timer_wait_descriptor) [HAVE_TIMERFD]: Likewise.
* src/process.c (add_timer_wait_descriptor) [HAVE_TIMERFD]: New function.
* test/automated/timer-tests.el (timer-tests-debug-timer-check): New test.
Diffstat (limited to 'src/process.c')
| -rw-r--r-- | src/process.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/process.c b/src/process.c index 4449493a2b6..cfc1e189cab 100644 --- a/src/process.c +++ b/src/process.c | |||
| @@ -6827,6 +6827,24 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd, | |||
| 6827 | /* The following functions are needed even if async subprocesses are | 6827 | /* The following functions are needed even if async subprocesses are |
| 6828 | not supported. Some of them are no-op stubs in that case. */ | 6828 | not supported. Some of them are no-op stubs in that case. */ |
| 6829 | 6829 | ||
| 6830 | #ifdef HAVE_TIMERFD | ||
| 6831 | |||
| 6832 | /* Add FD, which is a descriptor returned by timerfd_create, | ||
| 6833 | to the set of non-keyboard input descriptors. */ | ||
| 6834 | |||
| 6835 | void | ||
| 6836 | add_timer_wait_descriptor (int fd) | ||
| 6837 | { | ||
| 6838 | FD_SET (fd, &non_keyboard_wait_mask); | ||
| 6839 | fd_callback_info[fd].func = timerfd_callback; | ||
| 6840 | fd_callback_info[fd].data = NULL; | ||
| 6841 | fd_callback_info[fd].condition |= FOR_READ; | ||
| 6842 | if (fd > max_input_desc) | ||
| 6843 | max_input_desc = fd; | ||
| 6844 | } | ||
| 6845 | |||
| 6846 | #endif /* HAVE_TIMERFD */ | ||
| 6847 | |||
| 6830 | /* Add DESC to the set of keyboard input descriptors. */ | 6848 | /* Add DESC to the set of keyboard input descriptors. */ |
| 6831 | 6849 | ||
| 6832 | void | 6850 | void |