Alexandre Julliard : server: Kill the process without SIGTERM when the fd socket is closed.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Sep 25 09:46:31 CDT 2006


Module: wine
Branch: master
Commit: 81977b773bcff2c07f476c5ff3126323145480ae
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=81977b773bcff2c07f476c5ff3126323145480ae

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Sep 21 11:14:45 2006 +0200

server: Kill the process without SIGTERM when the fd socket is closed.

---

 server/process.c |   40 ++++++++++++++++++++++++++++------------
 server/process.h |    2 +-
 server/request.c |   12 ++++++------
 3 files changed, 35 insertions(+), 19 deletions(-)

diff --git a/server/process.c b/server/process.c
index b36ca37..c50641b 100644
--- a/server/process.c
+++ b/server/process.c
@@ -408,7 +408,7 @@ static void process_poll_event( struct f
             process->sigkill_timeout = NULL;
             process_died( process );
         }
-        else kill_process( process, NULL, 0 );
+        else kill_process( process, 0 );
     }
     else if (event & POLLIN) receive_fd( process );
 }
@@ -512,6 +512,20 @@ static void process_unload_dll( struct p
     else set_error( STATUS_INVALID_PARAMETER );
 }
 
+/* terminate a process with the given exit code */
+static void terminate_process( struct process *process, struct thread *skip, int exit_code )
+{
+    struct list *ptr, *next;
+
+    LIST_FOR_EACH_SAFE( ptr, next, &process->thread_list )
+    {
+        struct thread *thread = LIST_ENTRY( ptr, struct thread, proc_entry );
+
+        if (exit_code) thread->exit_code = exit_code;
+        if (thread != skip) kill_thread( thread, 1 );
+    }
+}
+
 /* kill all processes */
 void kill_all_processes( struct process *skip, int exit_code )
 {
@@ -525,7 +539,7 @@ void kill_all_processes( struct process 
             if (process->running_threads) break;
         }
         if (&process->entry == &process_list) break;  /* no process found */
-        kill_process( process, NULL, exit_code );
+        terminate_process( process, NULL, exit_code );
     }
 }
 
@@ -544,7 +558,7 @@ void kill_console_processes( struct thre
             if (process->console && process->console->renderer == renderer) break;
         }
         if (&process->entry == &process_list) break;  /* no process found */
-        kill_process( process, NULL, exit_code );
+        terminate_process( process, NULL, exit_code );
     }
 }
 
@@ -638,16 +652,18 @@ void resume_process( struct process *pro
 }
 
 /* kill a process on the spot */
-void kill_process( struct process *process, struct thread *skip, int exit_code )
+void kill_process( struct process *process, int violent_death )
 {
-    struct list *ptr, *next;
-
-    LIST_FOR_EACH_SAFE( ptr, next, &process->thread_list )
+    if (violent_death) terminate_process( process, NULL, 1 );
+    else
     {
-        struct thread *thread = LIST_ENTRY( ptr, struct thread, proc_entry );
+        struct list *ptr, *next;
 
-        if (exit_code) thread->exit_code = exit_code;
-        if (thread != skip) kill_thread( thread, 1 );
+        LIST_FOR_EACH_SAFE( ptr, next, &process->thread_list )
+        {
+            struct thread *thread = LIST_ENTRY( ptr, struct thread, proc_entry );
+            kill_thread( thread, 0 );
+        }
     }
 }
 
@@ -666,7 +682,7 @@ void kill_debugged_processes( struct thr
         }
         if (&process->entry == &process_list) break;  /* no process found */
         process->debugger = NULL;
-        kill_process( process, NULL, exit_code );
+        terminate_process( process, NULL, exit_code );
     }
 }
 
@@ -960,7 +976,7 @@ DECL_HANDLER(terminate_process)
     if ((process = get_process_from_handle( req->handle, PROCESS_TERMINATE )))
     {
         reply->self = (current->process == process);
-        kill_process( process, current, req->exit_code );
+        terminate_process( process, current, req->exit_code );
         release_object( process );
     }
 }
diff --git a/server/process.h b/server/process.h
index c447e2f..af84719 100644
--- a/server/process.h
+++ b/server/process.h
@@ -120,7 +120,7 @@ extern void remove_process_thread( struc
 extern void suspend_process( struct process *process );
 extern void resume_process( struct process *process );
 extern void kill_all_processes( struct process *skip, int exit_code );
-extern void kill_process( struct process *process, struct thread *skip, int exit_code );
+extern void kill_process( struct process *process, int violent_death );
 extern void kill_console_processes( struct thread *renderer, int exit_code );
 extern void kill_debugged_processes( struct thread *debugger, int exit_code );
 extern void break_process( struct process *process );
diff --git a/server/request.c b/server/request.c
index ac5a696..b0cebd5 100644
--- a/server/request.c
+++ b/server/request.c
@@ -402,13 +402,13 @@ #endif
 
     if (!ret)
     {
-        kill_process( process, NULL, 0 );
+        kill_process( process, 0 );
     }
     else if (ret > 0)
     {
         fprintf( stderr, "Protocol error: process %04x: partial recvmsg %d for fd\n",
                  process->id, ret );
-        kill_process( process, NULL, 1 );
+        kill_process( process, 1 );
     }
     else
     {
@@ -416,7 +416,7 @@ #endif
         {
             fprintf( stderr, "Protocol error: process %04x: ", process->id );
             perror( "recvmsg" );
-            kill_process( process, NULL, 1 );
+            kill_process( process, 1 );
         }
     }
     return -1;
@@ -450,17 +450,17 @@ #endif  /* HAVE_STRUCT_MSGHDR_MSG_ACCRIG
     if (ret >= 0)
     {
         fprintf( stderr, "Protocol error: process %04x: partial sendmsg %d\n", process->id, ret );
-        kill_process( process, NULL, 1 );
+        kill_process( process, 1 );
     }
     else if (errno == EPIPE)
     {
-        kill_process( process, NULL, 0 );
+        kill_process( process, 0 );
     }
     else
     {
         fprintf( stderr, "Protocol error: process %04x: ", process->id );
         perror( "sendmsg" );
-        kill_process( process, NULL, 1 );
+        kill_process( process, 1 );
     }
     return -1;
 }




More information about the wine-cvs mailing list