unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* usr1-signal, usr2-signal, etc.
@ 2006-12-03  1:39 Kim F. Storm
  2006-12-04  5:15 ` Richard Stallman
  0 siblings, 1 reply; 27+ messages in thread
From: Kim F. Storm @ 2006-12-03  1:39 UTC (permalink / raw)



IMHO, the new signal events in emacs 22 are not done the right way.

To me, it would be cleaner to define them as [signal usr1], 
[signal usr2], etc.

Ok, there is currently no "etc" in emacs 22, but if we later
want to be able to catch more signals, this would be a cleaner
way to extend the interface.

We could even allow numeric bindings, like [signal 10] for SIGUSR1,
and also variants like [signal SIGUSR1].

This is the last chance to change the interface, if people agree that
this is cleaner.

-- 
Kim F. Storm <storm@cua.dk> http://www.cua.dk

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-03  1:39 usr1-signal, usr2-signal, etc Kim F. Storm
@ 2006-12-04  5:15 ` Richard Stallman
  2006-12-04  9:05   ` Kim F. Storm
  0 siblings, 1 reply; 27+ messages in thread
From: Richard Stallman @ 2006-12-04  5:15 UTC (permalink / raw)
  Cc: emacs-devel

    IMHO, the new signal events in emacs 22 are not done the right way.

    To me, it would be cleaner to define them as [signal usr1], 
    [signal usr2], etc.

Do you mean that it would generate a sequence of two events,
`signal' and `usr1', so that `signal' would act as a prefix char?
I agree.  Please change it.

    Ok, there is currently no "etc" in emacs 22, but if we later
    want to be able to catch more signals, this would be a cleaner
    way to extend the interface.

I don't understand what that refers to.

    We could even allow numeric bindings, like [signal 10] for SIGUSR1,
    and also variants like [signal SIGUSR1].

I don't see how that would work.  The signal has to generate a certain
sequence of events.  If it generates `signal' and `usr1',
the second event is not `SIGUSR1' and it is not 10 (C-h).

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-04  5:15 ` Richard Stallman
@ 2006-12-04  9:05   ` Kim F. Storm
  2006-12-04 13:08     ` Kim F. Storm
  0 siblings, 1 reply; 27+ messages in thread
From: Kim F. Storm @ 2006-12-04  9:05 UTC (permalink / raw)
  Cc: emacs-devel

Richard Stallman <rms@gnu.org> writes:

>     IMHO, the new signal events in emacs 22 are not done the right way.
>
>     To me, it would be cleaner to define them as [signal usr1], 
>     [signal usr2], etc.
>
> Do you mean that it would generate a sequence of two events,
> `signal' and `usr1', so that `signal' would act as a prefix char?

Exactly.

> I agree.  Please change it.

I'll do that.

>     Ok, there is currently no "etc" in emacs 22, but if we later
>     want to be able to catch more signals, this would be a cleaner
>     way to extend the interface.
>
> I don't understand what that refers to.

I was referring to the "etc." in the list in the previous paragraph.
Currently we only have usr1 and usr2 signals, but if we add more (the
"etc") later, this would be a cleaner interface for such extensions.

>
>     We could even allow numeric bindings, like [signal 10] for SIGUSR1,
>     and also variants like [signal SIGUSR1].
>
> I don't see how that would work.  The signal has to generate a certain
> sequence of events.  If it generates `signal' and `usr1',
> the second event is not `SIGUSR1' and it is not 10 (C-h).

You are right ... it looked like a good idea when I wrote it, but I
must have been sleepy.  :-)

-- 
Kim F. Storm <storm@cua.dk> http://www.cua.dk

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-04  9:05   ` Kim F. Storm
@ 2006-12-04 13:08     ` Kim F. Storm
  2006-12-05  1:45       ` Richard Stallman
                         ` (2 more replies)
  0 siblings, 3 replies; 27+ messages in thread
From: Kim F. Storm @ 2006-12-04 13:08 UTC (permalink / raw)
  Cc: emacs-devel


>>     To me, it would be cleaner to define them as [signal usr1], 
>>     [signal usr2], etc.

>> I agree.  Please change it.
>
> I'll do that.

Done.

> Currently we only have usr1 and usr2 signals, but if we add more (the
> "etc") later, this would be a cleaner interface for such extensions.

For example, we could handle SIGTERM, SIGHUP, and SIGQUIT like this
to allow a user to handle those signals in some other way:

The only real difference with the existing code is that 
a) this will run the kill-emacs-hook
b) you don't get a "Fatal Error (sig=nn) message

I don't see either as a problem!


*** bindings.el	04 Dec 2006 11:18:25 +0100	1.174
--- bindings.el	04 Dec 2006 13:59:24 +0100	
***************
*** 1066,1071 ****
--- 1066,1074 ----
  
  ;; Signal handlers
  (define-key global-map [signal] (make-sparse-keymap))
+ (define-key global-map [signal term] 'kill-emacs)
+ (define-key global-map [signal quit] 'kill-emacs)
+ (define-key global-map [signal hup] 'kill-emacs)
  (define-key global-map [signal t] 'ignore)
  
  ;; Don't look for autoload cookies in this file.


*** emacs.c	04 Dec 2006 10:56:50 +0100	1.393
--- emacs.c	04 Dec 2006 13:57:45 +0100	
***************
*** 1192,1198 ****
  	 That makes nohup work.  */
        if (! noninteractive
  	  || signal (SIGHUP, SIG_IGN) != SIG_IGN)
! 	signal (SIGHUP, fatal_error_signal);
        sigunblock (sigmask (SIGHUP));
      }
  
--- 1192,1198 ----
  	 That makes nohup work.  */
        if (! noninteractive
  	  || signal (SIGHUP, SIG_IGN) != SIG_IGN)
! 	signal (SIGHUP, handle_user_signal);
        sigunblock (sigmask (SIGHUP));
      }
  
***************
*** 1207,1213 ****
        /* Don't catch these signals in batch mode if dumping.
  	 On some machines, this sets static data that would make
  	 signal fail to work right when the dumped Emacs is run.  */
!       signal (SIGQUIT, fatal_error_signal);
        signal (SIGILL, fatal_error_signal);
        signal (SIGTRAP, fatal_error_signal);
  #ifdef SIGUSR1
--- 1207,1213 ----
        /* Don't catch these signals in batch mode if dumping.
  	 On some machines, this sets static data that would make
  	 signal fail to work right when the dumped Emacs is run.  */
!       signal (SIGQUIT, handle_user_signal);
        signal (SIGILL, fatal_error_signal);
        signal (SIGTRAP, fatal_error_signal);
  #ifdef SIGUSR1
***************
*** 1252,1258 ****
  #ifdef SIGSYS
        signal (SIGSYS, fatal_error_signal);
  #endif
!       signal (SIGTERM, fatal_error_signal);
  #ifdef SIGXCPU
        signal (SIGXCPU, fatal_error_signal);
  #endif
--- 1252,1258 ----
  #ifdef SIGSYS
        signal (SIGSYS, fatal_error_signal);
  #endif
!       signal (SIGTERM, handle_user_signal);
  #ifdef SIGXCPU
        signal (SIGXCPU, fatal_error_signal);
  #endif

*** keyboard.c	04 Dec 2006 13:35:04 +0100	1.882
--- keyboard.c	04 Dec 2006 13:58:08 +0100	
***************
*** 5952,5957 ****
--- 5952,5965 ----
  	{
  	case 0:
  	  return Qsignal;
+ 	case SIGQUIT:
+ 	  return Qquit;
+ 	case SIGHUP:
+ 	  return intern ("hup");
+ #ifdef SIGTERM
+ 	case SIGTERM:
+ 	  return intern ("term");
+ #endif
  #ifdef SIGUSR1
  	case SIGUSR1:
  	  return intern ("usr1");

-- 
Kim F. Storm <storm@cua.dk> http://www.cua.dk

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-04 13:08     ` Kim F. Storm
@ 2006-12-05  1:45       ` Richard Stallman
  2006-12-05  3:40       ` YAMAMOTO Mitsuharu
  2006-12-06  9:44       ` Johan Bockgård
  2 siblings, 0 replies; 27+ messages in thread
From: Richard Stallman @ 2006-12-05  1:45 UTC (permalink / raw)
  Cc: emacs-devel

I have nothing against this change in handling other signals, except
that this is not the right sort of thing to do at this stage of
pretest.

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-04 13:08     ` Kim F. Storm
  2006-12-05  1:45       ` Richard Stallman
@ 2006-12-05  3:40       ` YAMAMOTO Mitsuharu
  2006-12-05 22:26         ` David Kastrup
  2006-12-06  0:46         ` Richard Stallman
  2006-12-06  9:44       ` Johan Bockgård
  2 siblings, 2 replies; 27+ messages in thread
From: YAMAMOTO Mitsuharu @ 2006-12-05  3:40 UTC (permalink / raw)
  Cc: rms, emacs-devel

>>>>> On Mon, 04 Dec 2006 14:08:09 +0100, storm@cua.dk (Kim F. Storm) said:

>> Currently we only have usr1 and usr2 signals, but if we add more
>> (the "etc") later, this would be a cleaner interface for such
>> extensions.

> For example, we could handle SIGTERM, SIGHUP, and SIGQUIT like this
> to allow a user to handle those signals in some other way:

I'm concerned about the case that kbd_buffer_store_event_hold is
called from the signal-handler context while it is also executed in
the normal context.  This has already existed for SIGUSR1 and SIGUSR2
before your change, though.

				     YAMAMOTO Mitsuharu
				mituharu@math.s.chiba-u.ac.jp

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-05  3:40       ` YAMAMOTO Mitsuharu
@ 2006-12-05 22:26         ` David Kastrup
  2006-12-05 22:51           ` Kim F. Storm
  2006-12-06  0:46         ` Richard Stallman
  1 sibling, 1 reply; 27+ messages in thread
From: David Kastrup @ 2006-12-05 22:26 UTC (permalink / raw)
  Cc: emacs-devel, rms, Kim F. Storm

YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> writes:

>>>>>> On Mon, 04 Dec 2006 14:08:09 +0100, storm@cua.dk (Kim F. Storm) said:
>
>>> Currently we only have usr1 and usr2 signals, but if we add more
>>> (the "etc") later, this would be a cleaner interface for such
>>> extensions.
>
>> For example, we could handle SIGTERM, SIGHUP, and SIGQUIT like this
>> to allow a user to handle those signals in some other way:
>
> I'm concerned about the case that kbd_buffer_store_event_hold is
> called from the signal-handler context while it is also executed in
> the normal context.  This has already existed for SIGUSR1 and SIGUSR2
> before your change, though.

SIGUSR1 and SIGUSR2 are, IIRC, new in Emacs 22.  So we have no "nobody
complained about that before" reason for allowing problems in that
manner.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-05 22:26         ` David Kastrup
@ 2006-12-05 22:51           ` Kim F. Storm
  2006-12-08 10:28             ` YAMAMOTO Mitsuharu
  0 siblings, 1 reply; 27+ messages in thread
From: Kim F. Storm @ 2006-12-05 22:51 UTC (permalink / raw)
  Cc: rms, YAMAMOTO Mitsuharu, emacs-devel

David Kastrup <dak@gnu.org> writes:

> YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> writes:
>
>>>>>>> On Mon, 04 Dec 2006 14:08:09 +0100, storm@cua.dk (Kim F. Storm) said:
>>
>>>> Currently we only have usr1 and usr2 signals, but if we add more
>>>> (the "etc") later, this would be a cleaner interface for such
>>>> extensions.
>>
>>> For example, we could handle SIGTERM, SIGHUP, and SIGQUIT like this
>>> to allow a user to handle those signals in some other way:
>>
>> I'm concerned about the case that kbd_buffer_store_event_hold is
>> called from the signal-handler context while it is also executed in
>> the normal context.  This has already existed for SIGUSR1 and SIGUSR2
>> before your change, though.
>
> SIGUSR1 and SIGUSR2 are, IIRC, new in Emacs 22.  So we have no "nobody
> complained about that before" reason for allowing problems in that
> manner.

They have been there (in some form) since 1997.
Whether anybody actually used them is another thing.

AFAICS, kbd_buffer_store_event[_hold] is usually called inside
BLOCK_INPUT, but there may be a few places where this is not the case,
notably in keyboard.c (and in the signal handler).  

Would someone pls. check [and fix] this??  One way could be to abort in
kbd_buffer_store_event_hold if called without input blocked.

-- 
Kim F. Storm <storm@cua.dk> http://www.cua.dk

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-05  3:40       ` YAMAMOTO Mitsuharu
  2006-12-05 22:26         ` David Kastrup
@ 2006-12-06  0:46         ` Richard Stallman
  1 sibling, 0 replies; 27+ messages in thread
From: Richard Stallman @ 2006-12-06  0:46 UTC (permalink / raw)
  Cc: emacs-devel, storm

    I'm concerned about the case that kbd_buffer_store_event_hold is
    called from the signal-handler context while it is also executed in
    the normal context.  This has already existed for SIGUSR1 and SIGUSR2
    before your change, though.

Since people hardly ever use SIGUSR1 and SIGUSR2,
a bug that happens only a small fraction of the time when they
are called might never have happened.  But if it happens for
signals that are more common, it will start to occur.
So it is good that you noticed this.

We should fix it now.

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-04 13:08     ` Kim F. Storm
  2006-12-05  1:45       ` Richard Stallman
  2006-12-05  3:40       ` YAMAMOTO Mitsuharu
@ 2006-12-06  9:44       ` Johan Bockgård
  2 siblings, 0 replies; 27+ messages in thread
From: Johan Bockgård @ 2006-12-06  9:44 UTC (permalink / raw)


storm@cua.dk (Kim F. Storm) writes:

> Done.

There's an item in NEWS that should be updated:

    ** When Emacs receives a USR1 or USR2 signal, this generates an
    input event: usr1-signal or usr2-signal.

-- 
Johan Bockgård

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-05 22:51           ` Kim F. Storm
@ 2006-12-08 10:28             ` YAMAMOTO Mitsuharu
  2006-12-11  9:41               ` Kim F. Storm
  0 siblings, 1 reply; 27+ messages in thread
From: YAMAMOTO Mitsuharu @ 2006-12-08 10:28 UTC (permalink / raw)
  Cc: rms, emacs-devel

>>>>> On Tue, 05 Dec 2006 23:51:03 +0100, storm@cua.dk (Kim F. Storm) said:

> AFAICS, kbd_buffer_store_event[_hold] is usually called inside
> BLOCK_INPUT, but there may be a few places where this is not the
> case, notably in keyboard.c (and in the signal handler).

> Would someone pls. check [and fix] this??  One way could be to abort
> in kbd_buffer_store_event_hold if called without input blocked.

All indirect calls from (*read_socket_hook), Fx_file_dialog,
xmenu_show, or xdialog_show are inside BLOCK_INPUT.  But some calls
are not, because the current code (except handle_user_signal) assumes
that at most one signal handler will call kbd_buffer_store_event_hold
asynchronously, I think.

  * record_asynch_buffer_change either blocks SIGIO or stops polling
    before calling kbd_buffer_store_event_hold.

  * The remaining case is the calls from read_avail_input:

    - gobble_input -> read_avail_input:
      Like record_asynch_buffer_change above.

    - input_available_signal -> handle_async_input -> read_avail_input:
      Inside the SIGIO handler and not interrupted by the same signal.

    - Other handle_async_input -> read_avail_input:
      Inside #ifdef SYNC_INPUT.

    If polling used:

    - poll_for_input -> poll_for_input_1 -> read_avail_input:
      Inside the SIGALRM handler and not interrupted by the same signal.

    - x_make_frame_visible -> poll_for_input_1 -> read_avail_input:
      poll_suppress_count is set.

    - read_char -> kbd_buffer_get_event -> read_avail_input:
      After STOP_POLLING.

				     YAMAMOTO Mitsuharu
				mituharu@math.s.chiba-u.ac.jp

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-08 10:28             ` YAMAMOTO Mitsuharu
@ 2006-12-11  9:41               ` Kim F. Storm
  2006-12-11 14:31                 ` YAMAMOTO Mitsuharu
  0 siblings, 1 reply; 27+ messages in thread
From: Kim F. Storm @ 2006-12-11  9:41 UTC (permalink / raw)
  Cc: rms, emacs-devel


Thank you very much for the analysis.

Could you please try to fix the problematic cases?


YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> writes:

>>>>>> On Tue, 05 Dec 2006 23:51:03 +0100, storm@cua.dk (Kim F. Storm) said:
>
>> AFAICS, kbd_buffer_store_event[_hold] is usually called inside
>> BLOCK_INPUT, but there may be a few places where this is not the
>> case, notably in keyboard.c (and in the signal handler).
>
>> Would someone pls. check [and fix] this??  One way could be to abort
>> in kbd_buffer_store_event_hold if called without input blocked.
>
> All indirect calls from (*read_socket_hook), Fx_file_dialog,
> xmenu_show, or xdialog_show are inside BLOCK_INPUT.  But some calls
> are not, because the current code (except handle_user_signal) assumes
> that at most one signal handler will call kbd_buffer_store_event_hold
> asynchronously, I think.
>
>   * record_asynch_buffer_change either blocks SIGIO or stops polling
>     before calling kbd_buffer_store_event_hold.
>
>   * The remaining case is the calls from read_avail_input:
>
>     - gobble_input -> read_avail_input:
>       Like record_asynch_buffer_change above.
>
>     - input_available_signal -> handle_async_input -> read_avail_input:
>       Inside the SIGIO handler and not interrupted by the same signal.
>
>     - Other handle_async_input -> read_avail_input:
>       Inside #ifdef SYNC_INPUT.
>
>     If polling used:
>
>     - poll_for_input -> poll_for_input_1 -> read_avail_input:
>       Inside the SIGALRM handler and not interrupted by the same signal.
>
>     - x_make_frame_visible -> poll_for_input_1 -> read_avail_input:
>       poll_suppress_count is set.
>
>     - read_char -> kbd_buffer_get_event -> read_avail_input:
>       After STOP_POLLING.
>
> 				     YAMAMOTO Mitsuharu
> 				mituharu@math.s.chiba-u.ac.jp
>
>

-- 
Kim F. Storm <storm@cua.dk> http://www.cua.dk

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-11  9:41               ` Kim F. Storm
@ 2006-12-11 14:31                 ` YAMAMOTO Mitsuharu
  2006-12-12  9:47                   ` Kim F. Storm
  0 siblings, 1 reply; 27+ messages in thread
From: YAMAMOTO Mitsuharu @ 2006-12-11 14:31 UTC (permalink / raw)
  Cc: rms, emacs-devel

>>>>> On Mon, 11 Dec 2006 10:41:30 +0100, storm@cua.dk (Kim F. Storm) said:

> Could you please try to fix the problematic cases?

I don't think I understand your whole plan to fix the
handle_user_signal issue.  Could you explain that?

				     YAMAMOTO Mitsuharu
				mituharu@math.s.chiba-u.ac.jp

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-11 14:31                 ` YAMAMOTO Mitsuharu
@ 2006-12-12  9:47                   ` Kim F. Storm
  2006-12-12 13:32                     ` YAMAMOTO Mitsuharu
  0 siblings, 1 reply; 27+ messages in thread
From: Kim F. Storm @ 2006-12-12  9:47 UTC (permalink / raw)
  Cc: rms, emacs-devel

YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> writes:

>>>>>> On Mon, 11 Dec 2006 10:41:30 +0100, storm@cua.dk (Kim F. Storm) said:
>
>> Could you please try to fix the problematic cases?
>
> I don't think I understand your whole plan to fix the
> handle_user_signal issue.  Could you explain that?

I guess the safest thing would be if the signal handler didn't
stuff the keyboard events itself.

What if the signal handlers just increment a global counter (one for
each signal type), and the main loop in keyboard.c checked those
counters and added the pending signal events in the "safe context"?

-- 
Kim F. Storm <storm@cua.dk> http://www.cua.dk

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-12  9:47                   ` Kim F. Storm
@ 2006-12-12 13:32                     ` YAMAMOTO Mitsuharu
  2006-12-12 13:54                       ` Kim F. Storm
  2006-12-12 21:46                       ` Richard Stallman
  0 siblings, 2 replies; 27+ messages in thread
From: YAMAMOTO Mitsuharu @ 2006-12-12 13:32 UTC (permalink / raw)
  Cc: rms, emacs-devel

>>>>> On Tue, 12 Dec 2006 10:47:09 +0100, storm@cua.dk (Kim F. Storm) said:

> What if the signal handlers just increment a global counter (one for
> each signal type), and the main loop in keyboard.c checked those
> counters and added the pending signal events in the "safe context"?

There're two problems I can think of with this approach.

First, it will cause a race condition.  I guess the global counters
will be checked just before `select' is called in
wait_reading_process_output.  But if SIGUSR1 is delivered between the
check of the counters and the call to `select', it does not interrupt
`select' and will not be noticed until another input/signal becomes
available or the timeout expires.  This issue is discussed in [1].

Second, the current `select' emulation code in the Carbon port does
not wait for signals, but only for window system events and process
outputs via sockets.

In principle, both of them can be solved by converting signal delivery
to data delivery on a pipe or a UNIX domain socket as in [1].  But
this will require not-so-small changes, and I fear this becomes
another sit-for case.

Is it possible to postpone this feature to after the release?

				     YAMAMOTO Mitsuharu
				mituharu@math.s.chiba-u.ac.jp

[1] Unix Network Programming, Volume 1: The Sockets Networking API,
3rd Edition, Chapter 20, Section 5.

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-12 13:32                     ` YAMAMOTO Mitsuharu
@ 2006-12-12 13:54                       ` Kim F. Storm
  2006-12-13  9:38                         ` YAMAMOTO Mitsuharu
  2006-12-12 21:46                       ` Richard Stallman
  1 sibling, 1 reply; 27+ messages in thread
From: Kim F. Storm @ 2006-12-12 13:54 UTC (permalink / raw)
  Cc: rms, emacs-devel

YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> writes:

>>>>>> On Tue, 12 Dec 2006 10:47:09 +0100, storm@cua.dk (Kim F. Storm) said:
>
>> What if the signal handlers just increment a global counter (one for
>> each signal type), and the main loop in keyboard.c checked those
>> counters and added the pending signal events in the "safe context"?
>
> There're two problems I can think of with this approach.

You are absolutely right about those problems, but they both existed
before.  In both cases, they only mean a delay in delivering the
signal event, which already was a problem in the original code.

The problem I would like to solve before the release is that of
a SIGUSRx potentially messing up the keyboard event queue.

Using a global flag or counter could solve that.

> In principle, both of them can be solved by converting signal delivery
> to data delivery on a pipe or a UNIX domain socket as in [1].  But
> this will require not-so-small changes, and I fear this becomes
> another sit-for case.
>
> Is it possible to postpone this feature to after the release?

Yes, we should just solve the event mixup, not the delay.

Can you work on that, please?

-- 
Kim F. Storm <storm@cua.dk> http://www.cua.dk

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-12 13:32                     ` YAMAMOTO Mitsuharu
  2006-12-12 13:54                       ` Kim F. Storm
@ 2006-12-12 21:46                       ` Richard Stallman
  1 sibling, 0 replies; 27+ messages in thread
From: Richard Stallman @ 2006-12-12 21:46 UTC (permalink / raw)
  Cc: emacs-devel, storm

The feature of handling these signals is not terribly important.
If fixing it is hard, we can drop the feature.  I don't like
dropping features, but this one being so minor is ok to drop.

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-12 13:54                       ` Kim F. Storm
@ 2006-12-13  9:38                         ` YAMAMOTO Mitsuharu
  2006-12-13 10:26                           ` Kim F. Storm
  0 siblings, 1 reply; 27+ messages in thread
From: YAMAMOTO Mitsuharu @ 2006-12-13  9:38 UTC (permalink / raw)
  Cc: rms, emacs-devel

>>>>> On Tue, 12 Dec 2006 14:54:06 +0100, storm@cua.dk (Kim F. Storm) said:

>>> What if the signal handlers just increment a global counter (one
>>> for each signal type), and the main loop in keyboard.c checked
>>> those counters and added the pending signal events in the "safe
>>> context"?
>> 
>> There're two problems I can think of with this approach.

> You are absolutely right about those problems, but they both existed
> before.  In both cases, they only mean a delay in delivering the
> signal event, which already was a problem in the original code.

I tried minimizing the first problem, but the second one still
remains.

BTW, is it necessary for us to read these events by read-key-sequence?
If not, it looks natural to bind them in special-event-map.

				     YAMAMOTO Mitsuharu
				mituharu@math.s.chiba-u.ac.jp

Index: src/emacs.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/emacs.c,v
retrieving revision 1.394
diff -c -p -r1.394 emacs.c
*** src/emacs.c	8 Dec 2006 00:20:17 -0000	1.394
--- src/emacs.c	13 Dec 2006 09:35:28 -0000
*************** pthread_t main_thread;
*** 361,384 ****
  #endif
  
  
- #if defined (SIGUSR1) || defined (SIGUSR2)
- SIGTYPE
- handle_user_signal (sig)
-      int sig;
- {
-   struct input_event buf;
- 
-   SIGNAL_THREAD_CHECK (sig);
-   bzero (&buf, sizeof buf);
-   buf.kind = USER_SIGNAL_EVENT;
-   buf.frame_or_window = selected_frame;
- 
-   kbd_buffer_store_event (&buf);
-   buf.code = sig;
-   kbd_buffer_store_event (&buf);
- }
- #endif
- 
  /* Handle bus errors, invalid instruction, etc.  */
  SIGTYPE
  fatal_error_signal (sig)
--- 361,366 ----
*************** main (argc, argv
*** 1211,1220 ****
        signal (SIGILL, fatal_error_signal);
        signal (SIGTRAP, fatal_error_signal);
  #ifdef SIGUSR1
!       signal (SIGUSR1, handle_user_signal);
  #endif
  #ifdef SIGUSR2
!       signal (SIGUSR2, handle_user_signal);
  #endif
  #ifdef SIGABRT
        signal (SIGABRT, fatal_error_signal);
--- 1193,1202 ----
        signal (SIGILL, fatal_error_signal);
        signal (SIGTRAP, fatal_error_signal);
  #ifdef SIGUSR1
!       add_user_signal (SIGUSR1, "usr1");
  #endif
  #ifdef SIGUSR2
!       add_user_signal (SIGUSR2, "usr2");
  #endif
  #ifdef SIGABRT
        signal (SIGABRT, fatal_error_signal);
Index: src/keyboard.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/keyboard.c,v
retrieving revision 1.882
diff -c -p -r1.882 keyboard.c
*** src/keyboard.c	4 Dec 2006 12:37:55 -0000	1.882
--- src/keyboard.c	13 Dec 2006 09:35:29 -0000
*************** static SIGTYPE interrupt_signal P_ ((int
*** 699,704 ****
--- 699,707 ----
  static void timer_start_idle P_ ((void));
  static void timer_stop_idle P_ ((void));
  static void timer_resume_idle P_ ((void));
+ static SIGTYPE handle_user_signal P_ ((int));
+ static char *find_user_signal_name P_ ((int));
+ static int store_user_signal_events P_ ((void));
  
  /* Nonzero means don't try to suspend even if the operating system seems
     to support it.  */
*************** make_lispy_event (event)
*** 5948,5967 ****
  
      case USER_SIGNAL_EVENT:
        /* A user signal.  */
!       switch (event->code)
  	{
! 	case 0:
! 	  return Qsignal;
! #ifdef SIGUSR1
! 	case SIGUSR1:
! 	  return intern ("usr1");
! #endif
! #ifdef SIGUSR2
! 	case SIGUSR2:
! 	  return intern ("usr2");
! #endif
! 	default:
! 	  return make_number (event->code);
  	}
  
      case SAVE_SESSION_EVENT:
--- 5951,5966 ----
  
      case USER_SIGNAL_EVENT:
        /* A user signal.  */
!       if (event->code == 0)
! 	return Qsignal;
!       else
  	{
! 	  char *name = find_user_signal_name (event->code);
! 
! 	  if (name)
! 	    return intern (name);
! 	  else
! 	    return make_number (event->code);
  	}
  
      case SAVE_SESSION_EVENT:
*************** read_avail_input (expected)
*** 6799,6804 ****
--- 6798,6807 ----
    register int i;
    int nread = 0;
  
+   /* Store pending user signal events, if any.  */
+   if (store_user_signal_events ())
+     expected = 0;
+ 
    if (read_socket_hook)
      {
        int nr;
*************** reinvoke_input_signal ()
*** 7022,7027 ****
--- 7025,7157 ----
  
  
  \f
+ /* User signal events.  */
+ 
+ struct user_signal_info
+ {
+   /* Signal number.  */
+   int sig;
+ 
+   /* Name of the signal.  */
+   char *name;
+ 
+   /* Number of pending signals.  */
+   int npending;
+ 
+   struct user_signal_info *next;
+ };
+ 
+ /* List of user signals. */
+ static struct user_signal_info *user_signals = NULL;
+ 
+ void
+ add_user_signal (sig, name)
+      int sig;
+      const char *name;
+ {
+   struct user_signal_info *p;
+ 
+   for (p = user_signals; p; p = p->next)
+     if (p->sig == sig)
+       /* Already added.  */
+       return;
+ 
+   p = xmalloc (sizeof (struct user_signal_info));
+   p->sig = sig;
+   p->name = xstrdup (name);
+   p->npending = 0;
+   p->next = user_signals;
+   user_signals = p;
+ 
+   signal (sig, handle_user_signal);
+ }
+ 
+ static SIGTYPE
+ handle_user_signal (sig)
+      int sig;
+ {
+   int old_errno = errno;
+   struct user_signal_info *p;
+ 
+ #if defined (USG) && !defined (POSIX_SIGNALS)
+   /* USG systems forget handlers when they are used;
+      must reestablish each time */
+   signal (sig, handle_user_signal);
+ #endif
+ 
+   SIGNAL_THREAD_CHECK (sig);
+ 
+   for (p = user_signals; p; p = p->next)
+     if (p->sig == sig)
+       {
+ 	p->npending++;
+ #ifdef SIGIO
+ 	if (interrupt_input)
+ 	  kill (getpid (), SIGIO);
+ 	else
+ #endif
+ 	  {
+ 	    /* Tell wait_reading_process_output that it needs to wake
+ 	       up and look around.  */
+ 	    if (input_available_clear_time)
+ 	      EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
+ 	  }
+ 	break;
+       }
+ 
+   errno = old_errno;
+ }
+ 
+ static char *
+ find_user_signal_name (sig)
+      int sig;
+ {
+   struct user_signal_info *p;
+ 
+   for (p = user_signals; p; p = p->next)
+     if (p->sig == sig)
+       return p->name;
+ 
+   return NULL;
+ }
+ 
+ static int
+ store_user_signal_events ()
+ {
+   struct user_signal_info *p;
+   struct input_event buf;
+   int nstored = 0;
+ 
+   for (p = user_signals; p; p = p->next)
+     if (p->npending > 0)
+       {
+ 	SIGMASKTYPE mask;
+ 
+ 	if (nstored == 0)
+ 	  {
+ 	    bzero (&buf, sizeof buf);
+ 	    buf.kind = USER_SIGNAL_EVENT;
+ 	    buf.frame_or_window = selected_frame;
+ 	  }
+ 	nstored += p->npending;
+ 
+ 	mask = sigblock (sigmask (p->sig));
+ 	do
+ 	  {
+ 	    buf.code = 0;
+ 	    kbd_buffer_store_event (&buf);
+ 	    buf.code = p->sig;
+ 	    kbd_buffer_store_event (&buf);
+ 	    p->npending--;
+ 	  }
+ 	while (p->npending > 0);
+ 	sigsetmask (mask);
+       }
+ 
+   return nstored;
+ }
+ 
+ \f
  static void menu_bar_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, void*));
  static Lisp_Object menu_bar_one_keymap_changed_items;
  
Index: src/keyboard.h
===================================================================
RCS file: /cvsroot/emacs/emacs/src/keyboard.h,v
retrieving revision 1.73
diff -c -p -r1.73 keyboard.h
*** src/keyboard.h	27 Aug 2006 07:09:14 -0000	1.73
--- src/keyboard.h	13 Dec 2006 09:35:29 -0000
*************** extern void gen_help_event P_ ((Lisp_Obj
*** 344,349 ****
--- 344,350 ----
  extern void kbd_buffer_store_help_event P_ ((Lisp_Object, Lisp_Object));
  extern Lisp_Object menu_item_eval_property P_ ((Lisp_Object));
  extern int  kbd_buffer_events_waiting P_ ((int));
+ extern void add_user_signals P_ ((int, const char *));
  
  /* arch-tag: 769cbade-1ba9-4950-b886-db265b061aa3
     (do not change this comment) */

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-13  9:38                         ` YAMAMOTO Mitsuharu
@ 2006-12-13 10:26                           ` Kim F. Storm
  2006-12-14  9:14                             ` YAMAMOTO Mitsuharu
  0 siblings, 1 reply; 27+ messages in thread
