[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#20978: [PATCH 5/7] : Refactor timeouts in wait_reading_process_outpu
From: |
Ian Kelling |
Subject: |
bug#20978: [PATCH 5/7] : Refactor timeouts in wait_reading_process_output |
Date: |
Sat, 04 Jul 2015 05:45:41 -0700 |
User-agent: |
Gnus/5.130012 (Ma Gnus v0.12) Emacs/25.0.50 (gnu/linux) |
* src/process.c (wait_reading_process_output): Simplify timeouts with
an enum. Remove a redundant condition.
diff --git a/src/process.c b/src/process.c
index 68a815f..538455c 100644
--- a/src/process.c
+++ b/src/process.c
@@ -4586,6 +4586,7 @@ wait_reading_process_output (intmax_t time_limit, int
nsecs, int read_kbd,
int xerrno;
Lisp_Object proc;
struct timespec timeout, end_time;
+ enum { MINIMUM, TIMEOUT, INFINITY } wait;
int got_some_output = -1;
ptrdiff_t count = SPECPDL_INDEX ();
@@ -4601,21 +4602,19 @@ wait_reading_process_output (intmax_t time_limit, int
nsecs, int read_kbd,
waiting_for_user_input_p);
waiting_for_user_input_p = read_kbd;
- if (time_limit < 0)
- {
- time_limit = 0;
- nsecs = -1;
- }
- else if (TYPE_MAXIMUM (time_t) < time_limit)
+ if (TYPE_MAXIMUM (time_t) < time_limit)
time_limit = TYPE_MAXIMUM (time_t);
- /* Since we may need to wait several times,
- compute the absolute time to return at. */
- if (time_limit || nsecs > 0)
+ if (time_limit < 0 || nsecs < 0)
+ wait = MINIMUM;
+ else if (time_limit > 0 || nsecs > 0)
{
- timeout = make_timespec (time_limit, nsecs);
- end_time = timespec_add (current_timespec (), timeout);
+ wait = TIMEOUT;
+ end_time = timespec_add (current_timespec (),
+ make_timespec (time_limit, nsecs));
}
+ else
+ wait = INFINITY;
while (1)
{
@@ -4635,19 +4634,15 @@ wait_reading_process_output (intmax_t time_limit, int
nsecs, int read_kbd,
/* After reading input, vacuum up any leftovers without waiting. */
if (0 <= got_some_output)
- nsecs = -1;
+ wait = MINIMUM;
/* Compute time from now till when time limit is up. */
/* Exit if already run out. */
- if (nsecs < 0)
+ if (wait == MINIMUM)
{
- /* A negative timeout means
- gobble output available now
- but don't wait at all. */
-
- timeout = make_timespec (0, 0);
+ timeout = make_timespec (0, 0);
}
- else if (time_limit || nsecs > 0)
+ else if (wait == TIMEOUT)
{
struct timespec now = current_timespec ();
if (timespec_cmp (end_time, now) <= 0)
@@ -4698,24 +4693,20 @@ wait_reading_process_output (intmax_t time_limit, int
nsecs, int read_kbd,
&& requeued_events_pending_p ())
break;
- /* A negative timeout means do not wait at all. */
- if (nsecs >= 0)
- {
- if (timespec_valid_p (timer_delay))
- {
- if (timespec_cmp (timer_delay, timeout) < 0)
- {
- timeout = timer_delay;
- timeout_reduced_for_timers = true;
- }
- }
- else
- {
- /* This is so a breakpoint can be put here. */
- wait_reading_process_output_1 ();
- }
- }
- }
+ if (timespec_valid_p (timer_delay))
+ {
+ if (timespec_cmp (timer_delay, timeout) < 0)
+ {
+ timeout = timer_delay;
+ timeout_reduced_for_timers = true;
+ }
+ }
+ else
+ {
+ /* This is so a breakpoint can be put here. */
+ wait_reading_process_output_1 ();
+ }
+ }
/* Cause C-g and alarm signals to take immediate action,
and cause input available signals to zero out timeout.
@@ -4964,7 +4955,7 @@ wait_reading_process_output (intmax_t time_limit, int
nsecs, int read_kbd,
/* If we woke up due to SIGWINCH, actually change size now. */
do_pending_window_change (0);
- if ((time_limit || nsecs) && nfds == 0 && ! timeout_reduced_for_timers)
+ if (wait != INFINITY && nfds == 0 && ! timeout_reduced_for_timers)
/* We waited the full specified time, so return now. */
break;
if (nfds < 0)
@@ -6953,21 +6944,21 @@ wait_reading_process_output (intmax_t time_limit, int
nsecs, int read_kbd,
{
register int nfds;
struct timespec end_time, timeout;
+ enum { MINIMUM, TIMEOUT, INFINITY } wait;
- if (time_limit < 0)
- {
- time_limit = 0;
- nsecs = -1;
- }
- else if (TYPE_MAXIMUM (time_t) < time_limit)
+ if (TYPE_MAXIMUM (time_t) < time_limit)
time_limit = TYPE_MAXIMUM (time_t);
- /* What does time_limit really mean? */
- if (time_limit || nsecs > 0)
+ if (time_limit < 0 || nsecs < 0)
+ wait = MINIMUM;
+ else if (time_limit > 0 || nsecs > 0)
{
- timeout = make_timespec (time_limit, nsecs);
- end_time = timespec_add (current_timespec (), timeout);
+ wait = TIMEOUT;
+ end_time = timespec_add (current_timespec (),
+ make_timespec (time_limit, nsecs));
}
+ else
+ wait = INFINITY;
/* Turn off periodic alarms (in case they are in use)
and then turn off any other atimers,
@@ -6993,15 +6984,11 @@ wait_reading_process_output (intmax_t time_limit, int
nsecs, int read_kbd,
/* Compute time from now till when time limit is up. */
/* Exit if already run out. */
- if (nsecs < 0)
+ if (wait == MINIMUM)
{
- /* A negative timeout means
- gobble output available now
- but don't wait at all. */
-
- timeout = make_timespec (0, 0);
+ timeout = make_timespec (0, 0);
}
- else if (time_limit || nsecs > 0)
+ else if (wait == TIMEOUT)
{
struct timespec now = current_timespec ();
if (timespec_cmp (end_time, now) <= 0)
@@ -7039,7 +7026,7 @@ wait_reading_process_output (intmax_t time_limit, int
nsecs, int read_kbd,
&& requeued_events_pending_p ())
break;
- if (timespec_valid_p (timer_delay) && nsecs >= 0)
+ if (timespec_valid_p (timer_delay))
{
if (timespec_cmp (timer_delay, timeout) < 0)
{
@@ -7083,7 +7070,7 @@ wait_reading_process_output (intmax_t time_limit, int
nsecs, int read_kbd,
/* If we woke up due to SIGWINCH, actually change size now. */
do_pending_window_change (0);
- if ((time_limit || nsecs) && nfds == 0 && ! timeout_reduced_for_timers)
+ if (wait != INFINITY && nfds == 0 && ! timeout_reduced_for_timers)
/* We waited the full specified time, so return now. */
break;
--
2.4.5
- bug#20978: 25.0.50; [PATCH 0/7] Emacs can return too fast when reading from any processes, Ian Kelling, 2015/07/04
- bug#20978: [PATCH 1/7] ; Minor cleanup of wait_reading_process_output, Ian Kelling, 2015/07/04
- bug#20978: [PATCH 2/7] ; Remove ADAPTIVE_READ_BUFFERING ifdef, Ian Kelling, 2015/07/04
- bug#20978: [PATCH 3/7] ; Rename local var to match function name, Ian Kelling, 2015/07/04
- bug#20978: [PATCH 4/7] ; Rename local var nsecs to adaptive_nsecs, Ian Kelling, 2015/07/04
- bug#20978: [PATCH 5/7] : Refactor timeouts in wait_reading_process_output,
Ian Kelling <=
- bug#20978: [PATCH 6/7] Don't return as fast reading any process output, Ian Kelling, 2015/07/04
- bug#20978: [PATCH 7/7] Avoid returning early reading process output due to SIGIO, Ian Kelling, 2015/07/04
- bug#20978: 25.0.50; [PATCH 0/7] Emacs can return too fast when reading from any processes, Eli Zaretskii, 2015/07/04
bug#20978: 25.0.50; [PATCH 0/7] Emacs can return too fast when reading from any processes, Ian Kelling, 2015/07/04
bug#20978: 25.0.50; [PATCH 0/7] Emacs can return too fast when reading from any processes, Paul Eggert, 2015/07/05