aboutsummaryrefslogtreecommitdiffstats
path: root/src/ChangeLog
diff options
context:
space:
mode:
authorPaul Eggert2012-11-23 14:20:31 -0800
committerPaul Eggert2012-11-23 14:20:31 -0800
commit6d4e8f62e93b575a1da2cd2b4abeb9dce56e1e52 (patch)
tree2d3564ca26405db0e887bea037dcc175d85cc753 /src/ChangeLog
parent002c019c34eeb1cad4ce8f5ae721b1cdf22f0946 (diff)
downloademacs-6d4e8f62e93b575a1da2cd2b4abeb9dce56e1e52.tar.gz
emacs-6d4e8f62e93b575a1da2cd2b4abeb9dce56e1e52.zip
Fix a race condition with glib (Bug#8855).
This is a backport from the trunk, consisting of: 2012-11-17 Eli Zaretskii <eliz@gnu.org> * nt/inc/sys/wait.h: New file, with prototype of waitpid and definitions of macros it needs. * nt/inc/ms-w32.h (wait): Don't define, 'wait' is not used anymore. (sys_wait): Remove prototype. * nt/config.nt (HAVE_SYS_WAIT_H): Define to 1. * src/w32proc.c (create_child): Don't clip the PID of the child process to fit into an Emacs integer, as this is no longer a restriction. (waitpid): Rename from sys_wait. Emulate a Posix 'waitpid' by reaping only the process specified by PID argument, if that is positive. Use PID instead of dead_child to know which process to reap. Wait for the child to die only if WNOHANG is not in OPTIONS. (sys_select): Don't set dead_child. * src/sysdep.c (wait_for_termination_1): Remove the WINDOWSNT portion, as it is no longer needed. * src/process.c (waitpid, WUNTRACED) [!WNOHANG]: Remove definitions, no longer needed. (record_child_status_change): Remove the setting of record_at_most_one_child for the !WNOHANG case. 2012-11-03 Paul Eggert <eggert@cs.ucla.edu> Fix a race condition that causes Emacs to mess up glib (Bug#8855). This is a backport from the trunk. The symptom is a diagnostic "GLib-WARNING **: In call to g_spawn_sync(), exit status of a child process was requested but SIGCHLD action was set to SIG_IGN and ECHILD was received by waitpid(), so exit status can't be returned." The diagnostic is partly wrong, as the SIGCHLD action is not set to SIG_IGN. The real bug is a race condition between Emacs and glib: Emacs does a waitpid (-1, ...) and reaps glib's subprocess by mistake, so that glib can't find it. Work around the bug by invoking waitpid only on subprocesses that Emacs itself creates. * src/process.c (create_process, record_child_status_change): Don't use special value -1 in pid field, as the caller now must know the pid rather than having the callee infer it. The inference was sometimes incorrect anyway, due to another race. (create_process): Set new 'alive' member if child is created. (process_status_retrieved): New function. (record_child_status_change): Use it. Accept negative 1st argument, which means to wait for the processes that Emacs already knows about. Move special-case code for DOS_NT (which lacks WNOHANG) here, from caller. Keep track of processes that have already been waited for, by testing and clearing new 'alive' member. (CAN_HANDLE_MULTIPLE_CHILDREN): Remove, as record_child_status_change now does this internally. (handle_child_signal): Let record_child_status_change do all the work, since we do not want to reap all exited child processes, only the child processes that Emacs itself created. * src/process.h (Lisp_Process): New boolean member 'alive'.
Diffstat (limited to 'src/ChangeLog')
-rw-r--r--src/ChangeLog57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 88fbf7a99f2..655eb1595c0 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,60 @@
12012-11-23 Paul Eggert <eggert@cs.ucla.edu>
2
3 Fix a race condition with glib (Bug#8855).
4 This is a backport from the trunk, consisting of:
5
6 2012-11-17 Eli Zaretskii <eliz@gnu.org>
7
8 * w32proc.c (create_child): Don't clip the PID of the child
9 process to fit into an Emacs integer, as this is no longer a
10 restriction.
11 (waitpid): Rename from sys_wait. Emulate a Posix 'waitpid' by
12 reaping only the process specified by PID argument, if that is
13 positive. Use PID instead of dead_child to know which process to
14 reap. Wait for the child to die only if WNOHANG is not in
15 OPTIONS.
16 (sys_select): Don't set dead_child.
17
18 * sysdep.c (wait_for_termination_1): Remove the WINDOWSNT portion,
19 as it is no longer needed.
20
21 * process.c (waitpid, WUNTRACED) [!WNOHANG]: Remove definitions,
22 no longer needed.
23 (record_child_status_change): Remove the setting of
24 record_at_most_one_child for the !WNOHANG case.
25
26 2012-11-03 Paul Eggert <eggert@cs.ucla.edu>
27
28 Fix a race condition that causes Emacs to mess up glib (Bug#8855).
29 This is a backport from the trunk.
30 The symptom is a diagnostic "GLib-WARNING **: In call to
31 g_spawn_sync(), exit status of a child process was requested but
32 SIGCHLD action was set to SIG_IGN and ECHILD was received by
33 waitpid(), so exit status can't be returned." The diagnostic
34 is partly wrong, as the SIGCHLD action is not set to SIG_IGN.
35 The real bug is a race condition between Emacs and glib: Emacs
36 does a waitpid (-1, ...) and reaps glib's subprocess by mistake,
37 so that glib can't find it. Work around the bug by invoking
38 waitpid only on subprocesses that Emacs itself creates.
39 * process.c (create_process, record_child_status_change):
40 Don't use special value -1 in pid field, as the caller now must
41 know the pid rather than having the callee infer it. The
42 inference was sometimes incorrect anyway, due to another race.
43 (create_process): Set new 'alive' member if child is created.
44 (process_status_retrieved): New function.
45 (record_child_status_change): Use it.
46 Accept negative 1st argument, which means to wait for the
47 processes that Emacs already knows about. Move special-case code
48 for DOS_NT (which lacks WNOHANG) here, from caller. Keep track of
49 processes that have already been waited for, by testing and
50 clearing new 'alive' member.
51 (CAN_HANDLE_MULTIPLE_CHILDREN): Remove, as record_child_status_change
52 now does this internally.
53 (handle_child_signal): Let record_child_status_change do all
54 the work, since we do not want to reap all exited child processes,
55 only the child processes that Emacs itself created.
56 * process.h (Lisp_Process): New boolean member 'alive'.
57
12012-11-23 Eli Zaretskii <eliz@gnu.org> 582012-11-23 Eli Zaretskii <eliz@gnu.org>
2 59
3 * xdisp.c (set_cursor_from_row): Skip step 2 only if point is not 60 * xdisp.c (set_cursor_from_row): Skip step 2 only if point is not