[PATCH v2 1/2] server: Wait for process exit more often and using increasing delay.

Rémi Bernon rbernon at codeweavers.com
Wed Nov 10 03:26:45 CST 2021


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

This saves ~2s on the prefix shutdown time, as measured with:

  time bash -c 'wine cmd /c exit |& tee /dev/null'

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---

v2: Rebase on upstream HEAD.

 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 */
-- 
2.33.1




More information about the wine-devel mailing list