unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Pip Cet via "Emacs development discussions." <emacs-devel@gnu.org>
To: Eli Zaretskii <eliz@gnu.org>
Cc: eller.helmut@gmail.com, gerd.moellmann@gmail.com, ofv@wanadoo.es,
	emacs-devel@gnu.org, acorallo@gnu.org
Subject: Re: SIGPROF + SIGCHLD and igc
Date: Sun, 29 Dec 2024 20:44:07 +0000	[thread overview]
Message-ID: <87bjwu2pb6.fsf@protonmail.com> (raw)
In-Reply-To: <86ttanqc0p.fsf@gnu.org>

Pip Cet <pipcet@protonmail.com> writes:
> Thanks, I got the idea now!
>
> Yes, that would work, assuming SIGPROF is never blocked, and that no
> signal interrupting the SIGPROF handler attempts to take the arena lock.
> (Also, we assume the SIGPROF handler has finished by the time the next
> SIGPROF is sent.  I think this assumption is fixable, though, and we'd
> need to fix it for other signals).

Now I've had some time to think about it, I really like this idea, and
think it's our best bet.  Thanks!

Here's a sketch.  The idea is that all signals go through the signal
receiver thread, which serializes them, picks one, enters the arena,
tells the main thread that this signal is now safe to run, re-kills the
main thread, waits for confirmation, leaves the arena, waits for
confirmation AGAIN, then goes back to sleep.

However, the re-kill cannot happen just with the same signal, because we
need to block that in the main thread, in the case of SIGCHLD (and who
knows which other signals are level-triggered in this way, so just do it
for all of them).  Therefore, we kill the main thread twice, once with
SIGURG (no particular reason for that choice) to tell it to unblock
signals and then with the original signal to mark it pending.  (It would
be nicer to raise() the signal in its signal handler after blocking it,
but IIRC that doesn't work).

Assumes atomicity and visibility of stores, as does the rest of Emacs.

This also assumes the signal isn't supposed to be blocked by the time we
receive the SIGURG.  If we need that, we need a shadow signal mask, I
guess.

Pip

diff --git a/src/igc.c b/src/igc.c
index 4b59352681b..a07e331b792 100644
--- a/src/igc.c
+++ b/src/igc.c
@@ -814,8 +814,57 @@ IGC_DEFINE_LIST (igc_thread);
   /* The real signal mask we want to restore after handling pending
    * signals.  */
   sigset_t signal_mask;
+
+  pthread_t receiver_thread_id;
+  int signal_receiver_waiting;
+  int signal_receiver_pipe[2];
 };
 
+#define SIGNAL_HANDLER_STARTED 'A'
+#define SIGNAL_HANDLER_FINISHED 'Z'
+
+extern pthread_t main_thread_id;
+
+extern void ArenaEnter (mps_arena_t arena);
+extern void ArenaLeave (mps_arena_t arena);
+
+static void *signal_receiver_thread(void *gc_v)
+{
+  struct igc *gc = gc_v;
+  sigset_t full_mask;
+  sigfillset (&full_mask);
+  pthread_sigmask (SIG_SETMASK, &full_mask, NULL);
+
+  while (true)
+    {
+      sigset_t empty_mask;
+      sigemptyset (&empty_mask);
+      sigsuspend (&empty_mask);
+
+      while (gc->signals_pending)
+	{
+	  gc->signals_pending = 0;
+
+	  for (int i = 0; i < ARRAYELTS (gc->pending_signals); i++)
+	    if (gc->pending_signals[i])
+	      {
+		ArenaEnter (gc->arena);
+		gc->signal_receiver_waiting = i;
+		pthread_kill (main_thread_id, SIGURG);
+		pthread_kill (main_thread_id, i);
+		char c;
+		while (read (gc->signal_receiver_pipe[0], &c, 1) != 1);
+		if (c != SIGNAL_HANDLER_STARTED)
+		  emacs_abort ();
+		ArenaLeave (gc->arena);
+		while (read (gc->signal_receiver_pipe[0], &c, 1) != 1);
+		if (c != SIGNAL_HANDLER_FINISHED)
+		  emacs_abort ();
+	      }
+	}
+    }
+}
+
 static bool process_one_message (struct igc *gc);
 
 /* The global registry.  */
