diff options
Diffstat (limited to 'ACE/bin/PerlACE/Process_Win32.pm')
-rw-r--r-- | ACE/bin/PerlACE/Process_Win32.pm | 68 |
1 files changed, 63 insertions, 5 deletions
diff --git a/ACE/bin/PerlACE/Process_Win32.pm b/ACE/bin/PerlACE/Process_Win32.pm index ace30cb05bd..0cbbd42ab99 100644 --- a/ACE/bin/PerlACE/Process_Win32.pm +++ b/ACE/bin/PerlACE/Process_Win32.pm @@ -171,7 +171,13 @@ sub IgnoreExeSubDir { my $self = shift; - if (@_ != 0) { + # If we have -Config ARCH, do not set IGNOREEXESUBDIR, since with ARCH + # all executables (even those in $ACE_ROOT/bin, etc.) are located in the + # architecture-specific subdirectory. + if (@_ != 0 && !grep(($_ eq 'ARCH'), @PerlACE::ConfigList::Configs)) { + $self->{IGNOREEXESUBDIR} = shift; + } + elsif (@_ != 0 && $self->{EXECUTABLE} =~ /perl$/) { $self->{IGNOREEXESUBDIR} = shift; } @@ -229,6 +235,9 @@ sub Spawn () my $cmdline = ""; my $executable = ""; + my $chdir_needed = 0; + my $curdir_bak; + if (defined $self->{PURIFY_CMD}) { my $orig_cmdline = $self->CommandLine (); $executable = $self->{PURIFY_CMD}; @@ -286,24 +295,51 @@ sub Spawn () $cmdline = "cmd /C start /B /WAIT $self->{WINCE_CTL} $pocket_device_opts -m NAME=start_test.cmd;WAIT=401000; -e" } elsif (defined $ENV{'ACE_TEST_WINDOW'}) { - $state = ($ENV{'ACE_TEST_WINDOW'} =~ /\/k/i ? CREATE_NEW_CONSOLE : DETACHED_PROCESS); - $executable = $ENV{'ComSpec'}; - $cmdline = $ENV{'ACE_TEST_WINDOW'} . ' ' . $self->CommandLine(); + $state = ($ENV{'ACE_TEST_WINDOW'} =~ /\/k/i ? CREATE_NEW_CONSOLE : DETACHED_PROCESS); + $executable = $ENV{'ComSpec'}; + $cmdline = $ENV{'ACE_TEST_WINDOW'} . ' ' . $self->CommandLine(); } else { $executable = $self->Executable (); $cmdline = $self->CommandLine (); + if ((defined $self->{TARGET}) && ($ENV{'ACE_ROOT'} ne $self->{TARGET}->ACE_ROOT ())) { + $chdir_needed = 1; + $curdir_bak = cwd (); + chdir (dirname ($executable)); + } } if (defined $ENV{'ACE_TEST_VERBOSE'}) { print "$executable $cmdline\n"; } + my %backup_ENV = %ENV; + # update environment for target + if (defined $self->{TARGET}) { + if (!defined $self->{TARGET}->{REMOTE_SHELL}) { + my $x_env_ref = $self->{TARGET}->{EXTRA_ENV}; + while ( my ($env_key, $env_value) = each(%$x_env_ref) ) { + if (defined $ENV{'ACE_TEST_VERBOSE'}) { + print "INFO: adding target environment $env_key=$env_value\n"; + } + $ENV{$env_key} = $env_value; + } + } + if ($self->{TARGET}->{LIBPATH}) { + if (defined $ENV{'ACE_TEST_VERBOSE'}) { + print "INFO: adding target libpath ".$self->{TARGET}->{LIBPATH}."\n"; + } + PerlACE::add_lib_path ($self->{TARGET}->{LIBPATH}); + } + } my $status = Win32::Process::Create ($self->{PROCESS}, $executable, $cmdline, ($state == 0 ? 1 : 0), $state, '.'); - + %ENV = %backup_ENV; + if ($chdir_needed) { + chdir ($curdir_bak); + } if ($status == 0) { print STDERR "ERROR: Spawn failed for <", $self->CommandLine (), ">\n"; return -1; @@ -416,4 +452,26 @@ sub TimedWait ($) return $self->Wait($timeout); } +### + +sub kill_all +{ + my $procmask = shift; + my $target = shift; + my $pid = -1; + for my $line (`tasklist /nh /fo csv`) { + # find matching process line + if ($line =~ /$procmask/) { + # find process PID + if ($line =~ /^\"[^\"]+\",\"(\d+)\",/) { + $pid = $1; + Win32::Process::KillProcess ($pid, 0); # kill process + if (defined $ENV{'ACE_TEST_VERBOSE'}) { + print STDERR "INFO: Killed process at [$line]\n" + } + } + } + } +} + 1; |