[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