@@ -4618,6 +4667,10 @@ make_igc (void)
   root_create_exact_ptr (gc, &current_thread);
   root_create_exact_ptr (gc, &all_threads);
 
+  if (pipe (gc->signal_receiver_pipe))
+    emacs_abort ();
+  pthread_create (&gc->receiver_thread_id, NULL, signal_receiver_thread, gc);
+
   enable_messages (gc, true);
   return gc;
 }
@@ -4921,36 +4974,55 @@ gc_signal_handler_can_run (int sig)
 {
   eassume (sig >= 0);
   eassert (sig < ARRAYELTS (global_igc->pending_signals));
-  if (igc_busy_p ())
+  if (pthread_equal (pthread_self (), global_igc->receiver_thread_id))
+    return false;
+  else if (pthread_equal (pthread_self (), main_thread_id))
     {
-      sigset_t sigs;
-      global_igc->signals_pending = 1;
-      global_igc->pending_signals[sig] = 1;
-      sigemptyset (&sigs);
-      sigaddset (&sigs, sig);
-      pthread_sigmask (SIG_BLOCK, &sigs, NULL);
-      /* We cannot raise (sig) here, because there are platforms where
-       * it doesn't work.  */
-      return false;
+      if (global_igc->signal_receiver_waiting != sig)
+	{
+	  sigset_t sigs;
+	  global_igc->signals_pending = 1;
+	  global_igc->pending_signals[sig] = 1;
+	  sigemptyset (&sigs);
+	  sigaddset (&sigs, sig);
+	  pthread_sigmask (SIG_BLOCK, &sigs, NULL);
+	  pthread_kill (global_igc->receiver_thread_id, sig);
+	  return false;
+	}
+      else if (sig == SIGURG)
+	{
+	  sigset_t sigs;
+	  sigemptyset (&sigs);
+	  for (int i = 0; i < ARRAYELTS (global_igc->pending_signals); i++)
+	    if (global_igc->pending_signals[i])
+	      sigaddset (&sigs, i);
+	  pthread_sigmask (SIG_UNBLOCK, &sigs, NULL);
+	  return false;
+	}
+      else
+	global_igc->signal_receiver_waiting = 0;
+      char c = SIGNAL_HANDLER_STARTED;
+      while (write (global_igc->signal_receiver_pipe[1], &c, 1) != 1);
     }
   return true;
 }
 
