unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* SIGIO and the NS port
@ 2017-03-10 12:41 Alan Third
  2017-03-10 13:35 ` Eli Zaretskii
  2017-03-13 16:38 ` Alan Third
  0 siblings, 2 replies; 6+ messages in thread
From: Alan Third @ 2017-03-10 12:41 UTC (permalink / raw)
  To: Emacs-Devel devel

I think I’ve just found a simple solution to a whole class of bugs in
the NS port.

We’ve had a number of bug reports where Emacs crashes while doing UI
related things, for example minimizing the frame, and generally we’ve
found the best way to deal with these is by wrapping the relevant bit
in block_input/unblock_input.

Today I discovered that config.h on my machine has two defines related
to SIGIO:

#define INTERRUPT_INPUT 1
#define USABLE_SIGIO 1

The NS port doesn’t use SIGIO to signal for input (I think it polls
using ns_select), and if I comment these two defines out I can remove
block_input/unblock_input from various places with no ill effects.

Does anyone know of any reason not to remove these two defines?

How would I go about doing that? I assume config.h is generated by
./configure, but I don’t know anything about that side of things.

Thanks!
-- 
Alan Third



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: SIGIO and the NS port
  2017-03-10 12:41 SIGIO and the NS port Alan Third
@ 2017-03-10 13:35 ` Eli Zaretskii
  2017-03-13 16:38 ` Alan Third
  1 sibling, 0 replies; 6+ messages in thread
From: Eli Zaretskii @ 2017-03-10 13:35 UTC (permalink / raw)
  To: Alan Third; +Cc: emacs-devel

> Date: Fri, 10 Mar 2017 12:41:17 +0000
> From: Alan Third <alan@idiocy.org>
> 
> Does anyone know of any reason not to remove these two defines?
> 
> How would I go about doing that? I assume config.h is generated by
> ./configure, but I don’t know anything about that side of things.

Yes, it's generated by configure, but you can override what it does in
conf_post.h, with suitable preprocessor conditionals.



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: SIGIO and the NS port
  2017-03-10 12:41 SIGIO and the NS port Alan Third
  2017-03-10 13:35 ` Eli Zaretskii
@ 2017-03-13 16:38 ` Alan Third
  2017-05-20 23:24   ` Alan Third
  1 sibling, 1 reply; 6+ messages in thread
From: Alan Third @ 2017-03-13 16:38 UTC (permalink / raw)
  To: Emacs-Devel devel

On Fri, Mar 10, 2017 at 12:41:17PM +0000, Alan Third wrote:
> Today I discovered that config.h on my machine has two defines related
> to SIGIO:
> 
> #define INTERRUPT_INPUT 1
> #define USABLE_SIGIO 1
> 
> The NS port doesn’t use SIGIO to signal for input (I think it polls
> using ns_select), and if I comment these two defines out I can remove
> block_input/unblock_input from various places with no ill effects.

It looks like this isn’t right. The NS port works without SIGIO most
of the time, but if wait_reading_process_output is called with
read_kbd=0 then it goes into an infinite loop. (At least, I think
that’s what’s happening.)

I was hoping this would work as it would mean I could remove
block_input/unblock_input from ns_select, which appears to be the main
problem with concurrency.
-- 
Alan Third



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: SIGIO and the NS port
  2017-03-13 16:38 ` Alan Third
@ 2017-05-20 23:24   ` Alan Third
  2017-05-21  7:46     ` Paul Eggert
  0 siblings, 1 reply; 6+ messages in thread
From: Alan Third @ 2017-05-20 23:24 UTC (permalink / raw)
  To: Emacs-Devel devel

