diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 11 | ||||
| -rw-r--r-- | src/w32proc.c | 10 |
2 files changed, 17 insertions, 4 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 645da892971..6e7f771d220 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,14 @@ | |||
| 1 | 2012-12-21 Eli Zaretskii <eliz@gnu.org> | ||
| 2 | |||
| 3 | * w32proc.c (new_child, delete_child, find_child_pid): For a | ||
| 4 | subprocess, consider its slot being in use as long as its process | ||
| 5 | handle (procinfo.hProcess) is not NULL. This avoids reusing the | ||
| 6 | slot when a new process is started immediately after killing | ||
| 7 | another one, without waiting enough time for the first process to | ||
| 8 | be reaped and resources allocated for it be orderly freed. | ||
| 9 | (Bug#13086) | ||
| 10 | Suggested by Fabrice Popineau <fabrice.popineau@supelec.fr>. | ||
| 11 | |||
| 1 | 2012-12-21 Chong Yidong <cyd@gnu.org> | 12 | 2012-12-21 Chong Yidong <cyd@gnu.org> |
| 2 | 13 | ||
| 3 | * buffer.c (Fset_buffer_major_mode): Doc fix (Bug#13231). | 14 | * buffer.c (Fset_buffer_major_mode): Doc fix (Bug#13231). |
diff --git a/src/w32proc.c b/src/w32proc.c index e3c54fe5460..03360075a09 100644 --- a/src/w32proc.c +++ b/src/w32proc.c | |||
| @@ -795,7 +795,7 @@ new_child (void) | |||
| 795 | DWORD id; | 795 | DWORD id; |
| 796 | 796 | ||
| 797 | for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--) | 797 | for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--) |
| 798 | if (!CHILD_ACTIVE (cp)) | 798 | if (!CHILD_ACTIVE (cp) && cp->procinfo.hProcess == NULL) |
| 799 | goto Initialize; | 799 | goto Initialize; |
| 800 | if (child_proc_count == MAX_CHILDREN) | 800 | if (child_proc_count == MAX_CHILDREN) |
| 801 | return NULL; | 801 | return NULL; |
| @@ -852,7 +852,7 @@ delete_child (child_process *cp) | |||
| 852 | if (fd_info[i].cp == cp) | 852 | if (fd_info[i].cp == cp) |
| 853 | emacs_abort (); | 853 | emacs_abort (); |
| 854 | 854 | ||
| 855 | if (!CHILD_ACTIVE (cp)) | 855 | if (!CHILD_ACTIVE (cp) && cp->procinfo.hProcess == NULL) |
| 856 | return; | 856 | return; |
| 857 | 857 | ||
| 858 | /* reap thread if necessary */ | 858 | /* reap thread if necessary */ |
| @@ -896,7 +896,8 @@ delete_child (child_process *cp) | |||
| 896 | if (cp == child_procs + child_proc_count - 1) | 896 | if (cp == child_procs + child_proc_count - 1) |
| 897 | { | 897 | { |
| 898 | for (i = child_proc_count-1; i >= 0; i--) | 898 | for (i = child_proc_count-1; i >= 0; i--) |
| 899 | if (CHILD_ACTIVE (&child_procs[i])) | 899 | if (CHILD_ACTIVE (&child_procs[i]) |
| 900 | || child_procs[i].procinfo.hProcess != NULL) | ||
| 900 | { | 901 | { |
| 901 | child_proc_count = i + 1; | 902 | child_proc_count = i + 1; |
| 902 | break; | 903 | break; |
| @@ -913,7 +914,8 @@ find_child_pid (DWORD pid) | |||
| 913 | child_process *cp; | 914 | child_process *cp; |
| 914 | 915 | ||
| 915 | for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--) | 916 | for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--) |
| 916 | if (CHILD_ACTIVE (cp) && pid == cp->pid) | 917 | if ((CHILD_ACTIVE (cp) || cp->procinfo.hProcess != NULL) |
| 918 | && pid == cp->pid) | ||
| 917 | return cp; | 919 | return cp; |
| 918 | return NULL; | 920 | return NULL; |
| 919 | } | 921 | } |