+bool
+gc_signal_handler_finished (int sig)
+{
+  if (pthread_equal (pthread_self (), main_thread_id))
+    {
+      char c = SIGNAL_HANDLER_FINISHED;
+      while (write (global_igc->signal_receiver_pipe[1], &c, 1) != 1);
+    }
+
+  return true;
+}
+
 /* Called from `maybe_quit'.  This assumes no signals are blocked.  */
 void
 gc_maybe_quit (void)
 {
-  while (global_igc->signals_pending)
-    {
-      global_igc->signals_pending = 0;
-      for (int i = 0; i < ARRAYELTS (global_igc->pending_signals); i++)
-	if (global_igc->pending_signals[i])
-	  {
-	    global_igc->pending_signals[i] = 0;
-	    raise (i);
-	  }
-      pthread_sigmask (SIG_SETMASK, &global_igc->signal_mask, NULL);
-    }
 }
 
 DEFUN ("igc--add-extra-dependency", Figc__add_extra_dependency,
diff --git a/src/lisp.h b/src/lisp.h
index 48585c2d8a1..c6c7f772e43 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -48,6 +48,7 @@ #define EMACS_LISP_H
 union gc_header;
 extern void gc_maybe_quit (void);
 extern bool gc_signal_handler_can_run (int);
+extern bool gc_signal_handler_finished (int);
 #else
 INLINE void gc_maybe_quit (void)
 {
@@ -57,6 +58,10 @@ #define EMACS_LISP_H
 {
   return true;
 }
+INLINE bool gc_signal_handler_finished (int sig)
+{
+  return true;
+}
 union gc_header { };
 #endif
 
diff --git a/src/sysdep.c b/src/sysdep.c
index 9270bfa97d9..0eb1466b6a4 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -1719,7 +1719,7 @@ emacs_sigaction_init (struct sigaction *action, signal_handler_t handler)
 }
 
 #ifdef FORWARD_SIGNAL_TO_MAIN_THREAD
-static pthread_t main_thread_id;
+pthread_t main_thread_id;
 #endif
 
 /* SIG has arrived at the current process.  Deliver it to the main
@@ -1759,6 +1759,7 @@ deliver_process_signal (int sig, signal_handler_t handler)
     handler (sig);
 
   errno = old_errno;
+  gc_signal_handler_finished (sig);
 }
 
 /* Static location to save a fatal backtrace in a thread.




  parent reply	other threads:[~2024-12-29 20:44 UTC|newest]

Thread overview: 224+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-22 15:40 Some experience with the igc branch Óscar Fuentes
2024-12-22 17:18 ` Gerd Möllmann
2024-12-22 17:29 ` Gerd Möllmann
2024-12-22 17:41 ` Pip Cet via Emacs development discussions.
2024-12-22 17:56   ` Gerd Möllmann
2024-12-22 19:11   ` Óscar Fuentes
2024-12-23  0:05     ` Pip Cet via Emacs development discussions.
2024-12-23  1:00       ` Óscar Fuentes
2024-12-24 22:34         ` Pip Cet via Emacs development discussions.
2024-12-25  4:25           ` Freezing frame with igc Gerd Möllmann
2024-12-25 11:19             ` Pip Cet via Emacs development discussions.
2024-12-25 11:55             ` Óscar Fuentes
2024-12-23  3:42       ` Some experience with the igc branch Gerd Möllmann
2024-12-23  6:27     ` Jean Louis
2024-12-22 20:29   ` Helmut Eller
2024-12-22 20:50   ` Gerd Möllmann
2024-12-22 22:26     ` Pip Cet via Emacs development discussions.
2024-12-23  3:23       ` Gerd Möllmann
     [not found]         ` <m234ieddeu.fsf_-_@gmail.com>
     [not found]           ` <87ttaueqp9.fsf@protonmail.com>
     [not found]             ` <m2frme921u.fsf@gmail.com>
     [not found]               ` <87ldw6ejkv.fsf@protonmail.com>
     [not found]                 ` <m2bjx2h8dh.fsf@gmail.com>
2024-12-23 14:45                   ` Make Signal handling patch platform-dependent? Pip Cet via Emacs development discussions.
2024-12-23 14:54                     ` Gerd Möllmann
2024-12-23 15:11                       ` Eli Zaretskii
2024-12-23 13:35       ` Some experience with the igc branch Eli Zaretskii
2024-12-23 14:03         ` Discussion with MPS people Gerd Möllmann
2024-12-23 14:04           ` Gerd Möllmann
2024-12-23 15:07         ` Some experience with the igc branch Pip Cet via Emacs development discussions.
2024-12-23 15:26           ` Gerd Möllmann
2024-12-23 16:03             ` Pip Cet via Emacs development discussions.
2024-12-23 16:44               ` Eli Zaretskii
2024-12-23 17:16                 ` Pip Cet via Emacs development discussions.
2024-12-23 18:35                   ` Eli Zaretskii
2024-12-23 18:48                     ` Gerd Möllmann
2024-12-23 19:25                       ` Eli Zaretskii
2024-12-23 20:30                     ` Benjamin Riefenstahl
2024-12-23 23:39                       ` Pip Cet via Emacs development discussions.
2024-12-24 12:14                         ` Eli Zaretskii
2024-12-24 13:18                           ` Pip Cet via Emacs development discussions.
2024-12-24 13:42                           ` Benjamin Riefenstahl
2024-12-24  3:37                       ` Eli Zaretskii
2024-12-24  8:48                         ` Benjamin Riefenstahl
2024-12-24 13:52                           ` Eli Zaretskii
2024-12-24 13:54                             ` Benjamin Riefenstahl
2024-12-23 17:44               ` Gerd Möllmann
2024-12-23 19:00                 ` Eli Zaretskii
2024-12-23 19:37                   ` Eli Zaretskii
2024-12-23 20:49                   ` Gerd Möllmann
2024-12-23 21:43                     ` Helmut Eller
2024-12-23 21:49                       ` Pip Cet via Emacs development discussions.
2024-12-23 21:58                         ` Helmut Eller
2024-12-23 23:20                           ` Pip Cet via Emacs development discussions.
2024-12-24  5:38                             ` Helmut Eller
2024-12-24  6:27                               ` Gerd Möllmann
2024-12-24 10:09                               ` Pip Cet via Emacs development discussions.
2024-12-24  4:05                       ` Gerd Möllmann
2024-12-24  8:50                         ` Gerd Möllmann
2024-12-24  6:03                     ` SIGPROF + SIGCHLD and igc Gerd Möllmann
2024-12-24  8:23                       ` Helmut Eller
2024-12-24  8:39                         ` Gerd Möllmann
2024-12-25  9:22                           ` Helmut Eller
2024-12-25  9:43                             ` Gerd Möllmann
2024-12-24 13:05                         ` Eli Zaretskii
2024-12-25 10:46                           ` Helmut Eller
2024-12-25 12:45                             ` Eli Zaretskii
2024-12-24 12:54                       ` Eli Zaretskii
2024-12-24 12:59                         ` Gerd Möllmann
2024-12-27  8:08                       ` Helmut Eller
2024-12-27  8:51                         ` Eli Zaretskii
2024-12-27 14:53                           ` Helmut Eller
2024-12-27 15:09                             ` Pip Cet via Emacs development discussions.
2024-12-27 15:19                             ` Eli Zaretskii
2024-12-29 18:50                           ` Helmut Eller
2024-12-29 19:05                             ` Eli Zaretskii
2024-12-29 19:34                               ` Helmut Eller
2024-12-29 20:08                                 ` Eli Zaretskii
2024-12-29 20:50                                   ` Helmut Eller
2024-12-27  8:55                         ` Gerd Möllmann
2024-12-27 15:40                           ` Helmut Eller
2024-12-27 15:53                             ` Gerd Möllmann
2024-12-27 11:36                         ` Pip Cet via Emacs development discussions.
2024-12-27 16:14                           ` Helmut Eller
2024-12-28 10:02                             ` Helmut Eller
2024-12-28 10:50                               ` Eli Zaretskii
2024-12-28 13:52                                 ` Helmut Eller
2024-12-28 14:25                                   ` Eli Zaretskii
2024-12-28 16:46                                     ` Helmut Eller
2024-12-28 17:35                                       ` Eli Zaretskii
2024-12-28 18:08                                         ` Helmut Eller
2024-12-28 19:00                                           ` Eli Zaretskii
2024-12-28 19:28                                             ` Helmut Eller
2024-12-28 19:32                                       ` Pip Cet via Emacs development discussions.
2024-12-28 19:51                                         ` Helmut Eller
2024-12-28 20:43                                           ` Pip Cet via Emacs development discussions.
2024-12-29  5:44                                             ` Eli Zaretskii
2024-12-29 12:15                                               ` Pip Cet via Emacs development discussions.
2024-12-29 20:44                                               ` Pip Cet via Emacs development discussions. [this message]
2024-12-30 15:03                                                 ` Eli Zaretskii
2024-12-30 16:46                                                   ` Pip Cet via Emacs development discussions.
2024-12-30 17:47                                                     ` Eli Zaretskii
2024-12-30 17:53                                                       ` Daniel Colascione
2024-12-30 18:25                                                         ` Eli Zaretskii
2024-12-30 21:04                                                       ` Pip Cet via Emacs development discussions.
2024-12-31 12:35                                                         ` Eli Zaretskii
2024-12-31 13:57                                                           ` Pip Cet via Emacs development discussions.
2024-12-31 14:20                                                             ` Eli Zaretskii
2024-12-23 23:37                   ` Some experience with the igc branch Pip Cet via Emacs development discussions.
2024-12-24  4:03                     ` Gerd Möllmann
2024-12-24 10:25                       ` Pip Cet via Emacs development discussions.
2024-12-24 10:50                         ` Gerd Möllmann
2024-12-24 13:15                         ` Eli Zaretskii
2024-12-24 12:26                       ` Eli Zaretskii
2024-12-24 12:56                         ` Gerd Möllmann
2024-12-24 13:19                           ` Pip Cet via Emacs development discussions.
2024-12-24 13:38                             ` Gerd Möllmann
2024-12-24 13:46                           ` Eli Zaretskii
2024-12-24 14:12                             ` Gerd Möllmann
2024-12-24 14:40                               ` Eli Zaretskii
2024-12-25  4:56                                 ` Gerd Möllmann
2024-12-25 12:19                                   ` Eli Zaretskii
2024-12-25 12:50                                     ` Gerd Möllmann
2024-12-25 13:00                                       ` Eli Zaretskii
2024-12-25 13:08                                         ` Gerd Möllmann
2024-12-25 13:26                                           ` Eli Zaretskii
2024-12-25 14:07                                             ` Gerd Möllmann
2024-12-25 14:43                                               ` Helmut Eller
2024-12-25 14:59                                                 ` Eli Zaretskii
2024-12-25 20:44                                                   ` Helmut Eller
2024-12-26  6:29                                                     ` Eli Zaretskii
2024-12-26  8:02                                                       ` Helmut Eller
2024-12-26  9:32                                                         ` Eli Zaretskii
2024-12-26 12:24                                                           ` Helmut Eller
2024-12-26 15:23                                                             ` Eli Zaretskii
2024-12-26 23:29                                                               ` Paul Eggert
2024-12-27  7:57                                                                 ` Eli Zaretskii
2024-12-27 19:34                                                                   ` Paul Eggert
2024-12-28  8:06                                                                     ` Eli Zaretskii
2024-12-28 20:44                                                                       ` Paul Eggert
2024-12-29  5:47                                                                         ` Eli Zaretskii
2024-12-29 19:09                                                                           ` Paul Eggert
2024-12-29 19:20                                                                             ` Eli Zaretskii
2024-12-29 19:30                                                                               ` Paul Eggert
2024-12-29 20:01                                                                                 ` Eli Zaretskii
2024-12-30  7:55                                                                                   ` Paul Eggert
2024-12-25 15:02                                                 ` Gerd Möllmann
2024-12-25 13:09                                       ` Eli Zaretskii
2024-12-25 13:46                                         ` Gerd Möllmann
2024-12-25 14:37                                           ` Eli Zaretskii
2024-12-25 14:57                                             ` Gerd Möllmann
2024-12-25 15:28                                               ` Eli Zaretskii
2024-12-25 15:49                                                 ` Gerd Möllmann
2024-12-25 17:26                                                   ` Eli Zaretskii
2024-12-26  5:25                                                     ` Gerd Möllmann
2024-12-26  7:43                                                       ` Eli Zaretskii
2024-12-26  7:57                                                         ` Gerd Möllmann
2024-12-26 11:56                                                           ` Eli Zaretskii
2024-12-26 15:27                                                           ` Stefan Kangas
2024-12-26 19:51                                                             ` Gerd Möllmann
2024-12-27  9:45                                                               ` Gerd Möllmann
2024-12-27 13:56                                                                 ` Gerd Möllmann
2024-12-27 15:01                                                                   ` Pip Cet via Emacs development discussions.
2024-12-27 15:28                                                                     ` Eli Zaretskii
2024-12-27 15:47                                                                       ` Pip Cet via Emacs development discussions.
2024-12-27 16:18                                                                       ` Gerd Möllmann
2024-12-28  9:10                                                                         ` Stefan Kangas
2024-12-28  9:20                                                                           ` Gerd Möllmann
2024-12-28  9:24                                                                             ` Gerd Möllmann
2024-12-27 16:05                                                                     ` Gerd Möllmann
2024-12-27 17:00                                                                       ` Pip Cet via Emacs development discussions.
2024-12-27 16:37                                                                   ` Eli Zaretskii
2024-12-27 17:26                                                                     ` Pip Cet via Emacs development discussions.
2024-12-27 19:12                                                                       ` Gerd Möllmann
2024-12-28  7:36                                                                       ` Eli Zaretskii
2024-12-28 12:35                                                                         ` Pip Cet via Emacs development discussions.
2024-12-28 12:51                                                                           ` Gerd Möllmann
2024-12-28 13:13                                                                           ` Eli Zaretskii
2024-12-28  9:29                                                                       ` Eli Zaretskii
2024-12-28 13:12                                                                         ` Pip Cet via Emacs development discussions.
2024-12-28 14:08                                                                           ` Eli Zaretskii
2024-12-27 18:21                                                                     ` Gerd Möllmann
2024-12-27 19:23                                                                       ` Pip Cet via Emacs development discussions.
2024-12-27 20:28                                                                         ` Gerd Möllmann
2024-12-28 10:39                                                                       ` Eli Zaretskii
2024-12-28 11:07                                                                         ` Gerd Möllmann
2024-12-28 11:23                                                                           ` Gerd Möllmann
2024-12-28 14:04                                                                           ` Pip Cet via Emacs development discussions.
2024-12-28 14:25                                                                             ` Gerd Möllmann
2024-12-28 16:27                                                                             ` Eli Zaretskii
2024-12-28  6:08                                                                     ` Gerd Möllmann
2024-12-25 17:40                                       ` Pip Cet via Emacs development discussions.
2024-12-25 17:51                                         ` Eli Zaretskii
2024-12-26 15:24                                           ` Pip Cet via Emacs development discussions.
2024-12-26 15:57                                             ` Eli Zaretskii
2024-12-27 14:34                                               ` Pip Cet via Emacs development discussions.
2024-12-27 15:58                                                 ` Eli Zaretskii
2024-12-27 16:42                                                   ` Pip Cet via Emacs development discussions.
2024-12-28 18:02                                                     ` Eli Zaretskii
2024-12-28 21:05                                                       ` Pip Cet via Emacs development discussions.
2024-12-29  6:15                                                         ` Eli Zaretskii
2024-12-29 12:39                                                           ` Pip Cet via Emacs development discussions.
2024-12-29 13:52                                                             ` Eli Zaretskii
2024-12-29 17:14                                                               ` Pip Cet via Emacs development discussions.
2024-12-26  5:27                                         ` Gerd Möllmann
2024-12-26  5:29                                         ` Gerd Möllmann
2024-12-24 21:18                               ` Pip Cet via Emacs development discussions.
2024-12-25  5:23                                 ` Gerd Möllmann
2024-12-25 10:48                                   ` Pip Cet via Emacs development discussions.
2024-12-25 13:40                                     ` Stefan Kangas
2024-12-25 17:03                                       ` Pip Cet via Emacs development discussions.
2024-12-26  5:22                                         ` Gerd Möllmann
2024-12-26  7:33                                           ` Eli Zaretskii
2024-12-26  8:02                                             ` Gerd Möllmann
2024-12-26 15:50                                             ` Stefan Kangas
2024-12-26 16:13                                               ` Eli Zaretskii
2024-12-26 19:40                                                 ` Gerd Möllmann
2024-12-26 17:01                                               ` Pip Cet via Emacs development discussions.
2024-12-26 19:45                                                 ` Gerd Möllmann
2024-12-26 20:05                                                   ` Eli Zaretskii
2024-12-26 20:12                                                     ` Gerd Möllmann
2024-12-26 16:12                                         ` Stefan Kangas
2024-12-26 17:05                                           ` Eli Zaretskii
2024-12-25 11:48                                   ` Helmut Eller
2024-12-25 11:58                                     ` Gerd Möllmann
2024-12-25 12:52                                     ` Eli Zaretskii
2024-12-25 12:31                                   ` Eli Zaretskii
2024-12-25 12:54                                     ` Gerd Möllmann
2024-12-24 12:11                     ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87bjwu2pb6.fsf@protonmail.com \
    --to=emacs-devel@gnu.org \
    --cc=acorallo@gnu.org \
    --cc=eliz@gnu.org \
    --cc=eller.helmut@gmail.com \
    --cc=gerd.moellmann@gmail.com \
    --cc=ofv@wanadoo.es \
    --cc=pipcet@protonmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).