[-- Attachment #1: Type: text/plain, Size: 1074 bytes --]

On Mon, Mar 13, 2017 at 04:38:17PM +0000, Alan Third wrote:
> On Fri, Mar 10, 2017 at 12:41:17PM +0000, Alan Third wrote:
> > The NS port doesn’t use SIGIO to signal for input (I think it polls
> > using ns_select), and if I comment these two defines out I can remove
> > block_input/unblock_input from various places with no ill effects.
> 
> It looks like this isn’t right. The NS port works without SIGIO most
> of the time, but if wait_reading_process_output is called with
> read_kbd=0 then it goes into an infinite loop. (At least, I think
> that’s what’s happening.)

So I’ve been using the attached patch for a few weeks now with no
issues.

I’ve stopped the signal handler from responding to SIGIO, and the two
places where the NS GUI used to raise SIGIO have been replaced with
direct calls to the SIGIO handler code.

I’m not sure if this is a sensible approach. It fixes at least one
crash, and we could remove some HAVE_NS‐only code, so I think it’s
desirable. I’m just not sure about my implementation. Any thoughts,
anyone?
-- 
Alan Third

[-- Attachment #2: 0001-Don-t-use-SIGIO-in-NS.patch --]
[-- Type: text/plain, Size: 2831 bytes --]

From bff3dbfe43a24ee924edd777a7a876b627f94f11 Mon Sep 17 00:00:00 2001
From: Alan Third <alan@idiocy.org>
Date: Sat, 29 Apr 2017 23:35:16 +0100
Subject: [PATCH] Don't use SIGIO in NS

* src/keyboard.c (handle_user_signal) [HAVE_NS]: Don't handle SIGIO.
* src/keyboard.h (handle_input_available_signal) [HAVE_NS]: Make
available to external code.
* src/nsterm.m (hold_event, ns_Select): Call handle_input_available_signal
directly.
* src/sysdep.c (emacs_sigaction_init) [HAVE_NS]: Ignore SIGIO.
---
 src/keyboard.c |  3 ++-
 src/keyboard.h | 11 +++++++++++
 src/nsterm.m   |  4 ++--
 src/sysdep.c   |  2 +-
 4 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/keyboard.c b/src/keyboard.c
index c9fa2a9f5e..d22f7b08c6 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -7264,7 +7264,8 @@ handle_user_signal (int sig)
           }
 
 	p->npending++;
-#ifdef USABLE_SIGIO
+#if defined (USABLE_SIGIO) && !defined (HAVE_NS)
+        /* Dont use the interrupt handler in NS. */
 	if (interrupt_input)
 	  handle_input_available_signal (sig);
 	else
diff --git a/src/keyboard.h b/src/keyboard.h
index 2219c01135..29279bef86 100644
--- a/src/keyboard.h
+++ b/src/keyboard.h
@@ -495,6 +495,17 @@ extern void mark_kboards (void);
 extern const char *const lispy_function_keys[];
 #endif
 
+#ifdef HAVE_NS
+/* The NS port only uses SIGIO internally, and even then only in two
+   places in the code, but it causes crashes if certain code is not
+   properly wrapped in block_input/unblock_input.
+
+   Since it's only used internally, we should be able to disable it,
+   and call the SIGIO handler directly.
+ */
+extern void handle_input_available_signal (int sig);
+#endif
+
 extern char const DEV_TTY[];
 
 INLINE_HEADER_END
diff --git a/src/nsterm.m b/src/nsterm.m
index c22c5a70ba..00b7a89472 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -472,7 +472,7 @@ - (NSColor *)colorUsingDefaultColorSpace
 
   hold_event_q.q[hold_event_q.nr++] = *event;
   /* Make sure ns_read_socket is called, i.e. we have input.  */
-  raise (SIGIO);
+  handle_input_available_signal (SIGIO);
   send_appdefined = YES;
 }
 
@@ -4289,7 +4289,7 @@ in certain situations (rapid incoming events).
   if (hold_event_q.nr > 0)
     {
       /* We already have events pending. */
-      raise (SIGIO);
+      handle_input_available_signal (SIGIO);
       errno = EINTR;
       return -1;
     }