From: Kim F. Storm @ 2006-12-13 10:26 UTC (permalink / raw)
  Cc: rms, emacs-devel

YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> writes:

>>>>>> On Tue, 12 Dec 2006 14:54:06 +0100, storm@cua.dk (Kim F. Storm) said:
>
>>>> What if the signal handlers just increment a global counter (one
>>>> for each signal type), and the main loop in keyboard.c checked
>>>> those counters and added the pending signal events in the "safe
>>>> context"?
>>> 
>>> There're two problems I can think of with this approach.
>
>> You are absolutely right about those problems, but they both existed
>> before.  In both cases, they only mean a delay in delivering the
>> signal event, which already was a problem in the original code.
>
> I tried minimizing the first problem, but the second one still
> remains.

Thank you very much.

The changes look good, so please install them.

>
> BTW, is it necessary for us to read these events by read-key-sequence?
> If not, it looks natural to bind them in special-event-map.

You have a good point there!  If we bind signals in special-event-map,
we don't really have to care about them being mixed up with the rest
of the keyboard events ...

OTOH, if we put them in the special-event-map, we make it practically
impossible for a (global) minor-mode to setup catching a signal
through its "private" keymaps.  So keeping signals in the
read-key-sequence loop is definitely more flexible.

Also, although the definition of special-event-map doesn't explicitly
say so, it only allows bindings for single events.  This means that we
would have to revert to having just a single event for signals.

