Module: wine Branch: master Commit: d316d548c2006b14efd5e822be05e83f3cbc7d6f URL: https://source.winehq.org/git/wine.git/?a=commit;h=d316d548c2006b14efd5e822b...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Mar 11 18:09:42 2021 +0100
server: Only keep the running processes in the global process list.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernel32/tests/process.c | 1 - server/console.c | 3 +-- server/process.c | 21 +++++++-------------- 3 files changed, 8 insertions(+), 17 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 108851000ff..1c47f8a3b64 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -4231,7 +4231,6 @@ static void test_dead_process(void) } offset += spi->NextEntryOffset; } while (spi->NextEntryOffset); - todo_wine ok( !found, "process still enumerated\n" ); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); diff --git a/server/console.c b/server/console.c index 92bda51846c..848ee6e8d98 100644 --- a/server/console.c +++ b/server/console.c @@ -649,8 +649,7 @@ static int propagate_console_signal_cb(struct process *process, void *user) { struct console_signal_info* csi = (struct console_signal_info*)user;
- if (process->console == csi->console && process->running_threads && - (!csi->group || process->group_id == csi->group)) + if (process->console == csi->console && (!csi->group || process->group_id == csi->group)) { /* find a suitable thread to signal */ struct thread *thread; diff --git a/server/process.c b/server/process.c index e5fe7cc6b6e..0d550328312 100644 --- a/server/process.c +++ b/server/process.c @@ -559,7 +559,6 @@ struct process *create_process( int fd, struct process *parent, int inherit_all, list_init( &process->rawinput_devices );
process->end_time = 0; - list_add_tail( &process_list, &process->entry );
if (sd && !default_set_sd( &process->obj, sd, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION )) @@ -646,7 +645,6 @@ static void process_destroy( struct object *obj ) } if (process->console) release_object( process->console ); if (process->msg_fd) release_object( process->msg_fd ); - list_remove( &process->entry ); if (process->idle_event) release_object( process->idle_event ); if (process->id) free_ptid( process->id ); if (process->token) release_object( process->token ); @@ -804,15 +802,11 @@ restart: /* kill all processes */ static void kill_all_processes(void) { - for (;;) - { - struct process *process; + struct list *ptr;
- LIST_FOR_EACH_ENTRY( process, &process_list, struct process, entry ) - { - if (process->running_threads) break; - } - if (&process->entry == &process_list) break; /* no process found */ + while ((ptr = list_head( &process_list ))) + { + struct process *process = LIST_ENTRY( ptr, struct process, entry ); terminate_process( process, NULL, 1 ); } } @@ -828,7 +822,6 @@ void kill_console_processes( struct thread *renderer, int exit_code ) LIST_FOR_EACH_ENTRY( process, &process_list, struct process, entry ) { if (process == renderer->process) continue; - if (!process->running_threads) continue; if (process->console && console_get_renderer( process->console ) == renderer) break; } if (&process->entry == &process_list) break; /* no process found */ @@ -875,6 +868,7 @@ void add_process_thread( struct process *process, struct thread *thread ) list_add_tail( &process->thread_list, &thread->proc_entry ); if (!process->running_threads++) { + list_add_tail( &process_list, &process->entry ); running_processes++; if (!process->is_system) { @@ -901,6 +895,7 @@ void remove_process_thread( struct process *process, struct thread *thread ) /* we have removed the last running thread, exit the process */ process->exit_code = thread->exit_code; generate_debug_event( thread, DbgExitProcessStateChange, process ); + list_remove( &process->entry ); process_killed( process ); } else generate_debug_event( thread, DbgExitThreadStateChange, thread ); @@ -979,10 +974,8 @@ void detach_debugged_processes( struct debug_obj *debug_obj, int exit_code )
/* find the first process being debugged by 'debugger' and still running */ LIST_FOR_EACH_ENTRY( process, &process_list, struct process, entry ) - { - if (!process->running_threads) continue; if (process->debug_obj == debug_obj) break; - } + if (&process->entry == &process_list) break; /* no process found */ if (exit_code) {