emacs-async icon indicating copy to clipboard operation
emacs-async copied to clipboard

Running make-thread and async-start Near Each Other Seems to Cause Error

Open 4tuw2tuv0 opened this issue 3 years ago • 1 comments
trafficstars

I was just playing around with a simple example and pretty consistently get this error with this particular setup.

I just tried:

(defun example ()
  ""

  (let ((thread (make-thread #'(lambda ()
                                 (message "First call!")))))
    (async-start (lambda ()
                   2)
                 (lambda (_result)
                   (message "Second call!!")))

    5))

Running this function causes the error error in process sentinel: Invalid read syntax: "#". I tried a few different variations (mostly just to try things, see if any different result occurred): using something like a number instead of message, in both places; removing the #' on the lambda; etc. Same result, pretty much all times.

Removing the the thread invocation or process start did restore no error, though; e.g.

(defun example ()
  ""

  (let ((thread t))
    (async-start (lambda ()
                   2)
                 (lambda (_result)
                   (message "Second call!!")))

    5))

and

(defun example ()
  ""

  (let ((thread (make-thread #'(lambda ()
                                 (message "First call!")))))
    5))

4tuw2tuv0 avatar Oct 02 '22 04:10 4tuw2tuv0

It's because the inner lambda will be converted to a closure and it will have the thread object in its scope. Since threads are not readable, it won't work.

You can quote the "worker" lambda to prevent it from being "closure-ified", but that might have other side effects.

This was fixed on Emacs 29, so it will work then. (unless you don't reference the thread variable from the worker lambda which you should not since it makes no sense as that thread won't be in the subprocess).

Fuco1 avatar Mar 13 '23 13:03 Fuco1