Rémi Bernon : server: Wait for process exit more often and using increasing delay.

Alexandre Julliard julliard at winehq.org
Fri Nov 12 16:16:04 CST 2021


Module: wine
Branch: master
Commit: c37a6e8e40e50e96e4e8a5414ce702f0156fde77
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=c37a6e8e40e50e96e4e8a5414ce702f0156fde77

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Wed Nov 10 10:26:45 2021 +0100

server: Wait for process exit more often and using increasing delay.

Instead of waiting for 1s before considering it dead, when most of the
time the process dies quickly, delaying desktop or wineserver shutdown.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 server/process.c | 19 +++++++++++++++----
 server/process.h |  1 +
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/server/process.c b/server/process.c
index 48b5d6d6dd4..343ad78270c 100644
--- a/server/process.c
+++ b/server/process.c
@@ -595,10 +595,20 @@ static void process_died( struct process *process )
 static void process_sigkill( void *private )
 {
     struct process *process = private;
+    int signal = 0;
 
-    process->sigkill_timeout = NULL;
-    kill( process->unix_pid, SIGKILL );
-    process_died( process );
+    process->sigkill_delay *= 2;
+    if (process->sigkill_delay >= TICKS_PER_SEC / 2)
+        signal = SIGKILL;
+
+    if (!kill( process->unix_pid, signal ) && !signal)
+        process->sigkill_timeout = add_timeout_user( -process->sigkill_delay, process_sigkill, process );
+    else
+    {
+        process->sigkill_delay = TICKS_PER_SEC / 64;
+        process->sigkill_timeout = NULL;
+        process_died( process );
+    }
 }
 
 /* start the sigkill timer for a process upon exit */
@@ -606,7 +616,7 @@ static void start_sigkill_timer( struct process *process )
 {
     grab_object( process );
     if (process->unix_pid != -1)
-        process->sigkill_timeout = add_timeout_user( -TICKS_PER_SEC, process_sigkill, process );
+        process->sigkill_timeout = add_timeout_user( -process->sigkill_delay, process_sigkill, process );
     else
         process_died( process );
 }
@@ -630,6 +640,7 @@ struct process *create_process( int fd, struct process *parent, unsigned int fla
     process->handles         = NULL;
     process->msg_fd          = NULL;
     process->sigkill_timeout = NULL;
+    process->sigkill_delay   = TICKS_PER_SEC / 64;
     process->unix_pid        = -1;
     process->exit_code       = STILL_ACTIVE;
     process->running_threads = 0;
diff --git a/server/process.h b/server/process.h
index 55e4d6dced6..22ee8178368 100644
--- a/server/process.h
+++ b/server/process.h
@@ -53,6 +53,7 @@ struct process
     process_id_t         group_id;        /* group id of the process */
     unsigned int         session_id;      /* session id */
     struct timeout_user *sigkill_timeout; /* timeout for final SIGKILL */
+    timeout_t            sigkill_delay;   /* delay before final SIGKILL */
     unsigned short       machine;         /* client machine type */
     int                  unix_pid;        /* Unix pid for final SIGKILL */
     int                  exit_code;       /* process exit code */




More information about the wine-cvs mailing list