Configuration Information [Automatically generated, do not change]: Machine: x86_64 OS: linux-gnu Compiler: gcc Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='x86_64' -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='x86_64-unknown-linux-gnu' -DCONF_VENDOR='unknown' -DLOCALEDIR='/usr/share/locale' -DPACKAGE='bash' -DSHELL -DHAVE_CONFIG_H -I. -I. -I./include -I./lib -march=x86-64 -mtune=generic -O2 -pipe -DDEFAULT_PATH_VALUE='/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin' -DSTANDARD_UTILS_PATH='/usr/bin:/bin:/usr/sbin:/sbin' -DSYS_BASHRC='/etc/bash.bashrc' -DSYS_BASH_LOGOUT='/etc/bash.bash_logout' uname output: Linux golem 2.6.37-ARCH #1 SMP PREEMPT Fri Feb 18 18:32:16 CET 2011 x86_64 AMD Phenom(tm) II X4 955 Processor AuthenticAMD GNU/Linux Machine Type: x86_64-unknown-linux-gnu
Bash Version: 4.2 Patch Level: 0 Release Status: release Description: When the size of an XTerminal is changed via a keybinding (either by issuing an escape sequence or by an external program that uses xlib) then sometimes bash will simply hang before redrawing the prompt, not responding to C-c anymore. I've used strace to verify that it's not the terminal but indeed bash that seems to hang, apparently in a futex(...FUTEX_WAIT...) call. Repeat-By: test script (test_resize.bash): ---snip--- dostuff () { for((i=0; i<1000; i++)) { echo "$i"; } } bind -x '"\ea": echo -ne "\e[8;12;80t"; dostuff' bind -x '"\es": echo -ne "\e[8;24;80t"; dostuff' bind -x '"\ew": xdotool windowsize --usehints $WINDOWID 80 12; dostuff' bind -x '"\eq": xdotool windowsize --usehints $WINDOWID 80 24; dostuff' toggle_size_fast () { while :; do echo -ne "\e[8;12;80t" echo -ne "\e[8;24;80t" done } ---snip--- $ strace -o strace.log bash --rcfile test_resize.bash When I use either M-a/M-s to toggle the size via escape sequences or M-q/M-w to toggle using xdotool the freeze will eventually occur after a few times. The dostuff() part makes it appear sooner, but it also happens without it (it is harder to trigger it in that case, though). This happens regardless of whether checkwinsize is set or not. When I run toogle_size_fast, I get a lot of interrupted system call messages, but the resizing happens alright, bash never hangs and C-c exits the function as usual. I've tested this in xterm, urxvt and lilyterm (vte-based), with both bash 4.2.0 and bash 4.1.9. This is the strace output of a hang triggered by M-q: read(0, "\33", 1) = 1 read(0, "q", 1) = 1 write(2, "\r\33[K", 4) = 4 rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0 pipe([3, 4]) = 0 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fec5c96c9d0) = 1255 setpgid(1255, 1255) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 close(3) = 0 close(4) = 0 ioctl(255, TIOCGPGRP, [1255]) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WSTOPPED|WCONTINUED, NULL) = 1255 rt_sigprocmask(SIG_BLOCK, [CHLD TSTP TTIN TTOU], [CHLD], 8) = 0 ioctl(255, TIOCSPGRP, [1065]) = 0 rt_sigprocmask(SIG_SETMASK, [CHLD], NULL, 8) = 0 ioctl(255, SNDCTL_TMR_TIMEBASE or TCGETS, {B4000000 opost isig -icanon -echo ...}) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 --- SIGCHLD (Child exited) @ 0 (0) --- wait4(-1, 0x7fffb9e736dc, WNOHANG|WSTOPPED|WCONTINUED, NULL) = -1 ECHILD (No child processes) rt_sigreturn(0xffffffffffffffff) = 0 rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 --- SIGWINCH (Window changed) @ 0 (0) --- ioctl(0, TIOCGWINSZ, {ws_row=24, ws_col=80, ws_xpixel=640, ws_ypixel=336}) = 0 mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x7fec537e7000 munmap(0x7fec537e7000, 8491008) = 0 munmap(0x7fec58000000, 58617856) = 0 mprotect(0x7fec54000000, 135168, PROT_READ|PROT_WRITE) = 0 futex(0x7fec5c0d8ea0, FUTEX_WAIT, 2, NULL) = ? ERESTARTSYS (To be restarted) --- SIGINT (Interrupt) @ 0 (0) --- rt_sigreturn(0x2) = -1 EINTR (Interrupted system call) futex(0x7fec5c0d8ea0, FUTEX_WAIT, 2, NULL