From: martin rudalics <rudalics@gmx.at>
To: Michael Welsh Duggan <mwd@md5i.com>
Cc: "schwab@linux-m68k.org" <schwab@linux-m68k.org>,
"47244@debbugs.gnu.org" <47244@debbugs.gnu.org>,
Michael Welsh Duggan <mwd@cert.org>
Subject: bug#47244: 28.0.50; SIGSEGV in long-runnning Emacs
Date: Thu, 8 Apr 2021 08:59:48 +0200 [thread overview]
Message-ID: <deca0a3f-6474-df41-a55c-a519576116c4@gmx.at> (raw)
In-Reply-To: <87r1jlvnrc.fsf@md5i.com>
[-- Attachment #1: Type: text/plain, Size: 575 bytes --]
> FWIW, I've been trying to do the same and have been similarly
> unsuccessful.
I attach a version where I make a shadow copy of Vwindow_list called
Vwindow_list_2. The two should behave the same just that Vwindow_list_2
is never accessed by other code. So we can put an assertion like
eassert (!NILP (Fequal (Vwindow_list, Vwindow_list_2)));
anywhere in the code. I put one in window_list and it should trigger
the same way as the length check before.
Now if anyone can suggest some strategic positions where to put these
assertions, I'll be all ears.
martin
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: selected_window_contents.diff --]
[-- Type: text/x-patch; name="selected_window_contents.diff", Size: 11404 bytes --]
diff --git a/src/buffer.c b/src/buffer.c
index 8e33162989..70b37e61a2 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1951,6 +1951,9 @@ DEFUN ("kill-buffer", Fkill_buffer, Skill_buffer, 0, 1, "bKill buffer: ",
This gets rid of them for certain. */
reset_buffer_local_variables (b, 1);
+ if (!b->base_buffer)
+ eassert (b->window_count == 0);
+
bset_name (b, Qnil);
block_input ();
@@ -1991,6 +1994,8 @@ DEFUN ("kill-buffer", Fkill_buffer, Skill_buffer, 0, 1, "bKill buffer: ",
run_buffer_list_update_hook (b);
+ eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents)));
+
return Qt;
}
\f
@@ -2151,6 +2156,9 @@ set_buffer_internal_1 (register struct buffer *b)
BUFFER_CHECK_INDIRECTION (b);
+ if (!BUFFER_LIVE_P (b))
+ error ("Selecting deleted buffer");
+
old_buf = current_buffer;
current_buffer = b;
last_known_column_point = -1; /* Invalidate indentation cache. */
diff --git a/src/nsfns.m b/src/nsfns.m
index 5c4cc915e7..82136b0639 100644
--- a/src/nsfns.m
+++ b/src/nsfns.m
@@ -1447,7 +1447,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side.
/* Make sure windows on this frame appear in calls to next-window
and similar functions. */
- Vwindow_list = Qnil;
+ Vwindow_list = Vwindow_list_2 = Qnil;
return unbind_to (count, frame);
}
diff --git a/src/w32fns.c b/src/w32fns.c
index 9db367bfaf..f2d5e34c3e 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -6148,7 +6148,7 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
/* Make sure windows on this frame appear in calls to next-window
and similar functions. */
- Vwindow_list = Qnil;
+ Vwindow_list = Vwindow_list_2 = Qnil;
return unbind_to (count, frame);
}
diff --git a/src/window.c b/src/window.c
index eb16e2a433..da0d2bc57d 100644
--- a/src/window.c
+++ b/src/window.c
@@ -86,6 +86,7 @@
Functions creating or deleting windows should invalidate this cache
by setting it to nil. */
Lisp_Object Vwindow_list;
+Lisp_Object Vwindow_list_2;
/* True mean window_change_record has to record all live frames. */
static bool window_change_record_frames;
@@ -307,7 +308,11 @@ wset_buffer (struct window *w, Lisp_Object val)
if (BUFFERP (val))
/* Make sure that we do not assign the buffer
to an internal window. */
- eassert (MARKERP (w->start) && MARKERP (w->pointm));
+ {
+ eassert (BUFFER_LIVE_P (XBUFFER (val)));
+ eassert (MARKERP (w->start) && MARKERP (w->pointm));
+ }
+
w->contents = val;
adjust_window_count (w, 1);
}
@@ -315,6 +320,7 @@ wset_buffer (struct window *w, Lisp_Object val)
static void
wset_old_buffer (struct window *w, Lisp_Object val)
{
+ eassert (BUFFER_LIVE_P (XBUFFER (val)));
w->old_buffer = val;
}
@@ -594,6 +600,8 @@ select_window_1 (Lisp_Object window, bool inhibit_point_swap)
selected_window = window;
+ eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents)));
+
/* Go to the point recorded in the window.
This is important when the buffer is in more
than one window. It also matters when
@@ -2569,7 +2577,11 @@ window_list (void)
arglist = Fnreverse (arglist);
Vwindow_list = nconc2 (Vwindow_list, arglist);
}
+
+ Vwindow_list_2 = Fcopy_sequence (Vwindow_list);
}
+ else
+ eassert (!NILP (Fequal (Vwindow_list, Vwindow_list_2)));
return Vwindow_list;
}
@@ -2950,6 +2962,8 @@ DEFUN ("window-list-1", Fwindow_list_1, Swindow_list_1, 0, 3, 0,
CHECK_ALL_WINDOWS /* Arg is ignored */
};
+static int replace_buffer_in_windows_safely_count;
+
static Lisp_Object
window_loop (enum window_loop type, Lisp_Object obj, bool mini,
Lisp_Object frames)
@@ -3048,6 +3062,8 @@ window_loop (enum window_loop type, Lisp_Object obj, bool mini,
if (EQ (window, selected_window)
&& XBUFFER (w->contents) == current_buffer)
Fset_buffer (w->contents);
+
+ replace_buffer_in_windows_safely_count += 1;
}
break;
@@ -3277,7 +3293,7 @@ DEFUN ("delete-other-windows-internal", Fdelete_other_windows_internal,
free_window_matrices (r);
fset_redisplay (f);
- Vwindow_list = Qnil;
+ Vwindow_list = Vwindow_list_2 = Qnil;
if (!WINDOW_LEAF_P (w))
{
@@ -3411,6 +3427,8 @@ DEFUN ("delete-other-windows-internal", Fdelete_other_windows_internal,
replace_buffer_in_windows (Lisp_Object buffer)
{
call1 (Qreplace_buffer_in_windows, buffer);
+
+ eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents)));
}
/* If BUFFER is shown in a window, safely replace it with some other
@@ -3419,7 +3437,28 @@ replace_buffer_in_windows (Lisp_Object buffer)
void
replace_buffer_in_windows_safely (Lisp_Object buffer)
{
- if (buffer_window_count (XBUFFER (buffer)))
+ if (!NILP (Fstring_equal (XBUFFER (buffer)->name_,
+ build_string ("*Server*"))))
+ {
+ int count = buffer_window_count (XBUFFER (buffer));
+
+ replace_buffer_in_windows_safely_count = 0;
+
+
+ if (buffer_window_count (XBUFFER (buffer)))
+ {
+ Lisp_Object tail, frame;
+
+ /* A single call to window_loop won't do the job because it only
+ considers frames on the current keyboard. So loop manually over
+ frames, and handle each one. */
+ FOR_EACH_FRAME (tail, frame)
+ window_loop (REPLACE_BUFFER_IN_WINDOWS_SAFELY, buffer, true, frame);
+ }
+
+ eassert (count == replace_buffer_in_windows_safely_count);
+ }
+ else if (buffer_window_count (XBUFFER (buffer)))
{
Lisp_Object tail, frame;
@@ -3960,6 +3999,8 @@ run_window_change_functions (void)
/* Record changes for all frames (if asked for), selected window and
frame. */
unbind_to (count, Qnil);
+
+ eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents)));
}
/* Make WINDOW display BUFFER. RUN_HOOKS_P means it's allowed
@@ -4054,6 +4095,9 @@ set_window_buffer (Lisp_Object window, Lisp_Object buffer,
if (!samebuf && !MINI_WINDOW_P (w) && !WINDOW_PSEUDO_P (w))
FRAME_WINDOW_CHANGE (XFRAME (w->frame)) = true;
+ if (WINDOWP (selected_window))
+ eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents)));
+
unbind_to (count, Qnil);
}
@@ -4296,7 +4340,7 @@ make_window (void)
w->scroll_bar_height = -1;
w->column_number_displayed = -1;
/* Reset window_list. */
- Vwindow_list = Qnil;
+ Vwindow_list = Vwindow_list_2 = Qnil;
/* Return window. */
XSETWINDOW (window, w);
return window;
@@ -5086,7 +5130,7 @@ DEFUN ("delete-window-internal", Fdelete_window_internal, Sdelete_window_interna
}
fset_redisplay (f);
- Vwindow_list = Qnil;
+ Vwindow_list = Vwindow_list_2 = Qnil;
wset_next (w, Qnil); /* Don't delete w->next too. */
free_window_matrices (w);
@@ -5174,6 +5218,8 @@ DEFUN ("delete-window-internal", Fdelete_window_internal, Sdelete_window_interna
error ("Deletion failed");
}
+ eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents)));
+
return Qnil;
}
\f
@@ -7233,6 +7279,9 @@ DEFUN ("set-window-configuration", Fset_window_configuration,
minibuf_selected_window = data->minibuf_selected_window;
SAFE_FREE ();
+
+ eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents)));
+
return FRAME_LIVE_P (f) ? Qt : Qnil;
}
@@ -7279,7 +7328,7 @@ delete_all_child_windows (Lisp_Object window)
wset_buffer (w, Qnil);
}
- Vwindow_list = Qnil;
+ Vwindow_list = Vwindow_list_2 = Qnil;
}
\f
static ptrdiff_t
@@ -8128,8 +8177,9 @@ init_window_once (void)
selected_window = Qnil;
staticpro (&selected_window);
- Vwindow_list = Qnil;
+ Vwindow_list = Vwindow_list_2 = Qnil;
staticpro (&Vwindow_list);
+ staticpro (&Vwindow_list_2);
minibuf_selected_window = Qnil;
staticpro (&minibuf_selected_window);
@@ -8148,6 +8198,7 @@ init_window_once (void)
PDUMPER_RESET_LV (minibuf_window, Qnil);
PDUMPER_RESET_LV (selected_window, Qnil);
PDUMPER_RESET_LV (Vwindow_list, Qnil);
+ PDUMPER_RESET_LV (Vwindow_list_2, Qnil);
PDUMPER_RESET_LV (minibuf_selected_window, Qnil);
/* Hack: if mode_line_in_non_selected_windows is true (which it may
@@ -8178,7 +8229,7 @@ init_window_once (void)
void
init_window (void)
{
- Vwindow_list = Qnil;
+ Vwindow_list = Vwindow_list_2 = Qnil;
}
void
diff --git a/src/window.h b/src/window.h
index b6f88e8f55..74d3cbb7be 100644
--- a/src/window.h
+++ b/src/window.h
@@ -1171,6 +1171,7 @@ #define CHECK_LIVE_WINDOW(WINDOW) \
/* These used to be in lisp.h. */
extern Lisp_Object Vwindow_list;
+extern Lisp_Object Vwindow_list_2;
extern Lisp_Object window_list (void);
extern Lisp_Object window_parameter (struct window *, Lisp_Object parameter);
diff --git a/src/xdisp.c b/src/xdisp.c
index cc0a689ba3..ea64e5037a 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -12980,6 +12980,8 @@ restore_selected_window (Lisp_Object window)
/* Abort if we cannot find a live frame. */
emacs_abort ();
}
+
+ eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents)));
}
/* Restore WINDOW, if live, as its frame's selected window. */
@@ -12997,6 +12999,8 @@ restore_frame_selected_window (Lisp_Object window)
if (EQ (frame, selected_frame))
selected_window = window;
}
+
+ eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents)));
}
/* Update the tab-bar item list for frame F. This has to be done
@@ -13074,6 +13078,8 @@ update_tab_bar (struct frame *f, bool save_match_data)
XSETFRAME (frame, f);
selected_frame = frame;
selected_window = FRAME_SELECTED_WINDOW (f);
+
+ eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents)));
#endif
/* Build desired tab-bar items from keymaps. */
@@ -14010,6 +14016,8 @@ update_tool_bar (struct frame *f, bool save_match_data)
selected_frame = frame;
selected_window = FRAME_SELECTED_WINDOW (f);
+ eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents)));
+
/* Build desired tool-bar items from keymaps. */
new_tool_bar
= tool_bar_items (Fcopy_sequence (f->tool_bar_items),
@@ -17246,6 +17254,8 @@ run_window_scroll_functions (Lisp_Object window, struct text_pos startp)
set_buffer_internal (XBUFFER (w->contents));
}
+ eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents)));
+
return startp;
}
@@ -25450,6 +25460,8 @@ display_mode_lines (struct window *w)
unbind_to (count, Qnil);
+ eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents)));
+
if (n > 0)
w->must_be_updated_p = true;
return n;
diff --git a/src/xfns.c b/src/xfns.c
index d90644819b..fbe9014555 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -4225,7 +4225,7 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
/* Make sure windows on this frame appear in calls to next-window
and similar functions. */
- Vwindow_list = Qnil;
+ Vwindow_list = Vwindow_list_2 = Qnil;
return unbind_to (count, frame);
}
next prev parent reply other threads:[~2021-04-08 6:59 UTC|newest]
Thread overview: 160+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-18 15:39 bug#47244: 28.0.50; SIGSEGV in long-runnning Emacs Michael Welsh Duggan
2021-03-18 15:42 ` Michael Welsh Duggan
2021-03-18 15:49 ` Michael Welsh Duggan
2021-03-18 16:02 ` Andreas Schwab
2021-03-18 16:02 ` Eli Zaretskii
2021-03-18 16:27 ` Michael Welsh Duggan
2021-03-18 16:45 ` Eli Zaretskii
2021-03-18 16:54 ` Michael Welsh Duggan
2021-03-18 18:41 ` Eli Zaretskii
2021-03-18 18:54 ` Michael Welsh Duggan
2021-03-18 19:16 ` Eli Zaretskii
2021-03-18 19:24 ` Michael Welsh Duggan
2021-03-18 19:51 ` Eli Zaretskii
2021-03-18 20:13 ` Andreas Schwab
2021-03-18 20:27 ` Eli Zaretskii
2021-03-19 1:50 ` Michael Welsh Duggan
2021-03-19 6:47 ` Eli Zaretskii
2021-03-19 13:37 ` Michael Welsh Duggan
2021-03-19 13:41 ` Michael Welsh Duggan
2021-03-19 13:51 ` Eli Zaretskii
2021-03-19 13:49 ` Eli Zaretskii
2021-03-19 14:18 ` Michael Welsh Duggan
2021-03-19 14:21 ` Michael Welsh Duggan
2021-03-19 15:00 ` Eli Zaretskii
2021-03-19 15:14 ` Michael Welsh Duggan
2021-03-23 14:18 ` Michael Welsh Duggan
2021-03-23 15:02 ` Eli Zaretskii
2021-03-23 15:08 ` Michael Welsh Duggan
2021-03-23 16:42 ` Eli Zaretskii
2021-03-23 15:23 ` martin rudalics
2021-03-23 15:53 ` Michael Welsh Duggan
2021-03-23 16:45 ` Eli Zaretskii
2021-03-24 6:53 ` martin rudalics
2021-03-24 14:14 ` Michael Welsh Duggan
2021-03-24 16:09 ` martin rudalics
2021-03-25 2:19 ` Michael Welsh Duggan
2021-03-25 6:25 ` Eli Zaretskii
2021-03-29 14:06 ` Michael Welsh Duggan
2021-03-29 14:28 ` Eli Zaretskii
2021-03-29 14:39 ` Michael Welsh Duggan
2021-03-29 15:02 ` Eli Zaretskii
2021-03-29 15:07 ` Eli Zaretskii
2021-03-29 15:21 ` Michael Welsh Duggan
2021-03-29 15:26 ` Michael Welsh Duggan
2021-03-29 15:27 ` Eli Zaretskii
2021-03-29 15:33 ` Michael Welsh Duggan
2021-03-29 15:34 ` Michael Welsh Duggan
2021-03-29 15:41 ` Eli Zaretskii
2021-03-29 16:23 ` Michael Welsh Duggan
2021-03-29 15:21 ` Eli Zaretskii
2021-03-29 16:05 ` martin rudalics
2021-03-29 16:26 ` Michael Welsh Duggan
2021-03-29 17:33 ` martin rudalics
2021-03-29 19:12 ` Michael Welsh Duggan
2021-03-30 7:30 ` martin rudalics
2021-03-30 13:39 ` Michael Welsh Duggan
2021-03-30 14:36 ` martin rudalics
2021-03-30 14:51 ` Michael Welsh Duggan
2021-03-30 15:05 ` martin rudalics
2021-03-30 14:13 ` Michael Welsh Duggan
2021-03-30 14:36 ` martin rudalics
2021-03-30 14:48 ` Eli Zaretskii
2021-03-30 15:05 ` martin rudalics
2021-03-30 15:13 ` Eli Zaretskii
2021-03-30 16:52 ` martin rudalics
2021-03-30 17:05 ` Eli Zaretskii
2021-03-31 6:41 ` martin rudalics
2021-03-31 7:09 ` Eli Zaretskii
2021-03-30 15:03 ` Michael Welsh Duggan
2021-03-30 16:52 ` martin rudalics
2021-03-31 13:23 ` Michael Welsh Duggan
2021-03-31 13:53 ` Michael Welsh Duggan
2021-03-31 14:01 ` Eli Zaretskii
2021-03-31 14:32 ` martin rudalics
2021-03-31 14:48 ` Michael Welsh Duggan
2021-03-31 15:49 ` martin rudalics
2021-03-31 17:01 ` Michael Welsh Duggan
2021-03-31 18:41 ` martin rudalics
2021-03-31 19:14 ` Michael Welsh Duggan
2021-03-31 19:18 ` Michael Welsh Duggan
2021-04-01 7:14 ` martin rudalics
2021-04-01 7:45 ` Eli Zaretskii
2021-04-01 13:20 ` Michael Welsh Duggan
2021-04-01 13:22 ` Eli Zaretskii
2021-04-01 13:54 ` Michael Welsh Duggan
2021-04-01 14:56 ` martin rudalics
2021-04-01 18:30 ` Michael Welsh Duggan
2021-04-01 19:31 ` Michael Welsh Duggan
2021-04-02 6:48 ` martin rudalics
2021-04-05 18:15 ` Michael Welsh Duggan
2021-04-05 18:45 ` martin rudalics
2021-04-05 19:57 ` Michael Welsh Duggan
2021-04-05 20:39 ` martin rudalics
2021-04-05 20:56 ` Michael Welsh Duggan
2021-04-06 8:10 ` martin rudalics
2021-04-06 14:40 ` Michael Welsh Duggan
2021-04-06 16:12 ` martin rudalics
2021-04-06 16:48 ` Michael Welsh Duggan
2021-04-06 17:00 ` martin rudalics
2021-04-06 17:24 ` Michael Welsh Duggan
2021-04-07 2:22 ` Michael Welsh Duggan
2021-04-07 7:52 ` Andreas Schwab
2021-04-07 9:00 ` martin rudalics
2021-04-07 12:42 ` Michael Welsh Duggan
2021-04-07 13:35 ` martin rudalics
2021-04-07 15:29 ` Michael Welsh Duggan
2021-04-07 16:16 ` martin rudalics
2021-04-07 17:37 ` Michael Welsh Duggan
2021-04-07 17:55 ` Michael Welsh Duggan
2021-04-07 18:31 ` Michael Welsh Duggan
2021-04-07 19:25 ` Michael Welsh Duggan
2021-04-07 20:25 ` martin rudalics
2021-04-07 20:32 ` Michael Welsh Duggan
2021-04-08 6:59 ` martin rudalics [this message]
2021-04-08 10:47 ` Gregory Heytings
2021-04-08 11:39 ` Eli Zaretskii
2021-04-08 12:06 ` Andreas Schwab
2021-04-08 12:29 ` Eli Zaretskii
2021-04-08 12:43 ` Gregory Heytings
2021-04-08 12:59 ` Eli Zaretskii
2021-04-08 16:20 ` Gregory Heytings
2021-04-08 12:03 ` martin rudalics
2021-04-08 12:24 ` Gregory Heytings
2021-04-08 13:39 ` Michael Welsh Duggan
2021-04-08 14:35 ` Michael Welsh Duggan
2021-04-08 15:08 ` Eli Zaretskii
2021-04-08 15:24 ` Andreas Schwab
2021-04-08 15:21 ` Michael Welsh Duggan
2021-04-08 15:33 ` Michael Welsh Duggan
2021-04-08 15:48 ` martin rudalics
2021-04-08 16:01 ` Michael Welsh Duggan
2021-04-08 16:14 ` martin rudalics
2021-04-08 16:35 ` Eli Zaretskii
2021-04-08 16:42 ` Michael Welsh Duggan
2021-04-08 15:58 ` Eli Zaretskii
2021-04-08 16:05 ` Michael Welsh Duggan
2021-04-08 16:28 ` Eli Zaretskii
2021-04-08 16:37 ` Michael Welsh Duggan
2021-04-08 16:49 ` Eli Zaretskii
2021-04-08 17:15 ` Michael Welsh Duggan
2021-04-08 17:11 ` Michael Welsh Duggan
2021-04-08 17:46 ` Eli Zaretskii
2021-04-08 17:51 ` Michael Welsh Duggan
2021-04-08 18:52 ` martin rudalics
2021-04-09 20:59 ` Michael Welsh Duggan
2021-04-10 7:15 ` martin rudalics
2021-04-10 14:53 ` Michael Welsh Duggan
2021-04-10 18:57 ` martin rudalics
2021-04-17 8:01 ` martin rudalics
2021-04-20 14:03 ` Michael Welsh Duggan
2021-04-07 19:40 ` Eli Zaretskii
2021-04-07 18:48 ` martin rudalics
2021-04-07 18:53 ` Michael Welsh Duggan
2021-04-07 20:25 ` martin rudalics
2021-04-07 9:00 ` martin rudalics
2021-03-19 8:15 ` martin rudalics
2021-03-19 8:19 ` Eli Zaretskii
2021-03-19 9:18 ` martin rudalics
2021-03-19 9:37 ` martin rudalics
2021-03-19 11:55 ` 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=deca0a3f-6474-df41-a55c-a519576116c4@gmx.at \
--to=rudalics@gmx.at \
--cc=47244@debbugs.gnu.org \
--cc=mwd@cert.org \
--cc=mwd@md5i.com \
--cc=schwab@linux-m68k.org \
/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).