diff options
Diffstat (limited to 'src/ChangeLog')
| -rw-r--r-- | src/ChangeLog | 57 |
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 @@ | |||
| 1 | 2012-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 | |||
| 1 | 2012-11-23 Eli Zaretskii <eliz@gnu.org> | 58 | 2012-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 |