Subject: bug#18403: 24.4.50; emacsclient sometimes hangs on exit with Lucid GUI client

From: Dmitry Antipov <[email-masked]>
Date: Mon, 08 Sep 2014 18:18:31 +0400

On 09/08/2014 05:44 PM, Paul Eggert wrote:

> I cannot reproduce this new problem on Ubuntu 14.04, configuring trunk bzr 117843 --with-x-toolkit=lucid.
> x_delete_terminal calls XtCloseDisplay, and then calls emacs_close (dpyinfo->connection), and
> the 'close' returns 0.
>
> Perhaps you configured with some other toolkit?  That might explain the discrepancy.

No, this is Lucid but with your revert patch applied.

> Does it fix things for you if you add a line 'dpyinfo->connection = -1;' after the existing line
>'dpyinfo->display = 0;' in xterm.c's x_connection_closed?  Though that might cause a file descriptor
> leak; I'm not fully following what's going on here, since I can't reproduce the new problem.

No, because x_connection_closed is not called.

There is another example of a debugging session, clearly showing double-close problem:

;; 1) Run ./src/emacs -Q --daemon
;; 2) Run ./lib-src/emacsclient -c
;; 3) Attach gdb -p to daemon process

(gdb) b close
Breakpoint 1 at 0x3290ce6c10: close. (4 locations)
(gdb) b x_connection_closed
Breakpoint 2 at 0x541d10: file ../../trunk/src/xterm.c, line 8425.
(gdb) b die
Breakpoint 3 at 0x5f6d05: file ../../trunk/src/alloc.c, line 7116.
(gdb) c
Continuing.

;; 4) C-x C-c in emacsclient frame

Breakpoint 1, close () at ../sysdeps/unix/syscall-template.S:81
81      T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
(gdb) n
close () at ../sysdeps/unix/syscall-template.S:82
82              ret
(gdb)
xcb_disconnect (c=0x13825e0) at xcb_conn.c:320
320         pthread_mutex_destroy(&c->iolock);
(gdb) p c->fd                                                      ;; X connection fd is 8
$1 = 8
(gdb) c
Continuing.

Breakpoint 1, close () at ../sysdeps/unix/syscall-template.S:81
81      T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
(gdb) n
83      T_PSEUDO_END (SYSCALL_SYMBOL)
(gdb)
posix_close (fd=8, flag=1) at ../../trunk/src/sysdep.c:2386        ;; We're closing X connection fd again
2386    }
(gdb) c

Continuing.
Breakpoint 3, die (msg=0x717274 "errno != EBADF || fd < 0", file=0x7170e0 "../../trunk/src/sysdep.c", line=2408)
     at ../../trunk/src/alloc.c:7116
7116      fprintf (stderr, "\r\n%s:%d: Emacs fatal error: assertion failed: %s\r\n",
(gdb) bt 6
#0  0x00000000005f6d05 in die (msg=0x717274 "errno != EBADF || fd < 0", file=0x7170e0 "../../trunk/src/sysdep.c", line=2408)
     at ../../trunk/src/alloc.c:7116
#1  0x0000000000598480 in emacs_close (fd=8) at ../../trunk/src/sysdep.c:2408         ;; This is it
#2  0x000000000054784b in x_delete_terminal (terminal=0xfa0218) at ../../trunk/src/xterm.c:11382
#3  0x000000000051f8b6 in Fdelete_terminal (terminal=..., force=...) at ../../trunk/src/terminal.c:348
#4  0x00000000004290ba in delete_frame (frame=..., force=...) at ../../trunk/src/frame.c:1691
#5  0x0000000000429630 in Fdelete_frame (frame=..., force=...) at ../../trunk/src/frame.c:1801

Dmitry