Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
projet
VPLPP
Commits
928931f5
Commit
928931f5
authored
Jun 06, 2020
by
Guillaume Huard
Browse files
Bugfix : attente bloquante en raison d'une erreur de select ignorée
parent
588f6031
Changes
2
Hide whitespace changes
Inline
Side-by-side
Basic_System.org
View file @
928931f5
...
...
@@ -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,
...
...
Basic_System/ef/vpl_evaluate.pl
View file @
928931f5
...
...
@@ -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
});
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment