Subject: bug#25247: 26.0.50; Concurrency crashes with XLib

From: Elias Mårtenson <[email-masked]>
Date: Fri, 30 Dec 2016 18:30:05 +0800

On 30 December 2016 at 17:41, Eli Zaretskii <[email-masked]> wrote:

Elias, I'd be grateful if you could repeat your thread-related tests
> from 2 weeks ago with the latest master (both in "emacs -nw" and in a
> GUI session), and see if any of those problems are back.
>

I did some tests.

The C-g issue is still gone.

As for the concurrency issues. I have been hammering this thing pretty
hard, and no crashes so far.

However, I have seen some strange issues. I've been trying to isolate the
behaviour, but I don't have any more time to do so at the moment, so I'll
just summarise where I am:

*Issue 1:*
*========*

I open IELM in one window, and an empty buffer "z" in another, and type the
following:

(loop
  repeat 10
  do (make-thread (lambda ()
                    (let ((n (random 10)))
                      (with-current-buffer "z"
                        (sleep-for n)
                        (insert (format "Foo:%d\n" n)))))))

Here, I'd expect to see the "z" buffer being updated at the corresponding
times. I.e. the message "Foo:4" should be displayed after 4 seconds. This
is not what I see. Instead the messages appear in batches (i.e. several
rows appearing at the same time).

*Issue 2:*
*========*

The following seems to be a problem with lexically bound lambda functions
used in a thread. The following example illustrates the problem:

(let ((x "test"))
  (make-thread (lambda ()
                 (with-current-buffer "z"
                   (insert x)))))

I would expect this to insert "test" into the buffer, but instead nothing
happens. Removing the reference to the variable "x" in the lambda makes it
work.

Regards,
Elias