Commit 928931f5 authored by Guillaume Huard's avatar Guillaume Huard
Browse files

Bugfix : attente bloquante en raison d'une erreur de select ignorée

parent 588f6031
......@@ -186,13 +186,12 @@ deux réglages évitant une trop grande utilisation des ressources disponibles :
car, dans ce cas, un programme trop long sera terminé par le module VPL lui-même, mettant fin au
script interne de cette activité sans qu'aucune note n'ait été produite ;
- =output_limit= : taille à partir de laquelle la sortie standard écrite par le programme soumis
n'est plus prise en compte (10Ko par défaut). La limite peut être désactivée en donnant une valeur
négative pour ce réglage. Ceci est déconseillé car, dans ce cas, un programme produisant une
sortie trop volumineuse résultera en une erreur d'épuisement de la mémoire mettant fin au script
interne de cette activité (qui travaille intégralement en mémoire) sans qu'aucune note n'ait été
produite. Remarque : quand les limites sont activées, il est possible que le programme reçoive un
signal 13 (SIGPIPE), dans ce cas l'activité peut signaler le débordement de sortie standard, dans
le cas contraire elle ira jusqu'au timeout ;
n'est plus prise en compte (10Ko par défaut). Si le test dépasse la limite de volume de sortie, il
reçoit un signal 13 (SIGPIPE) et se termine s'il n'attrape pas ce signal. La limite peut être
désactivée en donnant une valeur négative pour ce réglage. Ceci est déconseillé car, dans ce cas,
un programme produisant une sortie trop volumineuse résultera en une erreur d'épuisement de la
mémoire mettant fin au script interne de cette activité (qui travaille intégralement en mémoire)
sans qu'aucune note n'ait été produite ;
- =error_limit= : similaire à =output_limit= pour la sortie d'erreur standard.
L'exemple suivant comprend une petite série de tests avec limites, qui passe pour tout programme
s'exécutant en moins de 2 secondes et ayant un code de retour nul. En outre, pour les tests 2 et 3,
......
......@@ -110,8 +110,13 @@ sub sets_add($$$) {
sub sets_select($) {
my $sets = shift;
my $avail = $sets->{avail};
my $nfound = select($avail->{read} = $sets->{read}, $avail->{write} = $sets->{write},
$avail->{except} = $sets->{except}, undef);
$avail->{read} = $sets->{read};
$avail->{write} = $sets->{write};
$avail->{except} = $sets->{except};
my $nfound = select($avail->{read}, $avail->{write}, $avail->{except}, undef);
if ($nfound == -1) {
debug("Unexpected select error $!\n");
}
}
sub sets_avail($$) {
......@@ -119,9 +124,9 @@ sub sets_avail($$) {
my $stream = shift;
my $set = $sets->{$stream};
my $fd = fileno($stream);
# if (vec($sets->{avail}->{except}, $fd, 1)) {
# debug("Unexpected exceptionnal condition on command fd $fd with $set access\n");
# }
if (vec($sets->{avail}->{except}, $fd, 1)) {
debug("Unexpected exceptionnal condition on command fd $fd with $set access\n");
}
return vec($sets->{avail}->{$set}, $fd, 1);
}
......@@ -146,8 +151,10 @@ sub sets_remove($$) {
my $set = $sets->{$stream};
my $fd = fileno($stream);
vec($sets->{$set}, $fd, 1) = 0;
vec($sets->{except}, $fd, 1) = 0;
$sets->{left}--;
close($stream);
# debug("$set stream $stream (fd $fd) removed\n");
}
# Runs a command associated to a test with a given input, returns a hash that holds the content of standard output and error as well as exit code
......@@ -164,10 +171,6 @@ sub run_command($$$$) {
(exists($test->{compile})?"":" (and no 'compile' directive found)"));
if (exists($test->{args})) {
@arguments = @{$test->{args}};
# for my $arg (@{$test->{args}}) {
# $arg =~ s/"/\\"/g;
# $arguments .= '"'.$arg.'" ';
# }
}
debug("Executing $command");
if ($has_limits) {
......@@ -227,7 +230,9 @@ sub run_command($$$$) {
$number = sets_access($sets, $child->{$part}, \$data->{$part}, $size, $done->{$part});
if (!defined($number)) {
if ($!{EINTR} || $!{EAGAIN} || $!{EWOULDBLOCK}) {
debug("Access to command temporarily failed for reason $!\n");
debug("Access to command $part temporarily failed for reason $!, ".
"errors EINTR $!{EINTR} EAGAIN $!{EAGAIN} EWOULDBLOCK $!{EWOULDBLOCK}, ".
"size $size done $done->{$part}\n");
} else {
debug("Error $! during access to command $part\n");
sets_remove($sets, $child->{$part});
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment