Have threads and processes exit more cleanly whenever possible.

diff --git a/server/process.c b/server/process.c
index 8073e55..07b2a0a 100644
--- a/server/process.c
+++ b/server/process.c
@@ -399,10 +399,16 @@
 }
 
 /* kill a process on the spot */
-void kill_process( struct process *process, int exit_code )
+static void kill_process( struct process *process, struct thread *skip, int exit_code )
 {
-    while (process->thread_list)
-        kill_thread( process->thread_list, exit_code );
+    struct thread *thread = process->thread_list;
+    while (thread)
+    {
+        struct thread *next = thread->proc_next;
+        thread->exit_code = exit_code;
+        if (thread != skip) kill_thread( thread, 1 );
+        thread = next;
+    }
 }
 
 /* kill all processes being debugged by a given thread */
@@ -416,7 +422,7 @@
             process = process->next;
         if (!process) return;
         process->debugger = NULL;
-        kill_process( process, exit_code );
+        kill_process( process, NULL, exit_code );
     }
 }
 
@@ -678,7 +684,8 @@
 
     if ((process = get_process_from_handle( req->handle, PROCESS_TERMINATE )))
     {
-        kill_process( process, req->exit_code );
+        req->self = (current->process == process);
+        kill_process( process, current, req->exit_code );
         release_object( process );
     }
 }