diff --git a/mysql-test/lib/My/SafeProcess.pm b/mysql-test/lib/My/SafeProcess.pm index f990d889a02..655960222e7 100644 --- a/mysql-test/lib/My/SafeProcess.pm +++ b/mysql-test/lib/My/SafeProcess.pm @@ -148,7 +148,7 @@ sub new { print "### safe_path: ", $safe_path, " ", join(" ", @safe_args), "\n" if $verbose > 1; - my ($pid, $winpid)= create_process( + my $pid= create_process( path => $safe_path, input => $input, output => $output, @@ -161,7 +161,7 @@ sub new { my $proc= bless ({ SAFE_PID => $pid, - SAFE_WINPID => $winpid, + SAFE_WINPID => $pid, # Inidicates this is always a real process SAFE_NAME => $name, SAFE_SHUTDOWN => $shutdown, PARENT => $$, @@ -296,6 +296,18 @@ sub shutdown { } +sub _winpid ($) { + my ($pid)= @_; + + # In win32 perl, the pid is already the winpid + return $pid unless IS_CYGWIN; + + # In cygwin, the pid is the pseudo process -> + # get the real winpid of my_safe_process + return Cygwin::pid_to_winpid($pid); +} + + # # Tell the process to die as fast as possible # @@ -305,22 +317,24 @@ sub start_kill { _verbose("start_kill: $self"); my $ret= 1; - my $pid; + my $pid= $self->{SAFE_PID}; + die "INTERNAL ERROR: no pid" unless defined $pid; + if (IS_WINDOWS and defined $self->{SAFE_WINPID}) { die "INTERNAL ERROR: no safe_kill" unless defined $safe_kill; - die "INTERNAL ERROR: no winpid" unless defined $self->{SAFE_WINPID}; - # Use my_safe_kill to tell my_safe_process - # it's time to kill it's child and return - $pid= $self->{SAFE_WINPID}; - $ret= system($safe_kill, $pid) >> 8; - if (IS_CYGWIN and $ret == 3) - { - print "safe_process is gone, kickstart the fake process, $self\n"; - if (kill(15, $self->{SAFE_PID}) != 1){ - print STDERR "Failed to kickstart the fake process\n"; - } + my $winpid= _winpid($pid); + $ret= system($safe_kill, $winpid) >> 8; + + if ($ret == 3){ + print "Couldn't open the winpid: $winpid ", + "for pid: $pid, try one more time\n"; + sleep(1); + $winpid= _winpid($pid); + $ret= system($safe_kill, $winpid) >> 8; + print "Couldn't open the winpid: $winpid ", + "for pid: $pid, continue and see what happens...\n"; } } else diff --git a/mysql-test/lib/My/SafeProcess/Base.pm b/mysql-test/lib/My/SafeProcess/Base.pm index 2f3cf9d037a..3fc1b1be017 100644 --- a/mysql-test/lib/My/SafeProcess/Base.pm +++ b/mysql-test/lib/My/SafeProcess/Base.pm @@ -33,30 +33,6 @@ use base qw(Exporter); our @EXPORT= qw(create_process); -sub winpid { - my ($pid)= @_; - - return undef unless $^O eq "cygwin"; - - # The child get a new winpid when the exec takes - # place, wait for that to happen - my $winpid; - my $delay= 0; - do - { - # Yield to the child - select(undef, undef, undef, $delay); - # Increase the delay slightly for each loop - $delay += 0.000001; - - $winpid= Cygwin::pid_to_winpid($pid); - - } until ($winpid != $pid); - - return $winpid; -} - - # # safe_fork @@ -179,7 +155,7 @@ sub create_process { or croak("unable to reestablish STDIN"); #printf STDERR "stdin %d, stdout %d, stderr %d\n", # fileno STDIN, fileno STDOUT, fileno STDERR; - return wantarray ? ($pid, $pid) : $pid; + return $pid; } @@ -190,7 +166,7 @@ sub create_process { # Parent $pipe->reader(); my $line= <$pipe>; # Wait for child to say it's ready - return wantarray ? ($pid, winpid($pid)) : $pid; + return $pid; } $SIG{INT}= 'DEFAULT';