[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: grep-use-null-device
From: |
Stefan Monnier |
Subject: |
Re: grep-use-null-device |
Date: |
Thu, 01 Sep 2005 10:59:48 -0400 |
User-agent: |
Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) |
>>> `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.
- Re: grep-use-null-device,
Stefan Monnier <=