use POSIX qw//;
use File::Basename qw/fileparse/;
+use File::Slurp qw/write_file/;
use Gruntmaster::Daemon::Constants qw/TLE OLE DIED NZX/;
use Time::HiRes qw/alarm/;
use List::MoreUtils qw/natatime/;
+use Log::Log4perl qw/get_logger/;
use IPC::Signal qw/sig_name sig_num/;
-our $VERSION = "5999-TRIAL";
+our $VERSION = "5999.000_002";
our @EXPORT_OK = qw/prepare_files/;
##################################################
given($format) {
"./$basename" when [qw/C CPP PASCAL/];
"./$basename.exe" when 'MONO';
- "java $basename" when 'JAVA';
- "perl $basename" when 'PERL';
- "python $basename" when 'PYTHON';
+ java => $basename when 'JAVA';
+ perl => $basename when 'PERL';
+ python => $basename when 'PYTHON';
default { die "Don't know how to execute format $format" }
}
}
sub mkrun{
my $format = shift;
sub{
+ local *__ANON__ = 'mkrun_runner';
my ($name, %args) = @_;
+ get_logger->trace("Running $name...");
my $basename = fileparse $name, qr/\.[^.]*/;
my $ret = fork // die 'Cannot fork';
if ($ret) {
my $tle;
local $SIG{ALRM} = sub { kill KILL => $ret; $tle = 1};
alarm $args{timeout} if exists $args{timeout};
- wait;
+ waitpid $ret, 0;
alarm 0;
my $sig = $? & 127;
my $signame = sig_name $sig;
die [TLE, "Time Limit Exceeded"] if $tle;
die [OLE, 'Output Limit Exceeded'] if $sig && $signame eq 'XFSZ';
- die [DIED, "Crash (SIG$signame)"] if $sig;
- die [NZX, "Non-zero exit status: " . ($? >> 8)] if $?;
+ die [DIED, "Crash (SIG$signame)"] if $sig && $signame != 'PIPE';
+ die [NZX, "Non-zero exit status: " . ($? >> 8)] if $? >> 8;
} else {
my @fds = exists $args{fds} ? @{$args{fds}} : ();
$^F = 50;
sub prepare{
my ($name, $format) = @_;
- our $errors;
- my $basename = fileparse $name, qr/\.[^.]*/;
get_logger->trace("Preparing file $name...");
- $errors .= `gruntmaster-compile $format $basename $name 2>&1`;
- $errors .= "\n";
+ $Gruntmaster::Daemon::errors .= `gruntmaster-compile $format $name 2>&1`;
+ $Gruntmaster::Daemon::errors .= "\n";
die 'Compile error' if $?
}