Subject: bug#63865: 29.0.90; call-process while owning the X selection hangs other processes

From: Spencer Baugh <[email-masked]>
Date: Sat, 03 Jun 2023 07:10:41 -0400

Po Lu <[email-masked]> writes:

> Eli Zaretskii <[email-masked]> writes:
>
>>> From: Spencer Baugh <[email-masked]>
>>> Date: Fri, 02 Jun 2023 21:55:09 -0400
>>> 
>>> 
>>> 1. Under X11, with the GTK or Lucid toolkits:
>>>    emacs -Q
>>> 2. Become owner of the clipboard selection by killing some text; the
>>>    starting comments in the scratch buffer are a good candidate.
>>> 3. Immediately afterwards (i.e. without copy and pasting text in another
>>>    window), run:
>>>    (call-process "sleep" nil nil nil "inf")
>>> 4. Now other applications will hang when they attempt to paste text.
>>>    Google Chrome and Slack are two examples.  (GTK-based applications
>>>    seem to be fine.  So much for proprietary software...)
>>
>> Thanks.
>>
>> Does this happen also with the latest pretest, v29.0.91?
>
> I can't reproduce this, but the closest thing to Google Chrome on the
> computer I am currently using is Firefox 10.0.7.

BTW, this can also be reproduced using just Emacs.  If I try to paste in
another Emacs instead of in Google Chrome, I get a hang, followed by:

gui-get-selection: (error "Timed out waiting for reply from selection owner")

With -DTRACE_SELECTION on both Emacsen, the selection-owner Emacs prints
no logs, while the pasting Emacs prints the following log:

48866: Get selection UTF8_STRING, type _EMACS_TMP_
48866:   Start waiting 5 secs for SelectionNotify.
48866:     Waiting for 0 nsecs in addition.
48866:   Got event = NO
48866: Get selection TIMESTAMP, type _EMACS_TMP_
48866:   Start waiting 5 secs for SelectionNotify.
48866:     Waiting for 0 nsecs in addition.
48866:   Got event = NO

> So would you also build Emacs with -DTRACE_SELECTION, and show what is
> printed by Emacs when the requestor hangs?

Emacs prints nothing while stuck in call-process and the requestor
(Chrome) is hanging.  After I interrupt call-process, this log prints.

48290: x_handle_selection_event
48290: XGetAtomName --> NULL
48290: XGetAtomName --> text/plain;charset=utf-8
48290: x_handle_selection_request: selection=CLIPBOARD, target=text/plain;charset=utf-8
48290:  XInternAtom text/plain;charset=utf-8
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 70 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 70 elements directly to requestor window
48290: x_handle_selection_event
48290: x_handle_selection_request: selection=CLIPBOARD, target=TARGETS
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 92 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 23 elements directly to requestor window
48290: x_handle_selection_event
48290: x_handle_selection_request: selection=CLIPBOARD, target=TARGETS
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 92 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 23 elements directly to requestor window
48290: x_handle_selection_event
48290: x_handle_selection_request: selection=CLIPBOARD, target=UTF8_STRING
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 70 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 70 elements directly to requestor window
48290: x_handle_selection_event
48290: x_handle_selection_request: selection=CLIPBOARD, target=TARGETS
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 92 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 23 elements directly to requestor window
48290: x_handle_selection_event
48290: x_handle_selection_request: selection=CLIPBOARD, target=TARGETS
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 92 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 23 elements directly to requestor window
48290: x_handle_selection_event
48290: x_handle_selection_request: selection=CLIPBOARD, target=TARGETS
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 92 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 23 elements directly to requestor window
48290: x_handle_selection_event
48290: x_handle_selection_request: selection=CLIPBOARD, target=UTF8_STRING
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 70 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 70 elements directly to requestor window
48290: x_handle_selection_event
48290: x_handle_selection_request: selection=CLIPBOARD, target=TARGETS
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 92 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 23 elements directly to requestor window
48290: x_handle_selection_event
48290: x_handle_selection_request: selection=CLIPBOARD, target=TARGETS
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 92 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 23 elements directly to requestor window
48290: x_handle_selection_event
48290: x_handle_selection_request: selection=CLIPBOARD, target=TARGETS
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 92 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 23 elements directly to requestor window
48290: x_handle_selection_event
48290: x_handle_selection_request: selection=CLIPBOARD, target=UTF8_STRING
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 70 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 70 elements directly to requestor window
48290: x_handle_selection_event
48290: x_handle_selection_request: selection=CLIPBOARD, target=TARGETS
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 92 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 23 elements directly to requestor window
48290: x_handle_selection_event
48290: x_handle_selection_request: selection=CLIPBOARD, target=TARGETS
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 92 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 23 elements directly to requestor window
48290: x_handle_selection_event
48290: x_handle_selection_request: selection=CLIPBOARD, target=TARGETS
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 92 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 23 elements directly to requestor window
48290: x_handle_selection_event
48290: x_handle_selection_request: selection=CLIPBOARD, target=UTF8_STRING
48290:  x_start_selection_transfer: transferring to 0x1600000.  transfer consists of 70 bytes, quantum being 16777112
48290:  x_start_selection_transfer:  writing 70 elements directly to requestor window