Loading mysql-test/lib/My/SafeProcess.pm +28 −14 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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 => $$, Loading Loading @@ -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 # Loading @@ -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 Loading mysql-test/lib/My/SafeProcess/Base.pm +2 −26 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; } Loading @@ -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'; Loading Loading
mysql-test/lib/My/SafeProcess.pm +28 −14 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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 => $$, Loading Loading @@ -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 # Loading @@ -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 Loading
mysql-test/lib/My/SafeProcess/Base.pm +2 −26 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; } Loading @@ -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'; Loading