* 23.0.60; Occasional hangs in flyspell-mode and ispell-word
@ 2008-03-27 5:20 Markus Triska
2008-03-27 21:04 ` Stefan Monnier
[not found] ` <handler.84.B.120662569622724.ack@emacsbugs.donarmstrong.com>
0 siblings, 2 replies; 11+ messages in thread
From: Markus Triska @ 2008-03-27 5:20 UTC (permalink / raw)
To: emacs-pretest-bug
In connection with flyspell-mode and ispell-word, sometimes Emacs
hangs indefinitely and cannot be interrupted with C-g. When running
Emacs inside gdb and doing a backtrace when it hangs, I get:
(gdb) backtrace
#0 wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4471
#1 0x00183f22 in Faccept_process_output (process=38394228, seconds=50332681, millisec=50332681, just_this_one=50332681) at process.c:3948
#2 0x00149784 in Ffuncall (nargs=4, args=0xbfffef20) at eval.c:3035
#3 0x001797cb in Fbyte_code (bytestr=89564547, vector=38604804, maxdepth=4) at bytecode.c:679
#4 0x00149067 in funcall_lambda (fun=38387252, nargs=0, arg_vector=0xbffff0a4) at eval.c:3212
#5 0x0014954a in Ffuncall (nargs=1, args=0xbffff0a0) at eval.c:3082
#6 0x001797cb in Fbyte_code (bytestr=89549107, vector=34149860, maxdepth=8) at bytecode.c:679
#7 0x00149067 in funcall_lambda (fun=38350484, nargs=4, arg_vector=0xbffff234) at eval.c:3212
#8 0x0014954a in Ffuncall (nargs=5, args=0xbffff230) at eval.c:3082
#9 0x0014acfa in Fapply (nargs=2, args=0xbffff2d0) at eval.c:2513
#10 0x0014ae55 in apply1 (fn=58539929, arg=46150237) at eval.c:2777
#11 0x00145254 in Fcall_interactively (function=58539929, record_flag=50332681, keys=59777148) at callint.c:386
#12 0x0014975d in Ffuncall (nargs=4, args=0xbffff4b0) at eval.c:3031
#13 0x001498f9 in call3 (fn=50443721, arg1=58539929, arg2=50332681, arg3=50332681) at eval.c:2855
#14 0x000e68fd in command_loop_1 () at keyboard.c:1908
#15 0x001478db in internal_condition_case (bfun=0xe64a6 <command_loop_1>, handlers=50372249, hfun=0xdf35a <cmd_error>) at eval.c:1494
#16 0x000d8388 in command_loop_2 () at keyboard.c:1370
#17 0x0014752d in internal_catch (tag=50368345, func=0xd8344 <command_loop_2>, arg=50332681) at eval.c:1230
#18 0x000d812a in command_loop () at keyboard.c:1349
#19 0x000d81e3 in recursive_edit_1 () at keyboard.c:958
#20 0x000d832b in Frecursive_edit () at keyboard.c:1020
#21 0x000d7369 in main (argc=1, argv=0xbffff92c) at emacs.c:1784
Lisp Backtrace:
"accept-process-output" (0xbfffef24)
"ispell-accept-output" (0xbffff0a4)
"ispell-word" (0xbffff234)
"call-interactively" (0xbffff4b4)
Here is a more verbose session, single-stepping after Emacs hangs. At
various points, I tried "C-g" in Emacs, and after some tries the input
seems to be detected at last. When Emacs isn't run inside gdb and
begins to hang, I've never managed to unblock it. It simply consumes a
lot of CPU and is completely unresponsive then.
mt-computer:~/emacs/src mt$ gdb ./emacs
GNU gdb 6.3.50-20050815 (Apple version gdb-573) (Fri Oct 20 15:50:43 GMT 2006)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-apple-darwin"...Reading symbols for shared libraries ................................. done
DISPLAY = :0.0
TERM = xterm-color
Breakpoint 1 at 0x9010d3db
Breakpoint 2 at 0xf129e: file sysdep.c, line 1317.
(gdb) r
Starting program: /Users/mt/emacs/src/emacs
Reading symbols for shared libraries ....................................................................+++..+.++.+..+....+++.++++++++++.+++++ done
Reading symbols for shared libraries . done
^Z
Program received signal SIGTSTP, Stopped (user).
0x9000ffee in read ()
(gdb) c
Continuing.
^Z
Program received signal SIGTSTP, Stopped (user).
0x9000ffe0 in read ()
(gdb)
Single stepping until exit from function read,
which has no line number information.
0x901100f0 in _sysenter_trap ()
(gdb)
Single stepping until exit from function _sysenter_trap,
which has no line number information.
0x9000ffee in read ()
(gdb)
Single stepping until exit from function read,
which has no line number information.
0x90110760 in cerror ()
(gdb)
Single stepping until exit from function cerror,
which has no line number information.
0x90001715 in cthread_set_errno_self ()
(gdb)
Single stepping until exit from function cthread_set_errno_self,
which has no line number information.
0x9016a970 in __i686.get_pc_thunk.bx ()
(gdb)
Single stepping until exit from function __i686.get_pc_thunk.bx,
which has no line number information.
0x90001723 in cthread_set_errno_self ()
(gdb)
Single stepping until exit from function cthread_set_errno_self,
which has no line number information.
0x9011078b in cerror ()
(gdb)
Single ping until exit from function cerror,
which has no line number information.
emacs_read (fildes=0, buf=0xbfffdab0 "\350\224|\003\030", nbyte=4096) at sysdep.c:3372
3372 }
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:5032
5032 if (nbytes > 0 && p->adaptive_read_buffering)
(gdb)
5071 p->decoding_carryover = 0;
(gdb)
5075 if (nbytes <= 0)
(gdb)
5077 if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK)
(gdb)
5321 }
(gdb)
wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4468
4468 if (nread == 0)
(gdb)
4471 if (0 < nread)
(gdb)
4474 else if (nread == -1 && EIO == errno)
(gdb)
4478 else if (nread == -1 && EAGAIN == errno)
(gdb)
4482 else if (nread == -1 && EWOULDBLOCK == errno)
(gdb)
4464 while (wait_proc->infd >= 0)
(gdb)
4466 nread = read_process_output (proc, wait_proc->infd);
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:4975
4975 register struct buffer *old = current_buffer;
(gdb)
4976 register struct Lisp_Process *p = XPROCESS (proc);
(gdb)
4978 struct coding_system *coding = proc_decode_coding_system[channel];
(gdb)
4979 int carryover = p->decoding_carryover;
(gdb)
5013 chars = (char *) alloca (carryover + readmax);
(gdb)
5014 if (carryover)
(gdb)
5020 if (DATAGRAM_CHAN_P (channel))
(gdb)
5028 if (proc_buffered_char[channel] < 0)
(gdb)
5030 nbytes = emacs_read (channel, chars + carryover, readmax);
(gdb)
emacs_read (fildes=0, buf=0xbfffdab0 "\350\224|\003\030", nbyte=4096) at sysdep.c:3368
3368 while ((rtnval = read (fildes, buf, nbyte)) == -1
(gdb)
3372 }
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:5032
5032 if (nbytes > 0 && p->adaptive_read_buffering)
(gdb)
5071 p->decoding_carryover = 0;
(gdb)
5075 if (nbytes <= 0)
(gdb)
5077 if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK)
(gdb)
5321 }
(gdb)
wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4468
4468 if (nread == 0)
(gdb)
4471 if (0 < nread)
(gdb)
4474 else if (nread == -1 && EIO == errno)
(gdb)
4478 else if (nread == -1 && EAGAIN == errno)
(gdb)
4482 else if (nread == -1 && EWOULDBLOCK == errno)
(gdb)
4464 while (wait_proc->infd >= 0)
(gdb)
4466 nread = read_process_output (proc, wait_proc->infd);
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:4975
4975 register struct buffer *old = current_buffer;
(gdb)
4976 register struct Lisp_Process *p = XPROCESS (proc);
(gdb)
4978 struct coding_system *coding = proc_decode_coding_system[channel];
(gdb)
4979 int carryover = p->decoding_carryover;
(gdb)
5013 chars = (char *) alloca (carryover + readmax);
(gdb)
5014 if (carryover)
(gdb)
5020 if (DATAGRAM_CHAN_P (channel))
(gdb)
5028 if (proc_buffered_char[channel] < 0)
(gdb)
5030 nbytes = emacs_read (channel, chars + carryover, readmax);
(gdb)
emacs_read (fildes=0, buf=0xbfffdab0 "\350\224|\003\030", nbyte=4096) at sysdep.c:3368
3368 while ((rtnval = read (fildes, buf, nbyte)) == -1
(gdb)
3372 }
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:5032
5032 if (nbytes > 0 && p->adaptive_read_buffering)
(gdb)
5071 p->decoding_carryover = 0;
(gdb)
5075 if (nbytes <= 0)
(gdb)
5077 if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK)
(gdb)
5321 }
(gdb)
wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4468
4468 if (nread == 0)
(gdb)
4471 if (0 < nread)
(gdb)
4474 else if (nread == -1 && EIO == errno)
(gdb)
4478 else if (nread == -1 && EAGAIN == errno)
(gdb)
4482 else if (nread == -1 && EWOULDBLOCK == errno)
(gdb)
4464 while (wait_proc->infd >= 0)
(gdb)
4466 nread = read_process_output (proc, wait_proc->infd);
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:4975
4975 register struct buffer *old = current_buffer;
(gdb)
4976 register struct Lisp_Process *p = XPROCESS (proc);
(gdb)
4978 struct coding_system *coding = proc_decode_coding_system[channel];
(gdb)
4979 int carryover = p->decoding_carryover;
(gdb)
5013 chars = (char *) alloca (carryover + readmax);
(gdb)
5014 if (carryover)
(gdb)
5020 if (DATAGRAM_CHAN_P (channel))
(gdb)
5028 if (proc_buffered_char[channel] < 0)
(gdb)
5030 nbytes = emacs_read (channel, chars + carryover, readmax);
(gdb)
emacs_read (fildes=0, buf=0xbfffdab0 "\350\224|\003\030", nbyte=4096) at sysdep.c:3368
3368 while ((rtnval = read (fildes, buf, nbyte)) == -1
(gdb)
3372 }
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:5032
5032 if (nbytes > 0 && p->adaptive_read_buffering)
(gdb)
5071 p->decoding_carryover = 0;
(gdb)
5075 if (nbytes <= 0)
(gdb)
5077 if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK)
(gdb)
5321 }
(gdb)
wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4468
4468 if (nread == 0)
(gdb)
4471 if (0 < nread)
(gdb)
4474 else if (nread == -1 && EIO == errno)
(gdb)
4478 else if (nread == -1 && EAGAIN == errno)
(gdb)
4482 else if (nread == -1 && EWOULDBLOCK == errno)
(gdb)
4464 while (wait_proc->infd >= 0)
(gdb)
4466 nread = read_process_output (proc, wait_proc->infd);
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:4975
4975 register struct buffer *old = current_buffer;
(gdb)
4976 register struct Lisp_Process *p = XPROCESS (proc);
(gdb)
4978 struct coding_system *coding = proc_decode_coding_system[channel];
(gdb)
4979 int carryover = p->decoding_carryover;
(gdb)
5013 chars = (char *) alloca (carryover + readmax);
(gdb)
5014 if (carryover)
(gdb)
5020 if (DATAGRAM_CHAN_P (channel))
(gdb)
5028 if (proc_buffered_char[channel] < 0)
(gdb)
5030 nbytes = emacs_read (channel, chars + carryover, readmax);
(gdb)
emacs_read (fildes=0, buf=0xbfffdab0 "\350\224|\003\030", nbyte=4096) at sysdep.c:3368
3368 while ((rtnval = read (fildes, buf, nbyte)) == -1
(gdb)
3372 }
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:5032
5032 if (nbytes > 0 && p->adaptive_read_buffering)
(gdb)
5071 p->decoding_carryover = 0;
(gdb)
5075 if (nbytes <= 0)
(gdb)
5077 if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK)
(gdb)
5321 }
(gdb)
wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4468
4468 if (nread == 0)
(gdb)
4471 if (0 < nread)
(gdb)
4474 else if (nread == -1 && EIO == errno)
(gdb)
4478 else if (nread == -1 && EAGAIN == errno)
(gdb)
4482 else if (nread == -1 && EWOULDBLOCK == errno)
(gdb)
4464 while (wait_proc->infd >= 0)
(gdb)
4466 nread = read_process_output (proc, wait_proc->infd);
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:4975
4975 register struct buffer *old = current_buffer;
(gdb)
4976 register struct Lisp_Process *p = XPROCESS (proc);
(gdb)
4978 struct coding_system *coding = proc_decode_coding_system[channel];
(gdb)
4979 int carryover = p->decoding_carryover;
(gdb)
5013 chars = (char *) alloca (carryover + readmax);
(gdb)
5014 if (carryover)
(gdb)
5020 if (DATAGRAM_CHAN_P (channel))
(gdb)
5028 if (proc_buffered_char[channel] < 0)
(gdb)
5030 nbytes = emacs_read (channel, chars + carryover, readmax);
(gdb)
emacs_read (fildes=0, buf=0xbfffdab0 "\350\224|\003\030", nbyte=4096) at sysdep.c:3368
3368 while ((rtnval = read (fildes, buf, nbyte)) == -1
(gdb)
3372 }
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:5032
5032 if (nbytes > 0 && p->adaptive_read_buffering)
(gdb)
5071 p->decoding_carryover = 0;
(gdb)
5075 if (nbytes <= 0)
(gdb)
5077 if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK)
(gdb)
5321 }
(gdb)
wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4468
4468 if (nread == 0)
(gdb)
4471 if (0 < nread)
(gdb)
4474 else if (nread == -1 && EIO == errno)
(gdb)
4478 else if (nread == -1 && EAGAIN == errno)
(gdb)
4482 else if (nread == -1 && EWOULDBLOCK == errno)
(gdb)
4464 while (wait_proc->infd >= 0)
(gdb)
4466 nread = read_process_output (proc, wait_proc->infd);
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:4975
4975 register struct buffer *old = current_buffer;
(gdb)
4976 register struct Lisp_Process *p = XPROCESS (proc);
(gdb)
4978 struct coding_system *coding = proc_decode_coding_system[channel];
(gdb)
4979 int carryover = p->decoding_carryover;
(gdb)
5013 chars = (char *) alloca (carryover + readmax);
(gdb)
5014 if (carryover)
(gdb)
5020 if (DATAGRAM_CHAN_P (channel))
(gdb)
5028 if (proc_buffered_char[channel] < 0)
(gdb)
5030 nbytes = emacs_read (channel, chars + carryover, readmax);
(gdb)
emacs_read (fildes=0, buf=0xbfffdab0 "\350\224|\003\030", nbyte=4096) at sysdep.c:3368
3368 while ((rtnval = read (fildes, buf, nbyte)) == -1
(gdb)
3372 }
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:5032
5032 if (nbytes > 0 && p->adaptive_read_buffering)
(gdb)
5071 p->decoding_carryover = 0;
(gdb)
5075 if (nbytes <= 0)
(gdb)
5077 if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK)
(gdb)
5321 }
(gdb)
wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4468
4468 if (nread == 0)
(gdb)
4471 if (0 < nread)
(gdb)
4474 else if (nread == -1 && EIO == errno)
(gdb)
4478 else if (nread == -1 && EAGAIN == errno)
(gdb)
4482 else if (nread == -1 && EWOULDBLOCK == errno)
(gdb)
4464 while (wait_proc->infd >= 0)
(gdb)
4466 nread = read_process_output (proc, wait_proc->infd);
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:4975
4975 register struct buffer *old = current_buffer;
(gdb)
4976 register struct Lisp_Process *p = XPROCESS (proc);
(gdb)
4978 struct coding_system *coding = proc_decode_coding_system[channel];
(gdb)
4979 int carryover = p->decoding_carryover;
(gdb)
5013 chars = (char *) alloca (carryover + readmax);
(gdb)
5014 if (carryover)
(gdb)
5020 if (DATAGRAM_CHAN_P (channel))
(gdb)
5028 if (proc_buffered_char[channel] < 0)
(gdb)
5030 nbytes = emacs_read (channel, chars + carryover, readmax);
(gdb)
emacs_read (fildes=0, buf=0xbfffdab0 "\350\224|\003\030", nbyte=4096) at sysdep.c:3368
3368 while ((rtnval = read (fildes, buf, nbyte)) == -1
(gdb)
3372 }
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:5032
5032 if (nbytes > 0 && p->adaptive_read_buffering)
(gdb)
5071 p->decoding_carryover = 0;
(gdb)
5075 if (nbytes <= 0)
(gdb)
5077 if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK)
(gdb)
5321 }
(gdb)
wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4468
4468 if (nread == 0)
(gdb)
4471 if (0 < nread)
(gdb)
4474 else if (nread == -1 && EIO == errno)
(gdb)
4478 else if (nread == -1 && EAGAIN == errno)
(gdb)
4482 else if (nread == -1 && EWOULDBLOCK == errno)
(gdb)
4464 while (wait_proc->infd >= 0)
(gdb)
4466 nread = read_process_output (proc, wait_proc->infd);
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:4975
4975 register struct buffer *old = current_buffer;
(gdb)
4976 register struct Lisp_Process *p = XPROCESS (proc);
(gdb)
4978 struct coding_system *coding = proc_decode_coding_system[channel];
(gdb)
4979 int carryover = p->decoding_carryover;
(gdb)
5013 chars = (char *) alloca (carryover + readmax);
(gdb)
5014 if (carryover)
(gdb)
5020 if (DATAGRAM_CHAN_P (channel))
(gdb)
5028 if (proc_buffered_char[channel] < 0)
(gdb)
5030 nbytes = emacs_read (channel, chars + carryover, readmax);
(gdb)
emacs_read (fildes=0, buf=0xbfffdab0 "\350\224|\003\030", nbyte=4096) at sysdep.c:3368
3368 while ((rtnval = read (fildes, buf, nbyte)) == -1
(gdb)
3372 }
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:5032
5032 if (nbytes > 0 && p->adaptive_read_buffering)
(gdb)
5071 p->decoding_carryover = 0;
(gdb)
5075 if (nbytes <= 0)
(gdb)
5077 if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK)
(gdb)
5321 }
(gdb)
wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4468
4468 if (nread == 0)
(gdb)
4471 if (0 < nread)
(gdb)
4474 else if (nread == -1 && EIO == errno)
(gdb)
4478 else if (nread == -1 && EAGAIN == errno)
(gdb)
4482 else if (nread == -1 && EWOULDBLOCK == errno)
(gdb)
4464 while (wait_proc->infd >= 0)
(gdb)
4466 nread = read_process_output (proc, wait_proc->infd);
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:4975
4975 register struct buffer *old = current_buffer;
(gdb)
4976 register struct Lisp_Process *p = XPROCESS (proc);
(gdb)
4978 struct coding_system *coding = proc_decode_coding_system[channel];
(gdb)
4979 int carryover = p->decoding_carryover;
(gdb)
5013 chars = (char *) alloca (carryover + readmax);
(gdb)
5014 if (carryover)
(gdb)
5020 if (DATAGRAM_CHAN_P (channel))
(gdb)
5028 if (proc_buffered_char[channel] < 0)
(gdb)
5030 nbytes = emacs_read (channel, chars + carryover, readmax);
(gdb)
emacs_read (fildes=0, buf=0xbfffdab0 "\350\224|\003\030", nbyte=4096) at sysdep.c:3368
3368 while ((rtnval = read (fildes, buf, nbyte)) == -1
(gdb)
3372 }
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:5032
5032 if (nbytes > 0 && p->adaptive_read_buffering)
(gdb)
5071 p->decoding_carryover = 0;
(gdb)
5075 if (nbytes <= 0)
(gdb)
5077 if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK)
(gdb)
5321 }
(gdb)
wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4468
4468 if (nread == 0)
(gdb)
4471 if (0 < nread)
(gdb)
4474 else if (nread == -1 && EIO == errno)
(gdb)
4478 else if (nread == -1 && EAGAIN == errno)
(gdb)
4482 else if (nread == -1 && EWOULDBLOCK == errno)
(gdb)
4464 while (wait_proc->infd >= 0)
(gdb)
4466 nread = read_process_output (proc, wait_proc->infd);
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:4975
4975 register struct buffer *old = current_buffer;
(gdb)
4976 register struct Lisp_Process *p = XPROCESS (proc);
(gdb)
4978 struct coding_system *coding = proc_decode_coding_system[channel];
(gdb)
4979 int carryover = p->decoding_carryover;
(gdb)
5013 chars = (char *) alloca (carryover + readmax);
(gdb)
5014 if (carryover)
(gdb)
5020 if (DATAGRAM_CHAN_P (channel))
(gdb)
5028 if (proc_buffered_char[channel] < 0)
(gdb)
5030 nbytes = emacs_read (channel, chars + carryover, readmax);
(gdb)
emacs_read (fildes=0, buf=0xbfffdab0 "\350\224|\003\030", nbyte=4096) at sysdep.c:3368
3368 while ((rtnval = read (fildes, buf, nbyte)) == -1
(gdb)
3372 }
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:5032
5032 if (nbytes > 0 && p->adaptive_read_buffering)
(gdb)
5071 p->decoding_carryover = 0;
(gdb)
5075 if (nbytes <= 0)
(gdb)
5077 if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK)
(gdb)
5321 }
(gdb)
wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4468
4468 if (nread == 0)
(gdb)
4471 if (0 < nread)
(gdb)
4474 else if (nread == -1 && EIO == errno)
(gdb)
4478 else if (nread == -1 && EAGAIN == errno)
(gdb)
4482 else if (nread == -1 && EWOULDBLOCK == errno)
(gdb)
4464 while (wait_proc->infd >= 0)
(gdb)
4466 nread = read_process_output (proc, wait_proc->infd);
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:4975
4975 register struct buffer *old = current_buffer;
(gdb)
4976 register struct Lisp_Process *p = XPROCESS (proc);
(gdb)
4978 struct coding_system *coding = proc_decode_coding_system[channel];
(gdb)
4979 int carryover = p->decoding_carryover;
(gdb)
5013 chars = (char *) alloca (carryover + readmax);
(gdb)
5014 if (carryover)
(gdb)
5020 if (DATAGRAM_CHAN_P (channel))
(gdb)
5028 if (proc_buffered_char[channel] < 0)
(gdb)
5030 nbytes = emacs_read (channel, chars + carryover, readmax);
(gdb)
emacs_read (fildes=0, buf=0xbfffdab0 "\350\224|\003\030", nbyte=4096) at sysdep.c:3368
3368 while ((rtnval = read (fildes, buf, nbyte)) == -1
(gdb)
3372 }
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:5032
5032 if (nbytes > 0 && p->adaptive_read_buffering)
(gdb)
5071 p->decoding_carryover = 0;
(gdb)
5075 if (nbytes <= 0)
(gdb)
5077 if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK)
(gdb)
5321 }
(gdb)
wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4468
4468 if (nread == 0)
(gdb)
4471 if (0 < nread)
(gdb)
4474 else if (nread == -1 && EIO == errno)
(gdb)
4478 else if (nread == -1 && EAGAIN == errno)
(gdb)
4482 else if (nread == -1 && EWOULDBLOCK == errno)
(gdb)
4464 while (wait_proc->infd >= 0)
(gdb)
4466 nread = read_process_output (proc, wait_proc->infd);
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:4975
4975 register struct buffer *old = current_buffer;
(gdb)
4976 register struct Lisp_Process *p = XPROCESS (proc);
(gdb)
4978 struct coding_system *coding = proc_decode_coding_system[channel];
(gdb)
4979 int carryover = p->decoding_carryover;
(gdb)
5013 chars = (char *) alloca (carryover + readmax);
(gdb)
5014 if (carryover)
(gdb)
5020 if (DATAGRAM_CHAN_P (channel))
(gdb)
5028 if (proc_buffered_char[channel] < 0)
(gdb)
5030 nbytes = emacs_read (channel, chars + carryover, readmax);
(gdb)
emacs_read (fildes=0, buf=0xbfffdab0 "\350\224|\003\030", nbyte=4096) at sysdep.c:3368
3368 while ((rtnval = read (fildes, buf, nbyte)) == -1
(gdb)
3372 }
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:5032
5032 if (nbytes > 0 && p->adaptive_read_buffering)
(gdb)
5071 p->decoding_carryover = 0;
(gdb)
5075 if (nbytes <= 0)
(gdb)
5077 if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK)
(gdb)
5321 }
(gdb)
wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4468
4468 if (nread == 0)
(gdb)
4471 if (0 < nread)
(gdb)
4474 else if (nread == -1 && EIO == errno)
(gdb)
4478 else if (nread == -1 && EAGAIN == errno)
(gdb)
4482 else if (nread == -1 && EWOULDBLOCK == errno)
(gdb)
4464 while (wait_proc->infd >= 0)
(gdb)
4466 nread = read_process_output (proc, wait_proc->infd);
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:4975
4975 register struct buffer *old = current_buffer;
(gdb)
4976 register struct Lisp_Process *p = XPROCESS (proc);
(gdb)
4978 struct coding_system *coding = proc_decode_coding_system[channel];
(gdb)
4979 int carryover = p->decoding_carryover;
(gdb)
5013 chars = (char *) alloca (carryover + readmax);
(gdb)
5014 if (carryover)
(gdb)
5020 if (DATAGRAM_CHAN_P (channel))
(gdb)
5028 if (proc_buffered_char[channel] < 0)
(gdb)
5030 nbytes = emacs_read (channel, chars + carryover, readmax);
(gdb)
emacs_read (fildes=0, buf=0xbfffdab0 "\350\224|\003\030", nbyte=4096) at sysdep.c:3368
3368 while ((rtnval = read (fildes, buf, nbyte)) == -1
(gdb)
3372 }
(gdb)
read_process_output (proc=38394228, channel=0) at process.c:5032
5032 if (nbytes > 0 && p->adaptive_read_buffering)
(gdb)
5071 p->decoding_carryover = 0;
(gdb)
5075 if (nbytes <= 0)
(gdb)
5077 if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK)
(gdb)
5321 }
(gdb)
wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4468
4468 if (nread == 0)
(gdb) c
Continuing.
^Z
Program received signal SIGTSTP, Stopped (user).
wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=50332681, wait_proc=0x249d970, just_wait_proc=0) at process.c:4471
4471 if (0 < nread)
(gdb)
4474 else if (nread == -1 && EIO == errno)
(gdb)
4478 else if (nread == -1 && EAGAIN == errno)
(gdb) p nread
$1 = -1610559420
(gdb) pr
^Z
Program received signal SIGTSTP, Stopped (user).
0x9001a1cc in select ()
The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on"
Evaluation of the expression containing the function (debug_print) will be abandoned.
(gdb)
Single stepping until exit from function select,
which has no line number information.
0x90110760 in cerror ()
(gdb)
Single stepping until exit from function cerror,
which has no line number information.
0x90001715 in cthread_set_errno_self ()
(gdb)
Single stepping until exit from function cthread_set_errno_self,
which has no line number information.
0x9016a970 in __i686.get_pc_thunk.bx ()
(gdb)
Single stepping until exit from function __i686.get_pc_thunk.bx,
which has no line number information.
0x90001723 in cthread_set_errno_self ()
(gdb)
Single stepping until exit from function cthread_set_errno_self,
which has no line number information.
0x9011078b in cerror ()
(gdb)
Single stepping until exit from function cerror,
which has no line number information.
select_wrapper (n=-1, rfd=0xffffffff, wfd=0x90001778, xfd=0x0, tmo=0xbffff098) at process.c:4207
4207 }
(gdb)
wait_reading_process_output (time_limit=30, microsecs=0, read_kbd=-1, do_display=1, wait_for_cell=50332681, wait_proc=0x0, just_wait_proc=0) at process.c:4589
4589 xerrno = errno;
(gdb)
4592 clear_waiting_for_input ();
(gdb)
clear_waiting_for_input () at keyboard.c:11010
11010 waiting_for_input = 0;
(gdb)
11011 input_available_clear_time = 0;
(gdb)
11012 }
(gdb)
wait_reading_process_output (time_limit=30, microsecs=0, read_kbd=-1, do_display=1, wait_for_cell=50332681, wait_proc=0x0, just_wait_proc=0) at process.c:4595
4595 do_pending_window_change (0);
(gdb)
do_pending_window_change (safe=0) at dispnew.c:6232
6232 if (redisplaying_p && !safe)
(gdb)
6235 while (delayed_size_change)
(gdb)
6250 }
(gdb)
wait_reading_process_output (time_limit=30, microsecs=0, read_kbd=-1, do_display=1, wait_for_cell=50332681, wait_proc=0x0, just_wait_proc=0) at process.c:4597
4597 if (time_limit && nfds == 0 && ! timeout_reduced_for_timers)
(gdb)
4600 if (nfds < 0)
(gdb)
4602 if (xerrno == EINTR)
(gdb)
4634 FD_ZERO (&Available);
(gdb)
4670 if (read_kbd != 0)
(gdb)
4672 int old_timers_run = timers_run;
(gdb)
4673 struct buffer *old_buffer = current_buffer;
(gdb)
4674 Lisp_Object old_window = selected_window;
(gdb)
4677 if (detect_input_pending_run_timers (do_display))
(gdb)
detect_input_pending_run_timers (do_display=1) at keyboard.c:10640
10640 int old_timers_run = timers_run;
(gdb)
10642 if (!input_pending)
(gdb)
10643 get_input_pending (&input_pending, READABLE_EVENTS_DO_TIMERS_NOW);
(gdb) p input_pending
$2 = 0
(gdb)
get_input_pending (addr=0x313a90, flags=1) at keyboard.c:6972
6972 *addr = (!NILP (Vquit_flag) || readable_events (flags));
(gdb)
readable_events (flags=1) at keyboard.c:3682
3682 if (flags & READABLE_EVENTS_DO_TIMERS_NOW)
(gdb)
3683 timer_check (1);
(gdb)
timer_check (do_it_now=1) at keyboard.c:4535
4535 timers = Vtimer_list;
(gdb)
4537 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
(gdb)
4538 idle_timers = Vtimer_idle_list;
(gdb)
4544 if (CONSP (timers) || CONSP (idle_timers))
(gdb)
4546 EMACS_GET_TIME (now);
(gdb)
4547 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
(gdb)
4548 EMACS_SUB_TIME (idleness_now, now, timer_idleness_start_time);
(gdb)
4551 while (CONSP (timers) || CONSP (idle_timers))
(gdb)
4554 Lisp_Object timer = Qnil, idle_timer = Qnil;
(gdb)
4559 if (!NILP (timers))
(gdb)
4561 timer = XCAR (timers);
(gdb) finish
Run till exit from #0 timer_check (do_it_now=1) at keyboard.c:4561
0x000d9bb6 in readable_events (flags=1) at keyboard.c:3683
3683 timer_check (1);
Value returned is $3 = {tv_sec = -1, tv_usec = -1}
(gdb) finish
Run till exit from #0 0x000d9bb6 in readable_events (flags=1) at keyboard.c:3683
0x000e0958 in get_input_pending (addr=0x313a90, flags=1) at keyboard.c:6972
6972 *addr = (!NILP (Vquit_flag) || readable_events (flags));
Value returned is $4 = 0
(gdb) finish
Run till exit from #0 0x000e0958 in get_input_pending (addr=0x313a90, flags=1) at keyboard.c:6972
0x000e0a78 in detect_input_pending_run_timers (do_display=1) at keyboard.c:10643
10643 get_input_pending (&input_pending, READABLE_EVENTS_DO_TIMERS_NOW);
(gdb) finish
Run till exit from #0 0x000e0a78 in detect_input_pending_run_timers (do_display=1) at keyboard.c:10643
0x00182416 in wait_reading_process_output (time_limit=30, microsecs=0, read_kbd=-1, do_display=1, wait_for_cell=50332681, wait_proc=0x0, just_wait_proc=0) at process.c:4677
4677 if (detect_input_pending_run_timers (do_display))
Value returned is $5 = 0
(gdb) finish
Run till exit from #0 0x00182416 in wait_reading_process_output (time_limit=30, microsecs=0, read_kbd=-1, do_display=1, wait_for_cell=50332681, wait_proc=0x0, just_wait_proc=0) at process.c:4677
sit_for (timeout=240, reading=1, do_display=1) at dispnew.c:6617
6617 return detect_input_pending () ? Qnil : Qt;
Value returned is $6 = 0
(gdb) finish
Run till exit from #0 sit_for (timeout=240, reading=1, do_display=1) at dispnew.c:6617
0x000e2850 in read_char (commandflag=1, nmaps=3, maps=0xbffff340, prev_event=50332681, used_mouse_menu=0xbffff43c, end_time=0x0) at keyboard.c:2967
2967 tem0 = sit_for (make_number (timeout), 1, 1);
Value returned is $7 = 50332729
(gdb) finish
Run till exit from #0 0x000e2850 in read_char (commandflag=1, nmaps=3, maps=0xbffff340, prev_event=50332681, used_mouse_menu=0xbffff43c, end_time=0x0) at keyboard.c:2967
0x000e4346 in read_key_sequence (keybuf=0xbffff4f8, bufsize=30, prompt=50332681, dont_downcase_last=0, can_return_switch_frame=1, fix_current_buffer=1) at keyboard.c:9458
9458 key = read_char (NILP (prompt), nmaps,
Value returned is $8 = 192
(gdb) finish
Run till exit from #0 0x000e4346 in read_key_sequence (keybuf=0xbffff4f8, bufsize=30, prompt=50332681, dont_downcase_last=0, can_return_switch_frame=1, fix_current_buffer=1) at keyboard.c:9458
0x000e66bc in command_loop_1 () at keyboard.c:1653
1653 i = read_key_sequence (keybuf, sizeof keybuf / sizeof keybuf[0],
Value returned is $9 = 1
(gdb) finish
Run till exit from #0 0x000e66bc in command_loop_1 () at keyboard.c:1653
In GNU Emacs 23.0.60.4 (i386-apple-darwin8.11.1, GTK+ Version 2.12.9)
of 2008-03-26 on mt-computer.local
Windowing system distributor `The XFree86 Project, Inc', version 11.0.40400000
configured using `configure '--disable-font-backend''
Important settings:
value of $LC_ALL: nil
value of $LC_COLLATE: nil
value of $LC_CTYPE: nil
value of $LC_MESSAGES: nil
value of $LC_MONETARY: nil
value of $LC_NUMERIC: nil
value of $LC_TIME: nil
value of $LANG: nil
value of $XMODIFIERS: nil
locale-coding-system: nil
default-enable-multibyte-characters: t
Major mode: C/l
Minor modes in effect:
shell-dirtrack-mode: t
iswitchb-mode: t
openwith-mode: t
TeX-source-specials-mode: t
show-paren-mode: t
tooltip-mode: t
mouse-wheel-mode: t
file-name-shadow-mode: t
global-font-lock-mode: t
font-lock-mode: t
blink-cursor-mode: t
global-auto-composition-mode: t
auto-composition-mode: t
auto-compression-mode: t
line-number-mode: t
transient-mark-mode: t
abbrev-mode: t
Recent messages:
Registering /Users/mt/gravity/ppm.tcl... done
Mark set
Press C-c C-c when you are done editing.
Enter a change comment. Type C-c C-c when done
Checking spelling of COMMITTING...
Quit [3 times]
Mark saved where search started
Quit
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: 23.0.60; Occasional hangs in flyspell-mode and ispell-word
2008-03-27 5:20 23.0.60; Occasional hangs in flyspell-mode and ispell-word Markus Triska
@ 2008-03-27 21:04 ` Stefan Monnier
2008-03-27 21:27 ` Lennart Borgman (gmail)
2008-03-28 15:06 ` Markus Triska
[not found] ` <handler.84.B.120662569622724.ack@emacsbugs.donarmstrong.com>
1 sibling, 2 replies; 11+ messages in thread
From: Stefan Monnier @ 2008-03-27 21:04 UTC (permalink / raw)
To: Markus Triska; +Cc: emacs-pretest-bug
> In connection with flyspell-mode and ispell-word, sometimes Emacs
> hangs indefinitely and cannot be interrupted with C-g. When running
> Emacs inside gdb and doing a backtrace when it hangs, I get:
I personally use an Emacs patched as follows:
Index: src/process.c
===================================================================
RCS file: /sources/emacs/emacs/src/process.c,v
retrieving revision 1.538
diff -u -r1.538 process.c
--- src/process.c 27 Mar 2008 20:52:24 -0000 1.538
+++ src/process.c 27 Mar 2008 20:52:32 -0000
@@ -4272,6 +4272,9 @@
FD_ZERO (&Connecting);
#endif
+ if (time_limit == 0 && wait_proc && !NILP (Vinhibit_quit))
+ error ("Blocking call to accept-process-output with quit inhibited!!");
+
/* If wait_proc is a process to watch, set wait_channel accordingly. */
if (wait_proc != NULL)
wait_channel = wait_proc->infd;
so the accept-process-output refuses to do its job if it's run with
quit-inhibited, which is the typical cause of problems such as the one
you're describing. But your backtrace indicates that inhibit-quit is
(most likely) not set, so your problem seems to be different.
When did this problem started?
Stefan
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: 23.0.60; Occasional hangs in flyspell-mode and ispell-word
2008-03-27 21:04 ` Stefan Monnier
@ 2008-03-27 21:27 ` Lennart Borgman (gmail)
2008-03-29 18:40 ` Stefan Monnier
2008-03-28 15:06 ` Markus Triska
1 sibling, 1 reply; 11+ messages in thread
From: Lennart Borgman (gmail) @ 2008-03-27 21:27 UTC (permalink / raw)
To: Stefan Monnier; +Cc: emacs-pretest-bug, Markus Triska
Stefan Monnier wrote:
> I personally use an Emacs patched as follows:
>
> Index: src/process.c
> ===================================================================
> RCS file: /sources/emacs/emacs/src/process.c,v
> retrieving revision 1.538
> diff -u -r1.538 process.c
> --- src/process.c 27 Mar 2008 20:52:24 -0000 1.538
> +++ src/process.c 27 Mar 2008 20:52:32 -0000
> @@ -4272,6 +4272,9 @@
> FD_ZERO (&Connecting);
> #endif
>
> + if (time_limit == 0 && wait_proc && !NILP (Vinhibit_quit))
> + error ("Blocking call to accept-process-output with quit inhibited!!");
> +
> /* If wait_proc is a process to watch, set wait_channel accordingly. */
> if (wait_proc != NULL)
> wait_channel = wait_proc->infd;
>
> so the accept-process-output refuses to do its job if it's run with
> quit-inhibited, which is the typical cause of problems such as the one
> you're describing. But your backtrace indicates that inhibit-quit is
> (most likely) not set, so your problem seems to be different.
It is a bit off topic but why do you not apply this to the CVS sources?
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: 23.0.60; Occasional hangs in flyspell-mode and ispell-word
2008-03-27 21:04 ` Stefan Monnier
2008-03-27 21:27 ` Lennart Borgman (gmail)
@ 2008-03-28 15:06 ` Markus Triska
2008-03-29 18:43 ` Stefan Monnier
1 sibling, 1 reply; 11+ messages in thread
From: Markus Triska @ 2008-03-28 15:06 UTC (permalink / raw)
To: Stefan Monnier; +Cc: emacs-pretest-bug
Stefan Monnier <monnier@iro.umontreal.ca> writes:
> so the accept-process-output refuses to do its job if it's run with
> quit-inhibited, which is the typical cause of problems such as the one
Thanks, I've applied this change locally to make sure this isn't the
cause here.
> When did this problem started?
I encountered such hangs with flyspell-mode definitely months ago
already, with Emacs.app (which was at that point quite up-to-date, and
already based on the Unicode branch plus multi-tty). I'm not certain
whether the then current trunk had the same problem, but I vaguely
remember similar problems with even earlier versions.
I get these hangs about twice or thrice a day when working on a large
LaTeX document with flyspell-mode activated. I hope you can reproduce
the problem if you enable flyspell-mode for modes that you often use.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: 23.0.60; Occasional hangs in flyspell-mode and ispell-word
2008-03-27 21:27 ` Lennart Borgman (gmail)
@ 2008-03-29 18:40 ` Stefan Monnier
0 siblings, 0 replies; 11+ messages in thread
From: Stefan Monnier @ 2008-03-29 18:40 UTC (permalink / raw)
To: Lennart Borgman (gmail); +Cc: emacs-pretest-bug, Markus Triska
>> I personally use an Emacs patched as follows:
>>
>> Index: src/process.c
>> ===================================================================
>> RCS file: /sources/emacs/emacs/src/process.c,v
>> retrieving revision 1.538
>> diff -u -r1.538 process.c
>> --- src/process.c 27 Mar 2008 20:52:24 -0000 1.538
>> +++ src/process.c 27 Mar 2008 20:52:32 -0000
>> @@ -4272,6 +4272,9 @@
>> FD_ZERO (&Connecting);
>> #endif
>> + if (time_limit == 0 && wait_proc && !NILP (Vinhibit_quit))
>> + error ("Blocking call to accept-process-output with quit inhibited!!");
>> +
>> /* If wait_proc is a process to watch, set wait_channel accordingly. */
>> if (wait_proc != NULL)
>> wait_channel = wait_proc->infd;
>>
>> so the accept-process-output refuses to do its job if it's run with
>> quit-inhibited, which is the typical cause of problems such as the one
>> you're describing. But your backtrace indicates that inhibit-quit is
>> (most likely) not set, so your problem seems to be different.
> It is a bit off topic but why do you not apply this to the CVS sources?
It breaks some Elisp packages. Those packages arguably have a bug, but
the bug may very rarely show up (if ever).
Stefan
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: 23.0.60; Occasional hangs in flyspell-mode and ispell-word
2008-03-28 15:06 ` Markus Triska
@ 2008-03-29 18:43 ` Stefan Monnier
0 siblings, 0 replies; 11+ messages in thread
From: Stefan Monnier @ 2008-03-29 18:43 UTC (permalink / raw)
To: Markus Triska; +Cc: emacs-pretest-bug
>> When did this problem started?
> I encountered such hangs with flyspell-mode definitely months ago
> already, with Emacs.app (which was at that point quite up-to-date, and
> already based on the Unicode branch plus multi-tty). I'm not certain
> whether the then current trunk had the same problem, but I vaguely
> remember similar problems with even earlier versions.
What's the latest trunk version you can remember using which didn't
suffer from this problem?
> I get these hangs about twice or thrice a day when working on a large
> LaTeX document with flyspell-mode activated. I hope you can reproduce
> the problem if you enable flyspell-mode for modes that you often use.
I use flyspell pretty much everywhere (including programming modes via
flyspell-prog-mode). Haven't seen such problem.
I'd expect it to be linked to problems with the ispell (or aspell)
process, so it may depend on which version of that program you're using.
Stefan
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#84: Acknowledgement (23.0.60; Occasional hangs in flyspell-mode and ispell-word)
[not found] ` <handler.84.B.120662569622724.ack@emacsbugs.donarmstrong.com>
@ 2008-07-08 13:25 ` Markus Triska
2008-07-08 18:24 ` Markus Triska
0 siblings, 1 reply; 11+ messages in thread
From: Markus Triska @ 2008-07-08 13:25 UTC (permalink / raw)
To: 84
Here's a test case which I think illustrates part of the problem: Let
hang.el contain only the form:
(with-temp-buffer
(insert "test")
(let ((n 0))
(while t
(setq n (1+ n))
(when (= (mod n 1000) 0)
(message "%s" (emacs-uptime)))
(condition-case err
(ispell-word nil t)
(error (message "error: %s" err))))))
and do:
$ emacs -Q --script hang.el
This continuously spell-checks the word "test". In another terminal,
kill the aspell process:
$ killall -s 9 aspell
Different things can then happen to the Emacs process, depending on its
exact state when you kill aspell:
a) error: (error SIGPIPE raised on process ispell; closed it)
b) error: (error Process ispell not running)
c) Emacs hangs, waiting for more output from aspell
In cases (a) and (b), Emacs continues as normal after it has
automatically restarted aspell. Case (c) seems to be part of the
original problem, which I think can happen as follows: Aspell crashes
while flyspell-word waits for output; one can interrupt the wait with
C-g, but because no error was risen, flyspell-post-command-hook is not
removed from post-command-hook, and is still triggered after each
command (including pressing C-g itself), thus resulting in new waits.
Thus, instead of waiting for more output from a dead process, doesn't an
error seem preferable?
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#84: Acknowledgement (23.0.60; Occasional hangs in flyspell-mode and ispell-word)
2008-07-08 13:25 ` bug#84: Acknowledgement (23.0.60; Occasional hangs in flyspell-mode and ispell-word) Markus Triska
@ 2008-07-08 18:24 ` Markus Triska
2008-07-09 9:57 ` Markus Triska
0 siblings, 1 reply; 11+ messages in thread
From: Markus Triska @ 2008-07-08 18:24 UTC (permalink / raw)
To: 84
> while flyspell-word waits for output; one can interrupt the wait with
> C-g
I've now seen that this wasn't the case in the backtrace, i.e., I
specifically could NOT interrupt accept-process-output; also, had I been
able to interrupt it, a subsequent process-send-string to the dead
process from flyspell-word would have triggered an error and thus
removed flyspell-post-command-hook from post-command-hook.
To sum up, I think it remains valid that accept-process-output should
throw an error (instead of waiting, as it currently does) if the process
it is waiting for is dead, and an independent issue is that
wait_reading_process_output can sometimes not be interrupted manually
and can make Emacs hang indefinitely. So far, the hangs seem to occur
when I have previously interrupted wait_reading_process_output when it
was waiting for output from a dead process. For example, I'm using the
following to enable flyspell mode when it was disabled:
(defun reactivate-flyspell ()
(unless (memq 'flyspell-post-command-hook post-command-hook)
(flyspell-mode 1)))
(setq my-idle (run-with-idle-timer 0.1 t 'reactivate-flyspell))
then I continuously kill aspell with:
$ while true; do killall -s 9 aspell; sleep 0.1; done
Then I go into a buffer with a lot of text and move the cursor over a
few words (to flyspell-them) until Emacs hangs due to
accept-process-output from a dead aspell process. I can always interrupt
this with C-g. I do this a few times, then stop the continuous killing
of aspell, and then start Gnus a few times. This almost always makes
Emacs hang completely; I'm now trying to make this test case shorter.
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#84: Acknowledgement (23.0.60; Occasional hangs in flyspell-mode and ispell-word)
2008-07-08 18:24 ` Markus Triska
@ 2008-07-09 9:57 ` Markus Triska
2008-07-10 23:01 ` Markus Triska
0 siblings, 1 reply; 11+ messages in thread
From: Markus Triska @ 2008-07-09 9:57 UTC (permalink / raw)
To: 84
> of aspell, and then start Gnus a few times. This almost always makes
> Emacs hang completely; I'm now trying to make this test case shorter.
I now have a precise test case that makes Emacs totally hang on my
machine every time:
(1) With M-:, I evaluate the following forms in "emacs -Q":
(defmacro preserve-message (form)
`(let ((msg (current-message)))
,form
(message "%s" msg)))
(let ((n 0))
(while (< n 10)
(with-timeout (1 (setq n (1+ n)) (message "# timeouts: %s" n))
(condition-case err
(with-temp-buffer
(insert "test")
(preserve-message
(ispell-word nil t)))
(error (message "error: %s" err))))))
(2) In a separate terminal, I continuously kill the aspell process:
while true; do killall -9 aspell; sleep 0.1; done
(3) I wait until the timeout counter has reached 10, i.e., evaluation
of the second form above is finished, then I evaluate the forms:
(defun reactivate-flyspell ()
(unless (memq 'flyspell-post-command-hook post-command-hook)
(preserve-message
(flyspell-mode 1))))
(setq my-idle (run-with-idle-timer 0.1 t 'reactivate-flyspell))
(4) Then I enter and exit Gnus three times:
M-x gnus RET q y
M-x gnus RET q y
M-x gnus RET q y
all while aspell is constantly killed and restarted in the
background. Starting Gnus only once does not suffice.
(5) I kill the shell script, so aspell can now run interruptedly. I
enter and try to exit Gnus again:
M-x gnus RET q y
and Emacs hangs completely. I cannot interrupt it with C-g. The
backtrace follows.
This is with GNU Emacs 23.0.60.1 (i386-apple-darwin8.11.1, GTK+ Version
2.12.9) of 2008-06-29; I will try to reproduce it with different
machines later. You may have to adjust the sleep time in the shell
command to kill the aspell process not too often.
#0 0x9000177e in __error ()
#1 0x9000172b in cthread_set_errno_self ()
#2 0x9011078b in cerror ()
#3 0x00181918 in read_process_output (proc=42226388, channel=0) at process.c:5322
#4 0x00188134 in wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=58721289, wait_proc=0x28452d0, just_wait_proc=0) at process.c:4772
#5 0x00188f38 in Faccept_process_output (process=42226388, seconds=58721289, millisec=58721289, just_this_one=58721289) at process.c:4252
#6 0x00144ac4 in Ffuncall (nargs=2, args=0xbfffec60) at eval.c:3052
#7 0x0017dc57 in Fbyte_code (bytestr=58983403, vector=35024692, maxdepth=2) at bytecode.c:678
#8 0x00143f72 in Feval (form=40259517) at eval.c:2383
#9 0x0014655b in internal_lisp_condition_case (var=58721289, bodyform=40259517, handlers=40289301) at eval.c:1456
#10 0x0017cb8d in Fbyte_code (bytestr=58985659, vector=35024820, maxdepth=5) at bytecode.c:868
#11 0x001443a7 in funcall_lambda (fun=35025140, nargs=0, arg_vector=0xbffff014) at eval.c:3229
#12 0x0014488a in Ffuncall (nargs=1, args=0xbffff010) at eval.c:3099
#13 0x0017dc57 in Fbyte_code (bytestr=58738651, vector=35023668, maxdepth=4) at bytecode.c:678
#14 0x001443a7 in funcall_lambda (fun=35023860, nargs=0, arg_vector=0xbffff1f0) at eval.c:3229
#15 0x0014488a in Ffuncall (nargs=1, args=0xbffff1ec) at eval.c:3099
#16 0x00145e14 in run_hook_with_args (nargs=1, args=0xbffff1ec, cond=to_completion) at eval.c:2701
#17 0x00145f9c in Frun_hooks (nargs=1, args=0xbffff2a4) at eval.c:2564
#18 0x00144a2f in Ffuncall (nargs=2, args=0xbffff2a0) at eval.c:3023
#19 0x00145c9f in call1 (fn=58809001, arg1=58751489) at eval.c:2827
#20 0x000d6434 in safe_run_hooks_1 (hook=-1073745176) at keyboard.c:2152
#21 0x00142c1c in internal_condition_case (bfun=0xd6402 <safe_run_hooks_1>, handlers=58721337, hfun=0xd643e <safe_run_hooks_error>) at eval.c:1511
#22 0x000d5ac5 in safe_run_hooks (hook=58751489) at keyboard.c:2180
#23 0x000e3d46 in command_loop_1 () at keyboard.c:1929
#24 0x00142c1c in internal_condition_case (bfun=0xe387e <command_loop_1>, handlers=58760929, hfun=0xdc6d9 <cmd_error>) at eval.c:1511
#25 0x000d5830 in command_loop_2 () at keyboard.c:1367
#26 0x0014286e in internal_catch (tag=58757001, func=0xd57ec <command_loop_2>, arg=58721289) at eval.c:1247
#27 0x000d55d2 in command_loop () at keyboard.c:1346
#28 0x000d568b in recursive_edit_1 () at keyboard.c:955
#29 0x000d57d3 in Frecursive_edit () at keyboard.c:1017
#30 0x000d4813 in main (argc=3, argv=0xbffff820) at emacs.c:1762
(gdb) bt full
#0 0x9000177e in __error ()
No symbol table info available.
#1 0x9000172b in cthread_set_errno_self ()
No symbol table info available.
#2 0x9011078b in cerror ()
No symbol table info available.
#3 0x00181918 in read_process_output (proc=42226388, channel=0) at process.c:5322
nbytes = -1
outstream = 0
old = (struct buffer *) 0x21872d0
p = (struct Lisp_Process *) 0x28452d0
opoint = 0
coding = (struct coding_system *) 0x284f040
carryover = 3289392
#4 0x00188134 in wait_reading_process_output (time_limit=0, microsecs=0, read_kbd=0, do_display=0, wait_for_cell=58721289, wait_proc=0x28452d0, just_wait_proc=0) at process.c:4772
nread = -1610559488
total_nread = 0
timeout_reduced_for_timers = 0
channel = -1146
nfds = -1
Available = {
fds_bits = {0 <repeats 32 times>}
}
Connecting = {
fds_bits = {0 <repeats 32 times>}
}
check_connect = 0
check_delay = 0
no_avail = 1
xerrno = 134678021
proc = 42226388
timeout = {
tv_sec = 100000,
tv_usec = 0
}
end_time = {
tv_sec = -1879027210,
tv_usec = 13
}
wait_channel = 0
got_some_input = 0
#5 0x00188f38 in Faccept_process_output (process=42226388, seconds=58721289, millisec=58721289, just_this_one=58721289) at process.c:4252
secs = 0
usecs = 0
process = 42226388
seconds = -1879042283
millisec = 0
#6 0x00144ac4 in Ffuncall (nargs=2, args=0xbfffec60) at eval.c:3052
fun = -1073746976
original_fun = 3069896
funcar = -1879042283
numargs = 1
val = -1879042184
backtrace = {
next = 0xbfffed74,
function = 0xbfffec60,
args = 0xbfffec64,
nargs = 1,
evalargs = 0 '\0',
debug_on_exit = 0 '\0'
}
internal_args = (Lisp_Object *) 0xbfffebe0
i = -1879042283
args = (Lisp_Object *) 0x2ed7c8
#7 0x0017dc57 in Fbyte_code (bytestr=58983403, vector=35024692, maxdepth=2) at bytecode.c:678
op = -1610559488
vectorp = (Lisp_Object *) 0x2166f38
stack = {
pc = 0x5992b35 "?\n@Ř?\002",
top = 0xbfffec64,
bottom = 0xbfffec60,
byte_string = 58983403,
byte_string_start = 0x5992b30 "?\030?\t!?\n@Ř?\002",
constants = 35024692,
next = 0xbfffef04
}
result = -1879042184
bytestr = -1879042283
#8 0x00143f72 in Feval (form=40259517) at eval.c:2383
numargs = -1879042283
argvals = {58983403, 35024692, 16, 1, 0, 1026674, 1323343, 58983451}
args_left = 58721289
i = 3
fun = -1879042184
val = -1879042184
original_fun = 58832137
original_args = 40259525
funcar = -1879042283
backtrace = {
next = 0xbfffefcc,
function = 0xbfffed8c,
args = 0xbfffed54,
nargs = 3,
evalargs = 1 '\001',
debug_on_exit = 0 '\0'
}
form = 58721289
#9 0x0014655b in internal_lisp_condition_case (var=58721289, bodyform=40259517, handlers=40289301) at eval.c:1456
val = -1879042283
c = {
tag = 58721289,
val = 58721289,
next = 0xbffff2d8,
gcpro = 0x0,
jmp = {895, 1569345, 8096, 1336252, 3, 1328852, 93923673, 58721289, -1073746328, -1073746512, 42205215, 658, 1336418, 95813655, 58720287, 31, -1073807360, 55},
backlist = 0xbfffefcc,
handlerlist = 0xbffff34c,
lisp_eval_depth = 3,
pdlcount = 14,
poll_suppress_count = 1,
interrupt_input_blocked = 0,
byte_stack = 0xbfffef04
}
h = {
handler = 40289301,
var = 58721289,
chosen_clause = -1073746300,
tag = 0xbfffedc8,
next = 0xbffff34c
}
#10 0x0017cb8d in Fbyte_code (bytestr=58985659, vector=35024820, maxdepth=5) at bytecode.c:868
handlers = -1610559488
body = -1879042283
op = -1610559488
vectorp = (Lisp_Object *) 0x2166fb8
stack = {
pc = 0x5992959 "?\016&A?\026&??",
top = 0xbfffee80,
bottom = 0xbfffee80,
byte_string = 58985659,
byte_string_start = 0x599286c "? ??? ?`\030?\t!\032ɉ\033\034ɉ\035\036%?\036&\n?=?,",
constants = 35024820,
next = 0xbffff084
}
result = -1879042184
bytestr = -1879042283
#11 0x001443a7 in funcall_lambda (fun=35025140, nargs=0, arg_vector=0xbffff014) at eval.c:3229
val = -1610559488
syms_left = 35025136
next = 35025136
i = 0
optional = 1
rest = 0
#12 0x0014488a in Ffuncall (nargs=1, args=0xbffff010) at eval.c:3099
fun = 35025140
original_fun = 94138233
funcar = -1879042283
numargs = 0
val = -1879042184
backtrace = {
next = 0xbffff14c,
function = 0xbffff010,
args = 0xbffff014,
nargs = 0,
evalargs = 0 '\0',
debug_on_exit = 0 '\0'
}
internal_args = (Lisp_Object *) 0x21670f4
i = -1879042283
args = (Lisp_Object *) 0x59c6f79
#13 0x0017dc57 in Fbyte_code (bytestr=58738651, vector=35023668, maxdepth=4) at bytecode.c:678
op = -1610559488
vectorp = (Lisp_Object *) 0x2166b38
stack = {
pc = 0x59926b4 "?p\025`\026\017?;",
top = 0xbffff010,
bottom = 0xbffff010,
byte_string = 58738651,
byte_string_start = 0x5992698 "\b?\031\032? ?\025",
constants = 35023668,
next = 0x0
}
result = -1879042184
bytestr = -1879042283
#14 0x001443a7 in funcall_lambda (fun=35023860, nargs=0, arg_vector=0xbffff1f0) at eval.c:3229
val = -1610559488
syms_left = 35023856
next = 35023856
i = 0
optional = 2
rest = 1248273
#15 0x0014488a in Ffuncall (nargs=1, args=0xbffff1ec) at eval.c:3099
fun = 35023860
original_fun = 93950897
funcar = -1879042283
numargs = 0
val = -1879042184
backtrace = {
next = 0xbffff24c,
function = 0xbffff1ec,
args = 0xbffff1f0,
nargs = 0,
evalargs = 0 '\0',
debug_on_exit = 0 '\0'
}
internal_args = (Lisp_Object *) 0x2166bf4
i = -1879042283
args = (Lisp_Object *) 0x59993b1
#16 0x00145e14 in run_hook_with_args (nargs=1, args=0xbffff1ec, cond=to_completion) at eval.c:2701
sym = 58751489
val = -1879042184
ret = 58721289
globals = -1879042283
#17 0x00145f9c in Frun_hooks (nargs=1, args=0xbffff2a4) at eval.c:2564
hook = {93950897}
i = 0
nargs = 1
#18 0x00144a2f in Ffuncall (nargs=2, args=0xbffff2a0) at eval.c:3023
fun = 3063148
original_fun = -1073745244
funcar = -1879042283
numargs = 1
val = -1879042184
backtrace = {
next = 0x0,
function = 0xbffff2a0,
args = 0xbffff2a4,
nargs = 1,
evalargs = 0 '\0',
debug_on_exit = 0 '\0'
}
internal_args = (Lisp_Object *) 0x2ebd6c
i = -1879042283
args = (Lisp_Object *) 0xbffff2a4
#19 0x00145c9f in call1 (fn=58809001, arg1=58751489) at eval.c:2827
ret_ungc_val = -1610559488
#20 0x000d6434 in safe_run_hooks_1 (hook=-1073745176) at keyboard.c:2152
No locals.
#21 0x00142c1c in internal_condition_case (bfun=0xd6402 <safe_run_hooks_1>, handlers=58721337, hfun=0xd643e <safe_run_hooks_error>) at eval.c:1511
val = -1879042283
c = {
tag = 58721289,
val = 58721289,
next = 0xbffff498,
gcpro = 0x0,
jmp = {895, 1250071, 8096, 1321771, -1073745096, 1250219, 3307312, 2, -1073745032, -1073745216, 94961695, 662, 1321920, 1245207, 31, 31, 0, 1310775},
backlist = 0x0,
handlerlist = 0xbffff50c,
lisp_eval_depth = 0,
pdlcount = 3,
poll_suppress_count = 1,
interrupt_input_blocked = 0,
byte_stack = 0x0
}
h = {
handler = 58721337,
var = 58721289,
chosen_clause = 58807000,
tag = 0xbffff2d8,
next = 0xbffff50c
}
#22 0x000d5ac5 in safe_run_hooks (hook=58751489) at keyboard.c:2180
hook = -1610559488
#23 0x000e3d46 in command_loop_1 () at keyboard.c:1929
cmd = 3284528
lose = 3284528
nonundocount = 0
keybuf = {904, 40, 3307184, 58721289, -1073744776, 903096, 34397045, -1073744850, -1073744808, -1879037169, 92274892, 152, -1073744850, 58721289, 100663439, 1, 31, -1879036413, 51396120, 58721337, 51385976, -1881082098, 5625428, 0, -1073744804, -1073744992, 0, 3342336, 58721289, 67060025}
i = 1
prev_modiff = 138
prev_buffer = (struct buffer *) 0x284f270
already_adjusted = 0
#24 0x00142c1c in internal_condition_case (bfun=0xe387e <command_loop_1>, handlers=58760929, hfun=0xdc6d9 <cmd_error>) at eval.c:1511
val = -1879042283
c = {
tag = 58721289,
val = 58721289,
next = 0xbffff59c,
gcpro = 0x0,
jmp = {895, 17831856, 8096, 1321771, 58721289, 58721289, 3297712, 3284528, -1073744584, -1073744768, 31, 658, 1321920, 1507351, 3276831, 3276831, -1073807360, -1073807305},
backlist = 0x0,
handlerlist = 0x0,
lisp_eval_depth = 0,
pdlcount = 2,
poll_suppress_count = 1,
interrupt_input_blocked = 0,
byte_stack = 0x0
}
h = {
handler = 58760929,
var = 58721289,
chosen_clause = 58721337,
tag = 0xbffff498,
next = 0x0
}
#25 0x000d5830 in command_loop_2 () at keyboard.c:1367
val = -1610559488
#26 0x0014286e in internal_catch (tag=58757001, func=0xd57ec <command_loop_2>, arg=58721289) at eval.c:1247
c = {
tag = 58757001,
val = 58721289,
next = 0x0,
gcpro = 0x0,
jmp = {895, 15, 8096, 1320914, 2, 20367, 3306688, 3284528, -1073744360, -1073744512, 58851359, 658, 1321057, 58851351, 58851359, 58720287, 51380224, 55},
backlist = 0x0,
handlerlist = 0x0,
lisp_eval_depth = 0,
pdlcount = 2,
poll_suppress_count = 1,
interrupt_input_blocked = 0,
byte_stack = 0x0
}
tag = -1610559488
#27 0x000d55d2 in command_loop () at keyboard.c:1346
val = -1610559488
#28 0x000d568b in recursive_edit_1 () at keyboard.c:955
val = 0
#29 0x000d57d3 in Frecursive_edit () at keyboard.c:1017
buffer = 58721289
#30 0x000d4813 in main (argc=3, argv=0xbffff820) at emacs.c:1762
dummy = -1881117246
stack_bottom_variable = 0 '\0'
do_initial_setlocale = 1
skip_args = 0
rlim = {
rlim_cur = 8388608,
rlim_max = 67108864
}
no_loadup = 0
junk = 0x0
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#84: Acknowledgement (23.0.60; Occasional hangs in flyspell-mode and ispell-word)
2008-07-09 9:57 ` Markus Triska
@ 2008-07-10 23:01 ` Markus Triska
2008-07-12 15:56 ` Markus Triska
0 siblings, 1 reply; 11+ messages in thread
From: Markus Triska @ 2008-07-10 23:01 UTC (permalink / raw)
To: 84
The following patch fixes the problem for me:
2008-07-10 Markus Triska <markus.triska@gmx.at>
* process.c (wait_reading_process_output): handle EBADF
diff --git a/src/process.c b/src/process.c
index e8d0090..0cf04bc 100644
--- a/src/process.c
+++ b/src/process.c
@@ -4791,6 +4791,10 @@ wait_reading_process_output (time_limit, microsecs, read_kbd, do_display,
else if (nread == -1 && EWOULDBLOCK == errno)
break;
#endif
+#ifdef EBADF
+ else if (nread == -1 && EBADF == errno)
+ break;
+#endif
}
if (total_nread > 0 && do_display)
redisplay_preserve_echo_area (10);
^ permalink raw reply related [flat|nested] 11+ messages in thread
* bug#84: Acknowledgement (23.0.60; Occasional hangs in flyspell-mode and ispell-word)
2008-07-10 23:01 ` Markus Triska
@ 2008-07-12 15:56 ` Markus Triska
0 siblings, 0 replies; 11+ messages in thread
From: Markus Triska @ 2008-07-12 15:56 UTC (permalink / raw)
To: 84
I now think the previous patch only fixes a symptom of an underlying
problem, which is that the aspell process occasionally receives SIGPIPE
and terminates unexpectedly. Here's a simpler test case - it seems to
work only on OSX and with Emacs >= 23, but I have seen very similar
problems on other systems and with Emacs <= 22 too (for example, when
replying to a post in Gnus, sometimes aspell would die and not be
restarted). Let f.el consist of:
(defun reactivate-flyspell ()
(unless (memq 'flyspell-post-command-hook post-command-hook)
(flyspell-mode 1)))
(setq my-idle (run-with-idle-timer 0.1 t 'reactivate-flyspell))
If I then do:
1) $ emacs -Q f.el -f eval-buffer
2) enter and leave Gnus twice: M-x gnus RET q y M-x gnus RET q y
3) kill the aspell process:
M-! killall -9 aspell RET
(aspell is instantly restarted by the idle timer, and you can attach
gdb to the new process to verify the signal in the next step.)
4) M-x gnus RET q y (==> you're back in f.el - do anything, like C-n)
Now aspell receives SIGPIPE and exits, and I get EBADF in
wait_reading_process_output; the previous patch handles this, and
thus you can at least interrupt the wait. Ideally though, the aspell
process would not have been killed in the first place, and besides,
after SIGPIPE, the process status should become 'signal eventually.
I would like to trace down where the SIGPIPE comes from, and how the
file descriptor can become invalid in Emacs; I've traced through the
Lisp code of Gnus and flyspell/ispell, and they seem not to touch the
aspell process here. What would be a good place to put a breakpoint in
GDB, such that I can observe execution right after the final "C-n" in
f.el? I tried to raise an error in before-change-functions in f.el, and
instead of "C-n" insert a character in the last step, so that I can put
a breakpoint in Fsignal, but the SIGPIPE occurs before this hook.
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2008-07-12 15:56 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-03-27 5:20 23.0.60; Occasional hangs in flyspell-mode and ispell-word Markus Triska
2008-03-27 21:04 ` Stefan Monnier
2008-03-27 21:27 ` Lennart Borgman (gmail)
2008-03-29 18:40 ` Stefan Monnier
2008-03-28 15:06 ` Markus Triska
2008-03-29 18:43 ` Stefan Monnier
[not found] ` <handler.84.B.120662569622724.ack@emacsbugs.donarmstrong.com>
2008-07-08 13:25 ` bug#84: Acknowledgement (23.0.60; Occasional hangs in flyspell-mode and ispell-word) Markus Triska
2008-07-08 18:24 ` Markus Triska
2008-07-09 9:57 ` Markus Triska
2008-07-10 23:01 ` Markus Triska
2008-07-12 15:56 ` Markus Triska
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.