* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly @ 2021-08-13 11:56 Lars Ingebrigtsen 2021-08-13 13:16 ` Eli Zaretskii 0 siblings, 1 reply; 20+ messages in thread From: Lars Ingebrigtsen @ 2021-08-13 11:56 UTC (permalink / raw) To: 50043 To reproduce the problem on Debian (at least), edit src/config.h to this: /* Define to 1 if SIGIO is usable. */ /* #define USABLE_SIGIO 0 */ Then recompile Emacs and say (let ((value 'SECONDARY) (x-selection-timeout 2000)) ;;; from org-get-x-clipboard in lisp/org-compat.el (gui-get-selection value 'UTF8_STRING) (gui-get-selection value 'COMPOUND_TEXT) (gui-get-selection value 'STRING) (gui-get-selection value 'TEXT)) This will hang for two seconds instead of returning immediately if USABLE_SIGIO is defined. Now, we have SIGIO on almost all supported platforms. The only ones that have it disabled might be these ones: hpux* | nacl | solaris | unixware ) emacs_broken_SIGIO=yes Which is probably why this hasn't been reported more. (See bug#29170.) So this isn't exactly a high impact problem, but it should be fixed anyway. -- (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-08-13 11:56 bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly Lars Ingebrigtsen @ 2021-08-13 13:16 ` Eli Zaretskii 2021-08-13 14:31 ` Lars Ingebrigtsen 0 siblings, 1 reply; 20+ messages in thread From: Eli Zaretskii @ 2021-08-13 13:16 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: 50043 > From: Lars Ingebrigtsen <larsi@gnus.org> > Date: Fri, 13 Aug 2021 13:56:40 +0200 > > > To reproduce the problem on Debian (at least), edit src/config.h to > this: > > /* Define to 1 if SIGIO is usable. */ > /* #define USABLE_SIGIO 0 */ > > Then recompile Emacs and say > > (let ((value 'SECONDARY) > (x-selection-timeout 2000)) > ;;; from org-get-x-clipboard in lisp/org-compat.el > (gui-get-selection value 'UTF8_STRING) > (gui-get-selection value 'COMPOUND_TEXT) > (gui-get-selection value 'STRING) > (gui-get-selection value 'TEXT)) > > This will hang for two seconds instead of returning immediately if > USABLE_SIGIO is defined. can you tell where does it hang, and why? Bonus points for explaining why the same scenario doesn't hang for USABLE_SIGIO platforms. ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-08-13 13:16 ` Eli Zaretskii @ 2021-08-13 14:31 ` Lars Ingebrigtsen 2021-08-13 15:51 ` Eli Zaretskii 0 siblings, 1 reply; 20+ messages in thread From: Lars Ingebrigtsen @ 2021-08-13 14:31 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 50043 Eli Zaretskii <eliz@gnu.org> writes: > can you tell where does it hang, and why? Bonus points for explaining > why the same scenario doesn't hang for USABLE_SIGIO platforms. It's hanging here: x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type, Lisp_Object time_stamp, Lisp_Object frame) { [...] wait_reading_process_output (secs, nsecs, 0, false, reading_selection_reply, NULL, 0); That is, it's not really hanging hanging, but this sometimes takes a couple of seconds without SIGIO, while it returns instantaneously with SIGOI. -- (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-08-13 14:31 ` Lars Ingebrigtsen @ 2021-08-13 15:51 ` Eli Zaretskii 2021-08-14 11:52 ` Lars Ingebrigtsen 0 siblings, 1 reply; 20+ messages in thread From: Eli Zaretskii @ 2021-08-13 15:51 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: 50043 > From: Lars Ingebrigtsen <larsi@gnus.org> > Cc: 50043@debbugs.gnu.org > Date: Fri, 13 Aug 2021 16:31:52 +0200 > > Eli Zaretskii <eliz@gnu.org> writes: > > > can you tell where does it hang, and why? Bonus points for explaining > > why the same scenario doesn't hang for USABLE_SIGIO platforms. > > It's hanging here: > > x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type, > Lisp_Object time_stamp, Lisp_Object frame) > { > [...] > wait_reading_process_output (secs, nsecs, 0, false, > reading_selection_reply, NULL, 0); > > That is, it's not really hanging hanging, but this sometimes takes a > couple of seconds without SIGIO, while it returns instantaneously with > SIGOI. Do you understand which code un-hangs it when USABLE_SIGIO is defined? Or is it a SIGIO signal that arrives and does that? If the latter, any idea what causes that SIGIO? Thanks. ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-08-13 15:51 ` Eli Zaretskii @ 2021-08-14 11:52 ` Lars Ingebrigtsen 2021-11-15 15:19 ` Ken Brown 0 siblings, 1 reply; 20+ messages in thread From: Lars Ingebrigtsen @ 2021-08-14 11:52 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 50043 Eli Zaretskii <eliz@gnu.org> writes: > Do you understand which code un-hangs it when USABLE_SIGIO is defined? > Or is it a SIGIO signal that arrives and does that? If the latter, > any idea what causes that SIGIO? Nope; haven't digged any further. -- (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-08-14 11:52 ` Lars Ingebrigtsen @ 2021-11-15 15:19 ` Ken Brown 2021-11-15 17:24 ` Eli Zaretskii 0 siblings, 1 reply; 20+ messages in thread From: Ken Brown @ 2021-11-15 15:19 UTC (permalink / raw) To: Lars Ingebrigtsen, Eli Zaretskii; +Cc: 50043 On 8/14/2021 7:52 AM, Lars Ingebrigtsen wrote: > Eli Zaretskii <eliz@gnu.org> writes: > >> Do you understand which code un-hangs it when USABLE_SIGIO is defined? >> Or is it a SIGIO signal that arrives and does that? If the latter, >> any idea what causes that SIGIO? > > Nope; haven't digged any further. I think I found the problem. x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type, Lisp_Object time_stamp, Lisp_Object frame) { [...] wait_reading_process_output (secs, nsecs, 0, false, reading_selection_reply, NULL, 0); I think wait_reading_process_output gets stuck for 2 seconds in a call to select (actually xg_select because I'm testing a gtk build). This is independent of the fact that x-selection-timeout is 2 seconds; it happens even if x-selection-timeout is 0. select returns after 2 seconds because the poll_timer fires. On systems with SIGIO, select returns as soon as X events occur, because SIGIO is signaled. To test my theory, I applied the following patch: diff --git a/src/process.c b/src/process.c index f923aff1cb..136873edbb 100644 --- a/src/process.c +++ b/src/process.c @@ -5477,9 +5477,10 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd, triggered by processing X events). In the latter case, set nfds to 1 to avoid breaking the loop. */ no_avail = 0; - if ((read_kbd || !NILP (wait_for_cell)) - && detect_input_pending ()) + if ((read_kbd || !NILP (wait_for_cell))) + /* && detect_input_pending ()) */ { + detect_input_pending (); nfds = read_kbd ? 0 : 1; no_avail = 1; FD_ZERO (&Available); This forces the select call to be skipped, so wait_reading_process_output just keeps looping, checking for input, and checking for a cell change. With this patch, the hang is gone. I'm not suggesting that this patch is the right fix. But somehow we have to improve how polling for input is done on systems without SIGIO, at least in the situation above in which we're waiting for a cell. There's a comment in process.c around line 5304 that says "the wait is supposed to be short" in this case. We certainly don't want to always skip the select call, but would it make sense to use a very short timeout for select in that case? Or maybe someone has a better idea. Ken ^ permalink raw reply related [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-11-15 15:19 ` Ken Brown @ 2021-11-15 17:24 ` Eli Zaretskii 2021-11-15 19:26 ` Ken Brown 0 siblings, 1 reply; 20+ messages in thread From: Eli Zaretskii @ 2021-11-15 17:24 UTC (permalink / raw) To: Ken Brown; +Cc: larsi, 50043 > Date: Mon, 15 Nov 2021 10:19:32 -0500 > Cc: 50043@debbugs.gnu.org > From: Ken Brown <kbrown@cornell.edu> > > x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type, > Lisp_Object time_stamp, Lisp_Object frame) > { > [...] > wait_reading_process_output (secs, nsecs, 0, false, > reading_selection_reply, NULL, 0); > > I think wait_reading_process_output gets stuck for 2 seconds in a call to select > (actually xg_select because I'm testing a gtk build). This is independent of > the fact that x-selection-timeout is 2 seconds; it happens even if > x-selection-timeout is 0. select returns after 2 seconds because the poll_timer > fires. Sorry, I don't understand: select waits for up to 2 seconds because that's what we ask it to do, and those 2 sec do come from x-selection-timeout. If x-selection-timeout is zero, select is not supposed to wait at all, so why does it? What am I missing? > On systems with SIGIO, select returns as soon as X events occur, because > SIGIO is signaled. Which X event is that? something related to Emacs and selections, or just a random event which simply happens at that time? Anyway, AFAIU, the wait is supposed to end because XTread_socket reads a SelectionNotify event, and that modifies the cell for which we wait. What I'm not sure I understand is how are we supposed to call XTread_socket when we are stuck inside select all the time? > We certainly don't want to always skip the select call, but would it make sense > to use a very short timeout for select in that case? Or maybe someone has a > better idea. Making timeout shorter might be the solution, but I'd like to understand the problem better first. Thanks. ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-11-15 17:24 ` Eli Zaretskii @ 2021-11-15 19:26 ` Ken Brown 2021-11-16 17:44 ` Eli Zaretskii 0 siblings, 1 reply; 20+ messages in thread From: Ken Brown @ 2021-11-15 19:26 UTC (permalink / raw) To: Eli Zaretskii; +Cc: larsi, 50043 On 11/15/2021 12:24 PM, Eli Zaretskii wrote: >> Date: Mon, 15 Nov 2021 10:19:32 -0500 >> Cc: 50043@debbugs.gnu.org >> From: Ken Brown <kbrown@cornell.edu> >> >> x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type, >> Lisp_Object time_stamp, Lisp_Object frame) >> { >> [...] >> wait_reading_process_output (secs, nsecs, 0, false, >> reading_selection_reply, NULL, 0); >> >> I think wait_reading_process_output gets stuck for 2 seconds in a call to select >> (actually xg_select because I'm testing a gtk build). This is independent of >> the fact that x-selection-timeout is 2 seconds; it happens even if >> x-selection-timeout is 0. select returns after 2 seconds because the poll_timer >> fires. > > Sorry, I don't understand: select waits for up to 2 seconds because > that's what we ask it to do, and those 2 sec do come from > x-selection-timeout. If x-selection-timeout is zero, select is not > supposed to wait at all, so why does it? What am I missing? Setting x-selection-timeout to zero actually makes the timeout infinite: if (time_limit < 0 || nsecs < 0) wait = MINIMUM; else if (time_limit > 0 || nsecs > 0) { wait = TIMEOUT; now = current_timespec (); end_time = timespec_add (now, make_timespec (time_limit, nsecs)); } else wait = FOREVER; <<<<<<<<<<<<<<<<<<<<<< If x-selection-timeout is zero and you really want select to use a timeout of zero, you have to specify a negative value for nsecs. [This strikes me as very counterintuitive and a poor design decision.] x_get_foreign_selection should probably be changed to account for this, since the default value of x-selection-timeout is in fact zero, and clearly the intention was not to have an infinite wait in this case. There's a comment in x_get_foreign_selection that says "don't wait forever". >> On systems with SIGIO, select returns as soon as X events occur, because >> SIGIO is signaled. > > Which X event is that? something related to Emacs and selections, or > just a random event which simply happens at that time? I guess it's whatever X event is supposed to come in reply to the call XConvertSelection (display, selection_atom, type_atom, target_property, requestor_window, requestor_time); in x_get_foreign_selection. I don't anything about how I/O works under X, so I can't be more specific. > Anyway, AFAIU, the wait is supposed to end because XTread_socket reads > a SelectionNotify event, and that modifies the cell for which we > wait. What I'm not sure I understand is how are we supposed to call > XTread_socket when we are stuck inside select all the time? We're never stuck for more than 2 seconds [when there's no SIGIO] because poll_timer fires and either sends SIGALRM or makes timerfd read ready. Either way, select returns, and the next iteration of the main loop checks for input and checks for a cell change. >> We certainly don't want to always skip the select call, but would it make sense >> to use a very short timeout for select in that case? Or maybe someone has a >> better idea. > > Making timeout shorter might be the solution, but I'd like to > understand the problem better first. Ken ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-11-15 19:26 ` Ken Brown @ 2021-11-16 17:44 ` Eli Zaretskii 2021-11-16 23:06 ` Ken Brown 0 siblings, 1 reply; 20+ messages in thread From: Eli Zaretskii @ 2021-11-16 17:44 UTC (permalink / raw) To: Ken Brown; +Cc: larsi, 50043 > Date: Mon, 15 Nov 2021 14:26:08 -0500 > Cc: larsi@gnus.org, 50043@debbugs.gnu.org > From: Ken Brown <kbrown@cornell.edu> > > >> I think wait_reading_process_output gets stuck for 2 seconds in a call to select > >> (actually xg_select because I'm testing a gtk build). This is independent of > >> the fact that x-selection-timeout is 2 seconds; it happens even if > >> x-selection-timeout is 0. select returns after 2 seconds because the poll_timer > >> fires. > > > > Sorry, I don't understand: select waits for up to 2 seconds because > > that's what we ask it to do, and those 2 sec do come from > > x-selection-timeout. If x-selection-timeout is zero, select is not > > supposed to wait at all, so why does it? What am I missing? > > Setting x-selection-timeout to zero actually makes the timeout infinite: Ah, I thought you meant a literally zero timeout, not the "zero means infinite" one. > > Anyway, AFAIU, the wait is supposed to end because XTread_socket reads > > a SelectionNotify event, and that modifies the cell for which we > > wait. What I'm not sure I understand is how are we supposed to call > > XTread_socket when we are stuck inside select all the time? > > We're never stuck for more than 2 seconds [when there's no SIGIO] because > poll_timer fires and either sends SIGALRM or makes timerfd read ready. Either > way, select returns, and the next iteration of the main loop checks for input > and checks for a cell change. > > >> We certainly don't want to always skip the select call, but would it make sense > >> to use a very short timeout for select in that case? Or maybe someone has a > >> better idea. > > > > Making timeout shorter might be the solution, but I'd like to > > understand the problem better first. If the code is based on the premise that we check for selection when we exit select, then I think on systems without USABLE_SIGIO we should call wait_reading_process_output with a short timeout but in a loop, so that the summary wait is still 2 sec, but we exit the loop as soon as selection arrives because each call to wait_reading_process_output has a much shorter timeout, say, 25 msec. WDYT? ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-11-16 17:44 ` Eli Zaretskii @ 2021-11-16 23:06 ` Ken Brown 2021-11-17 7:41 ` Lars Ingebrigtsen 2021-11-17 13:14 ` Eli Zaretskii 0 siblings, 2 replies; 20+ messages in thread From: Ken Brown @ 2021-11-16 23:06 UTC (permalink / raw) To: Eli Zaretskii; +Cc: larsi, 50043 On 11/16/2021 12:45 PM, Eli Zaretskii wrote: >> From: Ken Brown <kbrown@cornell.edu> >>>> We certainly don't want to always skip the select call, but would it make sense >>>> to use a very short timeout for select in that case? Or maybe someone has a >>>> better idea. >>> >>> Making timeout shorter might be the solution, but I'd like to >>> understand the problem better first. > > If the code is based on the premise that we check for selection when > we exit select, then I think on systems without USABLE_SIGIO we should > call wait_reading_process_output with a short timeout but in a loop, > so that the summary wait is still 2 sec, but we exit the loop as soon > as selection arrives because each call to wait_reading_process_output > has a much shorter timeout, say, 25 msec. WDYT? Are you talking about having x_get_foreign_selection call wait_reading_process_output in a loop? That would fix this particular bug, but I was thinking of trying to solve a more general problem. Namely, whenever wait_reading_process_output is polling for input, avoid getting stuck in select, something like this: diff --git a/src/process.c b/src/process.c index f923aff1cb..808bf6f1ff 100644 --- a/src/process.c +++ b/src/process.c @@ -5588,6 +5588,15 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd, timeout = make_timespec (0, 0); #endif +#ifndef USABLE_SIGIO + /* If we're polling for input, don't get stuck in select for + more than 25 msec. */ + struct timespec short_timeout = make_timespec (0, 25000000); + if ((read_kbd || !NILP (wait_for_cell)) + && timespec_cmp (short_timeout, timeout) < 0) + timeout = short_timeout; +#endif + /* Non-macOS HAVE_GLIB builds call thread_select in xgselect.c. */ #if defined HAVE_GLIB && !defined HAVE_NS nfds = xg_select (max_desc + 1, Ken ^ permalink raw reply related [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-11-16 23:06 ` Ken Brown @ 2021-11-17 7:41 ` Lars Ingebrigtsen 2021-11-17 14:25 ` Ken Brown 2021-11-17 13:14 ` Eli Zaretskii 1 sibling, 1 reply; 20+ messages in thread From: Lars Ingebrigtsen @ 2021-11-17 7:41 UTC (permalink / raw) To: Ken Brown; +Cc: 50043 Ken Brown <kbrown@cornell.edu> writes: > Namely, whenever wait_reading_process_output is polling for input, > avoid getting stuck in select, something like this: [...] > +#ifndef USABLE_SIGIO > + /* If we're polling for input, don't get stuck in select for > + more than 25 msec. */ > + struct timespec short_timeout = make_timespec (0, 25000000); > + if ((read_kbd || !NILP (wait_for_cell)) > + && timespec_cmp (short_timeout, timeout) < 0) > + timeout = short_timeout; > +#endif Sounds like a good general solution to me (but I guess this will also affect `accept-process-output'? So it should probably be documented there). -- (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-11-17 7:41 ` Lars Ingebrigtsen @ 2021-11-17 14:25 ` Ken Brown 0 siblings, 0 replies; 20+ messages in thread From: Ken Brown @ 2021-11-17 14:25 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: 50043 On 11/17/2021 2:41 AM, Lars Ingebrigtsen wrote: > Ken Brown <kbrown@cornell.edu> writes: > >> Namely, whenever wait_reading_process_output is polling for input, >> avoid getting stuck in select, something like this: > > [...] > >> +#ifndef USABLE_SIGIO >> + /* If we're polling for input, don't get stuck in select for >> + more than 25 msec. */ >> + struct timespec short_timeout = make_timespec (0, 25000000); >> + if ((read_kbd || !NILP (wait_for_cell)) >> + && timespec_cmp (short_timeout, timeout) < 0) >> + timeout = short_timeout; >> +#endif > > Sounds like a good general solution to me (but I guess this will also > affect `accept-process-output'? So it should probably be documented > there). I don't think it affects accept-process-output. When the latter calls wait_reading_process_output, read_kbd == 0 and wait_for_cell == Qnil. Ken ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-11-16 23:06 ` Ken Brown 2021-11-17 7:41 ` Lars Ingebrigtsen @ 2021-11-17 13:14 ` Eli Zaretskii 2021-11-17 14:19 ` Ken Brown 1 sibling, 1 reply; 20+ messages in thread From: Eli Zaretskii @ 2021-11-17 13:14 UTC (permalink / raw) To: Ken Brown; +Cc: larsi, 50043 > Date: Tue, 16 Nov 2021 18:06:51 -0500 > Cc: larsi@gnus.org, 50043@debbugs.gnu.org > From: Ken Brown <kbrown@cornell.edu> > > Are you talking about having x_get_foreign_selection call > wait_reading_process_output in a loop? Yes. > That would fix this particular bug, but I was thinking of trying to > solve a more general problem. What is that more general problem, and when does it rear its ugly head? ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-11-17 13:14 ` Eli Zaretskii @ 2021-11-17 14:19 ` Ken Brown 2021-11-17 14:34 ` Eli Zaretskii 0 siblings, 1 reply; 20+ messages in thread From: Ken Brown @ 2021-11-17 14:19 UTC (permalink / raw) To: Eli Zaretskii; +Cc: larsi, 50043 On 11/17/2021 8:14 AM, Eli Zaretskii wrote: >> Date: Tue, 16 Nov 2021 18:06:51 -0500 >> Cc: larsi@gnus.org, 50043@debbugs.gnu.org >> From: Ken Brown <kbrown@cornell.edu> >> >> Are you talking about having x_get_foreign_selection call >> wait_reading_process_output in a loop? > > Yes. > >> That would fix this particular bug, but I was thinking of trying to >> solve a more general problem. > > What is that more general problem, and when does it rear its ugly > head? The problem is that whenever wait_reading_process_output needs to repeatedly check for input (i.e., read_kbd || !NILP (wait_for_cell) == true), it can get stuck in select for up to 2 seconds on systems without USABLE_SIGIO. (2 arises here because it's the default value of polling-period.) I don't know offhand when it rears its ugly head aside from the X selection case we're discussing. We would only know about it if someone notices an unexpected delay, finds a recipe for reproducing it, and reports it as a bug, as happened here with bug#29170, which is what led to the present bug report. And look how long it took before the cause of that delay was discovered. So I think it's better to fix the general (potential) problem, not just the X selection case. Ken ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-11-17 14:19 ` Ken Brown @ 2021-11-17 14:34 ` Eli Zaretskii 2021-11-17 14:59 ` Ken Brown 0 siblings, 1 reply; 20+ messages in thread From: Eli Zaretskii @ 2021-11-17 14:34 UTC (permalink / raw) To: Ken Brown; +Cc: larsi, 50043 > Date: Wed, 17 Nov 2021 09:19:27 -0500 > Cc: larsi@gnus.org, 50043@debbugs.gnu.org > From: Ken Brown <kbrown@cornell.edu> > > > What is that more general problem, and when does it rear its ugly > > head? > > The problem is that whenever wait_reading_process_output needs to repeatedly > check for input (i.e., read_kbd || !NILP (wait_for_cell) == true), it can get > stuck in select for up to 2 seconds on systems without USABLE_SIGIO. (2 arises > here because it's the default value of polling-period.) But that can only happen if select is called with a long enough timeout, right? Anyway, if the problem is that on these systems select doesn't return when there are input events waiting, I guess it's okay to do the change there. But maybe it will be better to do it the same way we decrease the timeout when a timer is expected to expire before the timeout: we decrease the timeout, but still remember its value, and don't return from waiting before the timeout unless there really was some input. This would avoid affecting unrelated features such as accept-process-output. ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-11-17 14:34 ` Eli Zaretskii @ 2021-11-17 14:59 ` Ken Brown 2021-11-17 16:56 ` Eli Zaretskii 0 siblings, 1 reply; 20+ messages in thread From: Ken Brown @ 2021-11-17 14:59 UTC (permalink / raw) To: Eli Zaretskii; +Cc: larsi, 50043 On 11/17/2021 9:34 AM, Eli Zaretskii wrote: >> Date: Wed, 17 Nov 2021 09:19:27 -0500 >> Cc: larsi@gnus.org, 50043@debbugs.gnu.org >> From: Ken Brown <kbrown@cornell.edu> >> >>> What is that more general problem, and when does it rear its ugly >>> head? >> >> The problem is that whenever wait_reading_process_output needs to repeatedly >> check for input (i.e., read_kbd || !NILP (wait_for_cell) == true), it can get >> stuck in select for up to 2 seconds on systems without USABLE_SIGIO. (2 arises >> here because it's the default value of polling-period.) > > But that can only happen if select is called with a long enough > timeout, right? Right. > Anyway, if the problem is that on these systems select doesn't return > when there are input events waiting, I guess it's okay to do the > change there. Thanks. > But maybe it will be better to do it the same way we > decrease the timeout when a timer is expected to expire before the > timeout: we decrease the timeout, but still remember its value, and > don't return from waiting before the timeout unless there really was > some input. This would avoid affecting unrelated features such as > accept-process-output. I think that's already taken care of. The timeout is recalculated on each iteration of the main while loop: /* Compute time from now till when time limit is up. */ /* Exit if already run out. */ if (wait == TIMEOUT) { if (!timespec_valid_p (now)) now = current_timespec (); if (timespec_cmp (end_time, now) <= 0) break; timeout = timespec_sub (end_time, now); } else timeout = make_timespec (wait < TIMEOUT ? 0 : 100000, 0); My reduction of timeout to 25 msec occurs after this. Ken ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-11-17 14:59 ` Ken Brown @ 2021-11-17 16:56 ` Eli Zaretskii 2021-11-17 17:25 ` Ken Brown 0 siblings, 1 reply; 20+ messages in thread From: Eli Zaretskii @ 2021-11-17 16:56 UTC (permalink / raw) To: Ken Brown; +Cc: larsi, 50043 > Date: Wed, 17 Nov 2021 09:59:35 -0500 > Cc: larsi@gnus.org, 50043@debbugs.gnu.org > From: Ken Brown <kbrown@cornell.edu> > > > But maybe it will be better to do it the same way we > > decrease the timeout when a timer is expected to expire before the > > timeout: we decrease the timeout, but still remember its value, and > > don't return from waiting before the timeout unless there really was > > some input. This would avoid affecting unrelated features such as > > accept-process-output. > > I think that's already taken care of. The timeout is recalculated on each > iteration of the main while loop: > > /* Compute time from now till when time limit is up. */ > /* Exit if already run out. */ > if (wait == TIMEOUT) > { > if (!timespec_valid_p (now)) > now = current_timespec (); > if (timespec_cmp (end_time, now) <= 0) > break; > timeout = timespec_sub (end_time, now); > } > else > timeout = make_timespec (wait < TIMEOUT ? 0 : 100000, 0); > > My reduction of timeout to 25 msec occurs after this. So the result will be that on systems without USABLE_SIGIO we loop more times with shorter timeouts for select? If so, it SGTM. ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-11-17 16:56 ` Eli Zaretskii @ 2021-11-17 17:25 ` Ken Brown 2021-11-17 17:37 ` Eli Zaretskii 0 siblings, 1 reply; 20+ messages in thread From: Ken Brown @ 2021-11-17 17:25 UTC (permalink / raw) To: Eli Zaretskii; +Cc: larsi, 50043 [-- Attachment #1: Type: text/plain, Size: 1618 bytes --] On 11/17/2021 11:57 AM, Eli Zaretskii wrote: >> Date: Wed, 17 Nov 2021 09:59:35 -0500 >> Cc: larsi@gnus.org, 50043@debbugs.gnu.org >> From: Ken Brown <kbrown@cornell.edu> >> >>> But maybe it will be better to do it the same way we >>> decrease the timeout when a timer is expected to expire before the >>> timeout: we decrease the timeout, but still remember its value, and >>> don't return from waiting before the timeout unless there really was >>> some input. This would avoid affecting unrelated features such as >>> accept-process-output. >> >> I think that's already taken care of. The timeout is recalculated on each >> iteration of the main while loop: >> >> /* Compute time from now till when time limit is up. */ >> /* Exit if already run out. */ >> if (wait == TIMEOUT) >> { >> if (!timespec_valid_p (now)) >> now = current_timespec (); >> if (timespec_cmp (end_time, now) <= 0) >> break; >> timeout = timespec_sub (end_time, now); >> } >> else >> timeout = make_timespec (wait < TIMEOUT ? 0 : 100000, 0); >> >> My reduction of timeout to 25 msec occurs after this. > > So the result will be that on systems without USABLE_SIGIO we loop > more times with shorter timeouts for select? Yes. > If so, it SGTM. Thanks, I've pushed that change. There's still one more issue related to this bug, which I mentioned earlier: If x_selection_timeout is zero, x_get_foreign_selection will call wait_reading_process output with an infinite timeout rather than a zero timeout, which I'm sure is not what was intended. The attached patch fixes that. Ken [-- Attachment #2: 0001-Avoid-an-accidental-use-of-an-infinite-timeout.patch --] [-- Type: text/plain, Size: 1151 bytes --] From 5a0afdf1cb2ef276a2b6e4cf26abf18405127db2 Mon Sep 17 00:00:00 2001 From: Ken Brown <kbrown@cornell.edu> Date: Wed, 17 Nov 2021 12:20:24 -0500 Subject: [PATCH] Avoid an accidental use of an infinite timeout * src/xselect.c (x_get_foreign_selection): If x-selection-timeout is zero, call wait_reading_process_output with a zero timeout rather than an infinite timeout. (Bug#50043) --- src/xselect.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/xselect.c b/src/xselect.c index cd6d86bdf4..53b41f1ea2 100644 --- a/src/xselect.c +++ b/src/xselect.c @@ -1196,6 +1196,10 @@ x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type, intmax_t timeout = max (0, x_selection_timeout); intmax_t secs = timeout / 1000; int nsecs = (timeout % 1000) * 1000000; + /* If x_selection_timeout == 0, avoid the "zero means infinite" + behavior of wait_reading_process_output. */ + if (secs == 0 && nsecs == 0) + nsecs = -1; TRACE1 (" Start waiting %"PRIdMAX" secs for SelectionNotify", secs); wait_reading_process_output (secs, nsecs, 0, false, reading_selection_reply, NULL, 0); -- 2.33.0 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-11-17 17:25 ` Ken Brown @ 2021-11-17 17:37 ` Eli Zaretskii 2021-11-17 17:45 ` Ken Brown 0 siblings, 1 reply; 20+ messages in thread From: Eli Zaretskii @ 2021-11-17 17:37 UTC (permalink / raw) To: Ken Brown; +Cc: larsi, 50043 > Date: Wed, 17 Nov 2021 12:25:38 -0500 > Cc: larsi@gnus.org, 50043@debbugs.gnu.org > From: Ken Brown <kbrown@cornell.edu> > > There's still one more issue related to this bug, which I mentioned earlier: If > x_selection_timeout is zero, x_get_foreign_selection will call > wait_reading_process output with an infinite timeout rather than a zero timeout, > which I'm sure is not what was intended. The attached patch fixes that. Bu that's clearly what was intended. The doc string of x-selection-timeout says: A value of 0 means wait as long as necessary. And with the fix in wait_reading_process_output the original problem is gone, since we will now loop with short select timeout, waiting for the selection event. Which is the intent here, AFAIU. ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly 2021-11-17 17:37 ` Eli Zaretskii @ 2021-11-17 17:45 ` Ken Brown 0 siblings, 0 replies; 20+ messages in thread From: Ken Brown @ 2021-11-17 17:45 UTC (permalink / raw) To: Eli Zaretskii; +Cc: larsi, 50043-done On 11/17/2021 12:37 PM, Eli Zaretskii wrote: >> Date: Wed, 17 Nov 2021 12:25:38 -0500 >> Cc: larsi@gnus.org, 50043@debbugs.gnu.org >> From: Ken Brown <kbrown@cornell.edu> >> >> There's still one more issue related to this bug, which I mentioned earlier: If >> x_selection_timeout is zero, x_get_foreign_selection will call >> wait_reading_process output with an infinite timeout rather than a zero timeout, >> which I'm sure is not what was intended. The attached patch fixes that. > > Bu that's clearly what was intended. The doc string of > x-selection-timeout says: > > A value of 0 means wait as long as necessary. Oh, I somehow missed that, sorry. In that case I'm closing the bug. Ken ^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2021-11-17 17:45 UTC | newest] Thread overview: 20+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-08-13 11:56 bug#50043: 28.0.50; USABLE_SIGOI undef code paths do not work correctly Lars Ingebrigtsen 2021-08-13 13:16 ` Eli Zaretskii 2021-08-13 14:31 ` Lars Ingebrigtsen 2021-08-13 15:51 ` Eli Zaretskii 2021-08-14 11:52 ` Lars Ingebrigtsen 2021-11-15 15:19 ` Ken Brown 2021-11-15 17:24 ` Eli Zaretskii 2021-11-15 19:26 ` Ken Brown 2021-11-16 17:44 ` Eli Zaretskii 2021-11-16 23:06 ` Ken Brown 2021-11-17 7:41 ` Lars Ingebrigtsen 2021-11-17 14:25 ` Ken Brown 2021-11-17 13:14 ` Eli Zaretskii 2021-11-17 14:19 ` Ken Brown 2021-11-17 14:34 ` Eli Zaretskii 2021-11-17 14:59 ` Ken Brown 2021-11-17 16:56 ` Eli Zaretskii 2021-11-17 17:25 ` Ken Brown 2021-11-17 17:37 ` Eli Zaretskii 2021-11-17 17:45 ` Ken Brown
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).