diff --git a/src/sysdep.c b/src/sysdep.c
index 91b2a5cb94..70fdf92964 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -1606,7 +1606,7 @@ emacs_sigaction_init (struct sigaction *action, signal_handler_t handler)
     {
       sigaddset (&action->sa_mask, SIGINT);
       sigaddset (&action->sa_mask, SIGQUIT);
-#ifdef USABLE_SIGIO
+#if defined (USABLE_SIGIO) && !defined (HAVE_NS)
       sigaddset (&action->sa_mask, SIGIO);
 #endif
     }
-- 
2.12.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: SIGIO and the NS port
  2017-05-20 23:24   ` Alan Third
@ 2017-05-21  7:46     ` Paul Eggert
  2017-05-21 12:11       ` Alan Third
  0 siblings, 1 reply; 6+ messages in thread
From: Paul Eggert @ 2017-05-21  7:46 UTC (permalink / raw)
  To: Alan Third, Emacs-Devel devel

Alan Third wrote:
> I’ve stopped the signal handler from responding to SIGIO,

I'm not following, as sigaction (SIGIO, ...) is still being called, so the 
signal handler deliver_input_available_signal is still responding to SIGIO, and 
is setting pending_signals to true.

The changes you made affect SIGUSR1 and SIGUSR2 handling, since they patch 
handle_user_signal: they cause the SIGUSR1 and SIGUSR2 handler to not process 
SIGIO events. Also, they prevent SIGIO from being masked out during non-SIGIO 
signal handlers. Is that what you intended? I'm not getting the connection 
between these non-SIGIO handlers and interrupt_input.

> and the two
> places where the NS GUI used to raise SIGIO have been replaced with
> direct calls to the SIGIO handler code.

That sounds like a reasonable thing to do in any event. I don't see why the code 
needs to do a raise (SIGIO) when it can do a handle_input_available_signal (SIGIO);



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: SIGIO and the NS port
  2017-05-21  7:46     ` Paul Eggert
@ 2017-05-21 12:11       ` Alan Third
  0 siblings, 0 replies; 6+ messages in thread
From: Alan Third @ 2017-05-21 12:11 UTC (permalink / raw)
  To: Paul Eggert; +Cc: Emacs-Devel devel

On Sun, May 21, 2017 at 12:46:53AM -0700, Paul Eggert wrote:
> Alan Third wrote:
> > I’ve stopped the signal handler from responding to SIGIO,
> 
> I'm not following, as sigaction (SIGIO, ...) is still being called, so the
> signal handler deliver_input_available_signal is still responding to SIGIO,
> and is setting pending_signals to true.
> 
> The changes you made affect SIGUSR1 and SIGUSR2 handling, since they patch
> handle_user_signal: they cause the SIGUSR1 and SIGUSR2 handler to not
> process SIGIO events. Also, they prevent SIGIO from being masked out during
> non-SIGIO signal handlers. Is that what you intended? I'm not getting the
> connection between these non-SIGIO handlers and interrupt_input.

I’ve probably misunderstood what the code was doing. Would it be best
to just leave the signal handlers as‐is, but replace the calls to
raise(SIGIO) with direct calls as below?

> > and the two
> > places where the NS GUI used to raise SIGIO have been replaced with
> > direct calls to the SIGIO handler code.
> 
> That sounds like a reasonable thing to do in any event. I don't see why the
> code needs to do a raise (SIGIO) when it can do a
> handle_input_available_signal (SIGIO);

Thanks!
-- 
Alan Third



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-05-21 12:11 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-03-10 12:41 SIGIO and the NS port Alan Third
2017-03-10 13:35 ` Eli Zaretskii
2017-03-13 16:38 ` Alan Third
2017-05-20 23:24   ` Alan Third
2017-05-21  7:46     ` Paul Eggert
2017-05-21 12:11       ` Alan Third

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).