Subject: bug#69809: 30.0.50; flymake: error in process sentinel

From: Eshel Yaron <[email-masked]>
Date: Thu, 11 Jul 2024 11:45:46 +0200

Hi,

Gerd Möllmann <[email-masked]> writes:

> [email-masked] writes:
>
>>> From: Gerd Möllmann <[email-masked]>
>>> Date: Fri, 15 Mar 2024 08:09:40 +0100
>>>
>>> In master, I am sometimes getting errors like these:
>>>
>>>   error in process sentinel: flymake--handle-report: Can’t find state for flymake-cc in ‘flymake--state’
>>>   error in process sentinel: Can’t find state for flymake-cc in ‘flymake--state’
>>>   error in process sentinel: flymake--handle-report: Can’t find state for flymake-cc in ‘flymake--state’
>>>   error in process sentinel: Can’t find state for flymake-cc in ‘flymake--state’
>>>   error in process sentinel: flymake--handle-report: Can’t find state for flymake-cc in ‘flymake--state’
>>>   error in process sentinel: Can’t find state for flymake-cc in ‘flymake--state’
>>>
>>> when working with C files.
>>>
>>> I haven't configured anything for Flymake myself. I think Flymake gets
>>> involved by using Eglot. The errors apparently don't prevent flymake
>>> from working later on.
>>>
>>> I have looked around in flymake docs and source, but I can't figure out
>>> what's wrong.
>>
>> It would be helpful if you could provide a minimal reproduction starting
>> from "emacs -q".
>
> I know, but I can't reproduce it at will. And debug-on-error didn't help
> catch it in the act, maybe there is some condition-case involved
> somewhere that should have better been a condition-case-unless-debug.
>
>> My immediate suspicion is that flymake-mode is (somehow) enabled in your
>> C files while flymake-diagnostic-functions is set to contain flymake-cc,
>> which causes flymake-cc to start up a background process.  Then,
>> flymake-mode is enabled again by eglot--managed-mode, which causes
>> flymake--state to be cleared, so when flymake-cc tries to report
>> diagnostics from that background process through flymake--handle-report,
>> it fails.
>>
>> But I can't be sure whether this is due to a bug in Emacs or due to a
>> bug in your config without a more minimal reproduction.
>
> No config using flymake and none for eglot. The only thing I did is
> put eglot-ensure on c-mode-common-hook.
>
> Maybe I can catch it in LLDB somehow, but that will have to wait a bit,
> unfortunately.
>
> Anyway, thanks for the replay.

This issue bothered me as well.  Here's a recipe for reproducing on
master, with emacs -Q:

1. (add-hook 'c-mode-hook 'flymake-mode)
2. (add-hook 'c-mode-hook 'eglot-ensure)
3. Find some C file

This happens because Eglot _restarts_ flymake-mode while flymake-cc's
process is already running.  Here's a simple fix:

diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el
index a893a8d749a..c9e1bb7b52d 100644
--- a/lisp/progmodes/eglot.el
+++ b/lisp/progmodes/eglot.el
@@ -2040,7 +2040,7 @@ eglot--managed-mode
     (unless (eglot--stay-out-of-p 'imenu)
       (add-function :before-until (local 'imenu-create-index-function)
                     #'eglot-imenu))
-    (unless (eglot--stay-out-of-p 'flymake) (flymake-mode 1))
+    (unless (or (eglot--stay-out-of-p 'flymake) flymake-mode) (flymake-mode 1))
     (unless (eglot--stay-out-of-p 'eldoc)
       (add-hook 'eldoc-documentation-functions #'eglot-hover-eldoc-function
                 nil t)