Subject: Re: bug#79367: 31.0.50; magit-commit sometimes doesn't work if diff-hl-update-async is t

From: Eli Zaretskii <[email-masked]>
Date: Wed, 03 Sep 2025 17:53:17 +0300

> From: Zhengyi Fu <[email-masked]>
> Cc: [email-masked],  [email-masked],  [email-masked]
> Date: Wed, 03 Sep 2025 22:42:26 +0800
> 
> Eli Zaretskii <[email-masked]> writes:
> 
> > Zhengyi Fu, can you please apply it to the current master, and see if
> > it solves the original problem?
> 
> It does resolve my original problem.

Thanks for testing.

> But I think we need to call set_proc_thread when the server process
> is not locked as well.  Otherwise the `thread' member of the
> fd_callback_info may still be a dangling pointer.

Oh, you mean the below?  I agree, it is safer.

diff --git a/src/process.c b/src/process.c
index d6efac5..2cfff61 100644
--- a/src/process.c
+++ b/src/process.c
@@ -5078,6 +5078,10 @@ server_accept_connection (Lisp_Object server, int channel)
   fcntl (s, F_SETFL, O_NONBLOCK);
 
   p = XPROCESS (proc);
+  /* make_process calls pset_thread, but if the server process is not
+     locked to any thread, we need to undo what make_process did.  */
+  if (NILP (ps->thread))
+    pset_thread (p, Qnil);
 
   /* Build new contact information for this setup.  */
   contact = Fcopy_sequence (ps->childp);
@@ -5117,6 +5121,16 @@ server_accept_connection (Lisp_Object server, int channel)
     add_process_read_fd (s);
   if (s > max_desc)
     max_desc = s;
+  /* If the server process is locked to this thread, lock the client
+     process to the same thread, otherwise clear the thread of its I/O
+     descriptors.  */
+  if (NILP (ps->thread))
+    set_proc_thread (p, NULL);
+  else
+    {
+      eassert (XTHREAD (ps->thread) == current_thread);
+      set_proc_thread (p, XTHREAD (ps->thread));
+    }
 
   /* Setup coding system for new process based on server process.
      This seems to be the proper thing to do, as the coding system