[LON-CAPA-cvs] cvs: loncom /xml run.pm
albertel
lon-capa-cvs@mail.lon-capa.org
Mon, 24 Mar 2003 22:43:31 -0000
albertel Mon Mar 24 17:43:31 2003 EDT
Modified files:
/loncom/xml run.pm
Log:
- hard_timeout wasn't a good idea, now setting alarms and more gracefully exit
Index: loncom/xml/run.pm
diff -u loncom/xml/run.pm:1.31 loncom/xml/run.pm:1.32
--- loncom/xml/run.pm:1.31 Mon Jun 24 17:23:26 2002
+++ loncom/xml/run.pm Mon Mar 24 17:43:31 2003
@@ -1,6 +1,6 @@
package Apache::run;
#
-# $Id: run.pm,v 1.31 2002/06/24 21:23:26 albertel Exp $
+# $Id: run.pm,v 1.32 2003/03/24 22:43:31 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -37,51 +37,68 @@
ENDEVALUATE
sub evaluate {
- my ($expression,$safeeval,$decls) = @_;
- unless (defined($expression)) { return ''; }
- if ($Apache::lonxml::evaluate < 1) { return $expression; }
- my $result = '';
- $@='';
- if ($Apache::lonxml::request) {
- $Apache::lonxml::request->hard_timeout("Apache::run::run, evaluation $code");
- }
- $safeeval->reval('{'.$decls.';$_=<<\'EXPRESSION\';'."\n".$expression.
- "\n".'EXPRESSION'."\n".$EVALUATE_STRING.'}');
- if ($Apache::lonxml::request) { $Apache::lonxml::request->kill_timeout; }
-# $safeeval->reval('{'.$decls.';<< &evaluate(q|'.$expression.'|);}');
- my $error=$@;
- if ($@ eq '') {
- $result = $safeeval->reval('return $_;');
- chomp $result;
- } else {
- &Apache::lonxml::error('substitution on <pre>'.$expression.
- '</pre> with <pre>'.$decls.
- '</pre> caused <pre>'.$error);
- }
- return $result
+ my ($expression,$safeeval,$decls) = @_;
+ unless (defined($expression)) { return ''; }
+ if ($Apache::lonxml::evaluate < 1) { return $expression; }
+ my $result = '';
+ $@='';
+ $Apache::run::timeout=0;
+ $main::SIG{'ALRM'} = sub {
+ $Apache::run::timeout=1;
+ Apache->request->print("timeout<br /> \n");
+ };
+ eval {
+ alarm(Apache->request->server->timeout);
+ $safeeval->reval('{'.$decls.';$_=<<\'EXPRESSION\';'."\n".$expression.
+ "\n".'EXPRESSION'."\n".$EVALUATE_STRING.'}');
+ alarm(0);
+ };
+ my $error=$@;
+ if ($error eq '' && !$Apache::run::timeout) {
+ $result = $safeeval->reval('return $_;');
+ chomp $result;
+ } else {
+ if ($Apache::run::timeout) {
+ $error = 'Code ran too long. It ran for more than '.
+ Apache->request->server->timeout.' seconds';
+ }
+ &Apache::lonxml::error('substitution on <pre>'.$expression.
+ '</pre> with <pre>'.$decls.
+ '</pre> caused <pre>'.$error);
+ }
+ return $result
}
sub run {
- my ($code,$safeeval,$hideerrors) = @_;
-# print "inside run\n";
- $@='';
- if ($Apache::lonxml::request) {
- $Apache::lonxml::request->hard_timeout("Apache::run::run, evaluation $code");
- }
- my (@result)=$safeeval->reval($code);
- if ($Apache::lonxml::request) { $Apache::lonxml::request->kill_timeout; }
- my $error=$@;
- if ($error ne '' && !$hideerrors) {
- &Apache::lonxml::error('<pre>'.&HTML::Entities::encode($error).
- '</pre> occured while running <pre>'.
- &HTML::Entities::encode($code).'</pre>');
- }
- if ( $#result < '1') {
- return $result[0];
- } else {
- &Apache::lonxml::debug("<b>Got lots results</b>:$#result:");
- return (@result);
- }
+ my ($code,$safeeval,$hideerrors) = @_;
+ my @result;
+ $@='';
+ $Apache::run::timeout=0;
+ $main::SIG{'ALRM'} = sub {
+ $Apache::run::timeout=1;
+ Apache->request->print("timeout<br /> \n");
+ };
+ eval {
+ alarm(Apache->request->server->timeout);
+ @result=$safeeval->reval($code);
+ alarm(0);
+ };
+ my $error=$@;
+ if (($Apache::run::timeout || $error ne '') && !$hideerrors) {
+ if ($Apache::run::timeout) {
+ $error = 'Code ran too long. It ran for more than '.
+ Apache->request->server->timeout.' seconds';
+ }
+ &Apache::lonxml::error('<pre>'.&HTML::Entities::encode($error).
+ '</pre> occured while running <pre>'.
+ &HTML::Entities::encode($code).'</pre>');
+ }
+ if ( $#result < '1') {
+ return $result[0];
+ } else {
+ &Apache::lonxml::debug("<b>Got lots results</b>:$#result:");
+ return (@result);
+ }
}
sub dump {