>>> `compilation-start' needs to check if the process is running >>> before calling `process-send-eof': >> >> That's odd. AFAICT no blobking operation takes place between the >> start-process and the process-send-eof, so the process-status should still >> be `run' no matter how quickly the process exits (because Emacs shouldn't >> process the SIGCHLD it receives until later). >> >> What am I missing?
> The process exits during execution of create_process. The gdb log below > with a breakpoint on sigchld_handler demonstrates what really happens: > Breakpoint 4, sigchld_handler (signo=17) at process.c:6249 > 6249 XSETINT (p->raw_status_low, u.i & 0xffff); > (gdb) n > 6250 XSETINT (p->raw_status_high, u.i >> 16); > (gdb) n > 6253 if ((WIFSIGNALED (w) || WIFEXITED (w)) > (gdb) n > 6260 FD_CLR (XINT (p->infd), &input_wait_mask); > (gdb) n > 6261 FD_CLR (XINT (p->infd), &non_keyboard_wait_mask); > (gdb) p w > $1 = 512 <-- WIFEXITED > (gdb) bt > #0 sigchld_handler (signo=17) at process.c:6261 > #1 <signal handler called> > #2 0x4031f784 in sigprocmask () from /lib/libc.so.6 > #3 0x0817af28 in create_process (process=141365940, new_argv=0xbfffe954, > current_dir=140249731) at process.c:2153 > #4 0x0817a97d in Fstart_process (nargs=5, args=0xbfffea94) at process.c:1695 > ... > (gdb) fr 3 > #3 0x0817af28 in create_process (process=141365940, new_argv=0xbfffe954, > current_dir=140249731) at process.c:2153 > 2153 sigprocmask (SIG_SETMASK, &procmask, 0); Oh, I now see that process-send-eof does: if (! NILP (XPROCESS (proc)->raw_status_low)) update_status (XPROCESS (proc)); which basically copies the asynchronously updated proc->raw_status_* to the synchronously updated proc->status. Since this process status can change asynchronously, adding your test for (eq (process-status proc) 'run) before calling process-send-eof doesn't fix the bug but just narrows the window of the race condition because the status can still change between the call to process-status and the call to process-send-eof. So I suggest the patch below instead, Stefan --- compile.el 01 sep 2005 10:04:39 -0400 1.379 +++ compile.el 01 sep 2005 10:58:22 -0400 @@ -1038,11 +1038,14 @@ outbuf command)))) ;; Make the buffer's mode line show process state. (setq mode-line-process '(":%s")) - (when compilation-disable-input - (process-send-eof proc)) (set-process-sentinel proc 'compilation-sentinel) (set-process-filter proc 'compilation-filter) (set-marker (process-mark proc) (point) outbuf) + (when compilation-disable-input + (condition-case nil + (process-send-eof proc) + ;; The process may have exited already. + (error nil))) (setq compilation-in-progress (cons proc compilation-in-progress))) ;; No asynchronous processes available. _______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel