- given($format) {
- "./$basename" when [qw/C CPP PASCAL/];
- "./$basename.exe" when 'MONO';
- "java $basename" when 'JAVA';
- "perl $basename" when 'PERL';
- "python $basename" when 'PYTHON';
- default { die "Don't know how to execute format $format" }
+sub runvm {
+ my ($name, $arg) = @_;
+ return unless $ENV{GRUNTMASTER_VM};
+ my $cmd = $ENV{GRUNTMASTER_VM};
+ $cmd .= ' ' . $arg if $arg;
+ get_logger->trace("Starting VM $name ($cmd)");
+ $vm{$name} = Expect->new;
+ $vm{$name}->raw_pty(1);
+ $vm{$name}->log_stdout(0);
+ $vm{$name}->spawn($cmd);
+ $vm{$name}->expect(5, '# ') or get_logger->logdie("Error while starting VM $name: ". $vm{$name}->error);
+}
+
+sub stopvms {
+ kill KILL => $_->pid for values %vm;
+ %vm = %pid = ();
+}
+
+sub execlist_finish {
+ my ($vm, $kill) = @_;
+
+ if ($vm{$vm}) {
+ warn "Cannot kill VM\n" if $kill;
+ $vm{$vm}->expect(5, '# ');
+ } else {
+ kill KILL => $pid{$vm} if $kill;
+ waitpid $pid{$vm}, 0;
+ }
+ return if $kill;
+
+ my $er = "exec-result-$vm";
+ die "gruntmaster-exec died\n" if -z $er;
+ my ($excode, $exmsg) = read_file $er;
+ unlink $er;
+ chomp ($excode, $exmsg); ## no critic (ProhibitParensWithBuiltins)
+ get_logger->trace("Exec result from $vm: $excode $exmsg");
+ die [$excode, $exmsg] if $excode; ## no critic (RequireCarping)
+}
+
+sub execlist {
+ my ($vm, @args) = @_;
+ my $er = "exec-result-$vm";
+ if ($vm{$vm}) {
+ my $cmd = ">$er " . shell_quote 'gruntmaster-exec', @args;
+ get_logger->trace("Running in VM $vm: $cmd");
+ $vm{$vm}->send($cmd, "\n");
+ } else {
+ $pid{$vm} = fork // die "Cannot fork\n";
+ unless ($pid{$vm}) {
+ open STDOUT, '>', $er or die "Cannot open $er\n";
+ get_logger->trace("Running: gruntmaster-exec @args");
+ exec 'gruntmaster-exec', @args;
+ }