So I suggest installing your changes, and otherwise keep things as they are.

-- 
Kim F. Storm <storm@cua.dk> http://www.cua.dk

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-13 10:26                           ` Kim F. Storm
@ 2006-12-14  9:14                             ` YAMAMOTO Mitsuharu
  2006-12-14 11:23                               ` Kim F. Storm
  0 siblings, 1 reply; 27+ messages in thread
From: YAMAMOTO Mitsuharu @ 2006-12-14  9:14 UTC (permalink / raw)
  Cc: rms, emacs-devel

>>>>> On Wed, 13 Dec 2006 11:26:53 +0100, storm@cua.dk (Kim F. Storm) said:

>> I tried minimizing the first problem, but the second one still
>> remains.

> Thank you very much.

> The changes look good, so please install them.

Done.

>> BTW, is it necessary for us to read these events by
>> read-key-sequence?  If not, it looks natural to bind them in
>> special-event-map.

> You have a good point there!  If we bind signals in
> special-event-map, we don't really have to care about them being
> mixed up with the rest of the keyboard events ...

Yes.  The Emacs Lisp info says:

  `signal usr1'
  `signal usr2'
       These event sequences are generated when the Emacs process receives
       the signals `SIGUSR1' and `SIGUSR2'.  They contain no additional
       data because signals do not carry additional information.

     If one of these events arrives in the middle of a key sequence--that
  is, after a prefix key--then Emacs reorders the events so that this
  event comes either before or after the multi-event key sequence, not
  within it.

But currently they do not behave as above.

> OTOH, if we put them in the special-event-map, we make it
> practically impossible for a (global) minor-mode to setup catching a
> signal through its "private" keymaps.  So keeping signals in the
> read-key-sequence loop is definitely more flexible.

> Also, although the definition of special-event-map doesn't
> explicitly say so, it only allows bindings for single events.  This
> means that we would have to revert to having just a single event for
> signals.

One possible way would be to generate an intermediate single event
that carries a signal number, and bind such an event to a dispatcher
command in special-event-map.  Then the dispatcher looks up the
corresponding (multiple) key sequence and executes the associated
command.  `mac-dispatch-apple-event' in term/mac-win.el handles Apple
Events in such a way so these events may not be mixed up with a usual
key sequence.

				     YAMAMOTO Mitsuharu
				mituharu@math.s.chiba-u.ac.jp

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-14  9:14                             ` YAMAMOTO Mitsuharu
@ 2006-12-14 11:23                               ` Kim F. Storm
  2006-12-18 16:38                                 ` Chong Yidong
  0 siblings, 1 reply; 27+ messages in thread
From: Kim F. Storm @ 2006-12-14 11:23 UTC (permalink / raw)
  Cc: rms, emacs-devel

YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> writes:

>      If one of these events arrives in the middle of a key sequence--that
>   is, after a prefix key--then Emacs reorders the events so that this
>   event comes either before or after the multi-event key sequence, not
>   within it.
>
> But currently they do not behave as above.

That's no good!

This is a good reason for handling signals through special-event-map.

> One possible way would be to generate an intermediate single event
> that carries a signal number, and bind such an event to a dispatcher
> command in special-event-map.  Then the dispatcher looks up the
> corresponding (multiple) key sequence and executes the associated
> command.  `mac-dispatch-apple-event' in term/mac-win.el handles Apple
> Events in such a way so these events may not be mixed up with a usual
> key sequence.

IMO, signal handling is not important enough for that complexity.

So I would rather redefine them to single events (named sigusr1 and
sigusr2 as those names are already known to the signal-process
function), and handle them through special-event-map as you suggested.

The docs you quote above should be changed to say that signals should
be handled through special-event-map, or signals may risk messing up the
normal event processing.

-- 
Kim F. Storm <storm@cua.dk> http://www.cua.dk

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-14 11:23                               ` Kim F. Storm
@ 2006-12-18 16:38                                 ` Chong Yidong
  2006-12-19  2:14                                   ` YAMAMOTO Mitsuharu
  0 siblings, 1 reply; 27+ messages in thread
From: Chong Yidong @ 2006-12-18 16:38 UTC (permalink / raw)
  Cc: rms, YAMAMOTO Mitsuharu, emacs-devel

storm@cua.dk (Kim F. Storm) writes:

> So I would rather redefine them to single events (named sigusr1 and
> sigusr2 as those names are already known to the signal-process
> function), and handle them through special-event-map as you suggested.

