From 0d2d5fce275e4de10d53a8f6350a4a0b7e23e2b1 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard <julliard@winehq.org> Date: Fri, 20 Jun 2008 20:42:51 +0200 Subject: [PATCH] server: Move the process pipe hangup handling into kill_process. This ensures that it's also done correctly when a read from the pipe returns EOF. (cherry picked from commit 24ec4a6ed7bf5c7c8edadc7da3bd5f6160a4d53d) --- server/process.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/server/process.c b/server/process.c index f4277163561..51ada6ebc0c 100644 --- a/server/process.c +++ b/server/process.c @@ -459,18 +459,7 @@ static void process_poll_event( struct fd *fd, int event ) struct process *process = get_fd_user( fd ); assert( process->obj.ops == &process_ops ); - if (event & (POLLERR | POLLHUP)) - { - release_object( process->msg_fd ); - process->msg_fd = NULL; - if (process->sigkill_timeout) /* already waiting for it to die */ - { - remove_timeout_user( process->sigkill_timeout ); - process->sigkill_timeout = NULL; - process_died( process ); - } - else kill_process( process, 0 ); - } + if (event & (POLLERR | POLLHUP)) kill_process( process, 0 ); else if (event & POLLIN) receive_fd( process ); } @@ -736,6 +725,20 @@ void resume_process( struct process *process ) /* kill a process on the spot */ void kill_process( struct process *process, int violent_death ) { + if (!violent_death && process->msg_fd) /* normal termination on pipe close */ + { + release_object( process->msg_fd ); + process->msg_fd = NULL; + } + + if (process->sigkill_timeout) /* already waiting for it to die */ + { + remove_timeout_user( process->sigkill_timeout ); + process->sigkill_timeout = NULL; + process_died( process ); + return; + } + if (violent_death) terminate_process( process, NULL, 1 ); else { -- GitLab