Alexandre Julliard : server: Make terminate_process more robust against recursive calls for the same process .
Alexandre Julliard
julliard at winehq.org
Tue Feb 2 10:45:26 CST 2010
Module: wine
Branch: master
Commit: 349eba9e0944c24cfd6623f063b84a05adba6dcb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=349eba9e0944c24cfd6623f063b84a05adba6dcb
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Feb 1 16:22:53 2010 +0100
server: Make terminate_process more robust against recursive calls for the same process.
---
server/process.c | 18 ++++++------------
1 files changed, 6 insertions(+), 12 deletions(-)
diff --git a/server/process.c b/server/process.c
index 379bec6..e4dca68 100644
--- a/server/process.c
+++ b/server/process.c
@@ -562,23 +562,17 @@ static void process_unload_dll( struct process *process, mod_handle_t base )
/* terminate a process with the given exit code */
static void terminate_process( struct process *process, struct thread *skip, int exit_code )
{
- struct list *ptr;
-
- if (skip && skip->process == process) /* move it to the end of the list */
- {
- assert( skip->state != TERMINATED );
- list_remove( &skip->proc_entry );
- list_add_tail( &process->thread_list, &skip->proc_entry );
- }
+ struct thread *thread;
grab_object( process ); /* make sure it doesn't get freed when threads die */
- while ((ptr = list_head( &process->thread_list )))
+restart:
+ LIST_FOR_EACH_ENTRY( thread, &process->thread_list, struct thread, proc_entry )
{
- struct thread *thread = LIST_ENTRY( ptr, struct thread, proc_entry );
-
if (exit_code) thread->exit_code = exit_code;
- if (thread == skip) break;
+ if (thread == skip) continue;
+ if (thread->state == TERMINATED) continue;
kill_thread( thread, 1 );
+ goto restart;
}
release_object( process );
}
More information about the wine-cvs
mailing list