In that case, is there a rationale for the rather large changes
checked into emacs.c, keyboard.c, and process.c over the last two
weeks?  Should they not be reverted?

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-18 16:38                                 ` Chong Yidong
@ 2006-12-19  2:14                                   ` YAMAMOTO Mitsuharu
  2006-12-19  9:48                                     ` Kim F. Storm
  0 siblings, 1 reply; 27+ messages in thread
From: YAMAMOTO Mitsuharu @ 2006-12-19  2:14 UTC (permalink / raw)
  Cc: emacs-devel, rms, Kim F. Storm

>>>>> On Mon, 18 Dec 2006 11:38:21 -0500, Chong Yidong <cyd@stupidchicken.com> said:

> storm@cua.dk (Kim F. Storm) writes:
>> So I would rather redefine them to single events (named sigusr1 and
>> sigusr2 as those names are already known to the signal-process
>> function), and handle them through special-event-map as you
>> suggested.

> In that case, is there a rationale for the rather large changes
> checked into emacs.c, keyboard.c, and process.c over the last two
> weeks?  Should they not be reverted?

Do the "large changes" you think should be reverted include my
2006-12-14 changes?  These changes are not for the event format but
for fixing a problem that has existed for a long time.  That is, about
calling a non-reentrant function in a signal handler context while it
is executed in a normal context.

				     YAMAMOTO Mitsuharu
				mituharu@math.s.chiba-u.ac.jp

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-19  2:14                                   ` YAMAMOTO Mitsuharu
@ 2006-12-19  9:48                                     ` Kim F. Storm
  2006-12-19 15:46                                       ` Kim F. Storm
  2006-12-20 13:01                                       ` Richard Stallman
  0 siblings, 2 replies; 27+ messages in thread
From: Kim F. Storm @ 2006-12-19  9:48 UTC (permalink / raw)
  Cc: Chong Yidong, rms, emacs-devel

YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> writes:

>>>>>> On Mon, 18 Dec 2006 11:38:21 -0500, Chong Yidong <cyd@stupidchicken.com> said:
>
>> storm@cua.dk (Kim F. Storm) writes:
>>> So I would rather redefine them to single events (named sigusr1 and
>>> sigusr2 as those names are already known to the signal-process
>>> function), and handle them through special-event-map as you
>>> suggested.
>
>> In that case, is there a rationale for the rather large changes
>> checked into emacs.c, keyboard.c, and process.c over the last two
>> weeks?  Should they not be reverted?
>
> Do the "large changes" you think should be reverted include my
> 2006-12-14 changes?  These changes are not for the event format but
> for fixing a problem that has existed for a long time.  That is, about
> calling a non-reentrant function in a signal handler context while it
> is executed in a normal context.

Yes.  Those changes are very important on their own.

It still think that handling signals through special-event-map is
the proper (or the least problematic) thing to do.  So unless I
hear any objections, I'll make that change later this week.

-- 
Kim F. Storm <storm@cua.dk> http://www.cua.dk

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-19  9:48                                     ` Kim F. Storm
@ 2006-12-19 15:46                                       ` Kim F. Storm
  2006-12-20 13:01                                       ` Richard Stallman
  1 sibling, 0 replies; 27+ messages in thread
From: Kim F. Storm @ 2006-12-19 15:46 UTC (permalink / raw)
  Cc: Chong Yidong, rms, emacs-devel

storm@cua.dk (Kim F. Storm) writes:

> It still think that handling signals through special-event-map is
> the proper (or the least problematic) thing to do.  So unless I
> hear any objections, I'll make that change later this week.

"later this week" => this afternoon :-)

Done!

-- 
Kim F. Storm <storm@cua.dk> http://www.cua.dk

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-19  9:48                                     ` Kim F. Storm
  2006-12-19 15:46                                       ` Kim F. Storm
@ 2006-12-20 13:01                                       ` Richard Stallman
  2006-12-20 15:58                                         ` Kim F. Storm
  1 sibling, 1 reply; 27+ messages in thread
From: Richard Stallman @ 2006-12-20 13:01 UTC (permalink / raw)
  Cc: cyd, mituharu, emacs-devel

    It still think that handling signals through special-event-map is
    the proper (or the least problematic) thing to do.  So unless I
    hear any objections, I'll make that change later this week.

Ok with me.

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

* Re: usr1-signal, usr2-signal, etc.
  2006-12-20 13:01                                       ` Richard Stallman
@ 2006-12-20 15:58                                         ` Kim F. Storm
  0 siblings, 0 replies; 27+ messages in thread
From: Kim F. Storm @ 2006-12-20 15:58 UTC (permalink / raw)
  Cc: cyd, mituharu, emacs-devel

Richard Stallman <rms@gnu.org> writes:

>     It still think that handling signals through special-event-map is
>     the proper (or the least problematic) thing to do.  So unless I
>     hear any objections, I'll make that change later this week.
>
> Ok with me.

Done!

-- 
Kim F. Storm <storm@cua.dk> http://www.cua.dk

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

end of thread, other threads:[~2006-12-20 15:58 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-12-03  1:39 usr1-signal, usr2-signal, etc Kim F. Storm
2006-12-04  5:15 ` Richard Stallman
2006-12-04  9:05   ` Kim F. Storm
2006-12-04 13:08     ` Kim F. Storm
2006-12-05  1:45       ` Richard Stallman
2006-12-05  3:40       ` YAMAMOTO Mitsuharu
2006-12-05 22:26         ` David Kastrup
2006-12-05 22:51           ` Kim F. Storm
2006-12-08 10:28             ` YAMAMOTO Mitsuharu
2006-12-11  9:41               ` Kim F. Storm
2006-12-11 14:31                 ` YAMAMOTO Mitsuharu
2006-12-12  9:47                   ` Kim F. Storm
2006-12-12 13:32                     ` YAMAMOTO Mitsuharu
2006-12-12 13:54                       ` Kim F. Storm
2006-12-13  9:38                         ` YAMAMOTO Mitsuharu
2006-12-13 10:26                           ` Kim F. Storm
2006-12-14  9:14                             ` YAMAMOTO Mitsuharu
2006-12-14 11:23                               ` Kim F. Storm
2006-12-18 16:38                                 ` Chong Yidong
2006-12-19  2:14                                   ` YAMAMOTO Mitsuharu
2006-12-19  9:48                                     ` Kim F. Storm
2006-12-19 15:46                                       ` Kim F. Storm
2006-12-20 13:01                                       ` Richard Stallman
2006-12-20 15:58                                         ` Kim F. Storm
2006-12-12 21:46                       ` Richard Stallman
2006-12-06  0:46         ` Richard Stallman
2006-12-06  9:44       ` Johan Bockgård

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