From c37a6e8e40e50e96e4e8a5414ce702f0156fde77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Wed, 10 Nov 2021 10:26:45 +0100 Subject: [PATCH] server: Wait for process exit more often and using increasing delay. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Alexandre Julliard --- 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 */