[LON-CAPA-cvs] cvs: loncom /interface printout.pl

foxr lon-capa-cvs-allow@mail.lon-capa.org
Mon, 28 Jan 2008 11:24:49 -0000


foxr		Mon Jan 28 06:24:49 2008 EDT

  Modified files:              
    /loncom/interface	printout.pl 
  Log:
  BZ5548 - Timeout latex jobs that don't make dvi file grow after 10 seconds.
  
  
  
Index: loncom/interface/printout.pl
diff -u loncom/interface/printout.pl:1.128 loncom/interface/printout.pl:1.129
--- loncom/interface/printout.pl:1.128	Thu Oct 11 18:49:49 2007
+++ loncom/interface/printout.pl	Mon Jan 28 06:24:48 2008
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc.
 #
-# $Id: printout.pl,v 1.128 2007/10/11 22:49:49 albertel Exp $
+# $Id: printout.pl,v 1.129 2008/01/28 11:24:48 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -379,14 +379,14 @@
       my $dvi_file= $name_file; $dvi_file =~ s/\.tex/$name_range\.dvi/;
       &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
 			 "for $status_statement now LaTeXing file",
-			 \%prog_state,$dvi_file);
+			 \%prog_state,$dvi_file, 10);
       if ($tableofcontents eq 'yes') {
       &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
 			 "for $status_statement First LaTeX of file for table of contents",
-			 \%prog_state,$dvi_file);
+			 \%prog_state,$dvi_file, 10);
       &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
 			 "for $status_statement Second LaTeX of file for table of contents",
-			 \%prog_state,$dvi_file);
+			 \%prog_state,$dvi_file,10);
       } #to create table of contents
       my $idxname=$name_file;
       $idxname=~s/\.tex$/\.idx/;
@@ -396,7 +396,7 @@
 			     \%prog_state,$idxname);
 	  &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
 			     "for $status_statement now LaTeXing file for index section",
-			     \%prog_state,$dvi_file);
+			     \%prog_state,$dvi_file,10);
       } #to create index
       #Do we have a latex error in the log file?
       my $logfilename = $texfile; $logfilename =~ s/\.tex$/\.log/;
@@ -512,14 +512,14 @@
 	      #
 	      &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
 				 "for $status_statement first latex to repaginate",
-				 \%prog_state, $name_file);
+				 \%prog_state, $name_file,10);
 	      if ($tableofcontents eq 'yes') {
 		  &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
 				     "for $status_statement second latex to repaginate",
-				     \%prog_state, $name_file);
+				     \%prog_state, $name_file,10);
 		  &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
 				     "for $status_statement third latex to repaginate",
-				     \%prog_state, $name_file);
+				     \%prog_state, $name_file,10);
 	      }
 	      if ($tableofindex eq 'yes') {
 		  my $idxname = $latex_file;
@@ -529,7 +529,7 @@
 				     \%prog_state, $idxname);
 		  &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
 				     "for $status_statement now Recreting index (latex)",
-				     \%prog_state, $dvi_file);
+				     \%prog_state, $dvi_file,10);
 
 	      }
 	      &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
@@ -685,14 +685,14 @@
 	      &repaginate($new_name_file, $latex_file,  $numberofcolumns);
 	      &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
 				 "for $status_statement first latex to repaginate",
-				 \%prog_state, $name_file);
+				 \%prog_state, $name_file,10);
 	      if ($tableofcontents eq 'yes') {
 		  &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
 				     "for $status_statement second latex to repaginate",
-				     \%prog_state, $name_file);
+				     \%prog_state, $name_file,10);
 		  &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
 				     "for $status_statement third latex to repaginate",
-				     \%prog_state, $name_file);
+				     \%prog_state, $name_file,10);
 	      }
 	      if ($tableofindex eq 'yes') {
 		  my $idxname = $latex_file;
@@ -702,7 +702,7 @@
 				     \%prog_state, $idxname);
 		  &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
 				     "for $status_statement now Recreting index (latex)",
-				     \%prog_state, $dvi_file);
+				     \%prog_state, $dvi_file,10);
 	      }
 	      &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
 				 "for $status_statement dvips to repaginate",
@@ -794,9 +794,17 @@
 sub REAPER {
     $done=1;
 }
-
+#
+#  Execute a command updating the status window as the command's
+#  output file builds up (at intervals of a second).
+#
+#   If the timeout argument defined, then if that many seconds
+#   elapses without an increase in the size of the output file,
+#   the command will be killed (this deals with the case when
+#   latex crawls into an infinite loop).
+#
 sub busy_wait_command {
-    my ($command,$message,$progress_win,$output_file)=@_;
+    my ($command,$message,$progress_win,$output_file, $timeout)=@_;
     
     $SIG{CHLD} = \&REAPER;
     $done=0;
@@ -804,12 +812,23 @@
     if ($advanced_role) {
 	&Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,$message);
     }
+    my $last_size      = 0;
+    my $unchanged_time = 0;
     while(!$done) {
 	sleep 1;
 	my $extra_msg;
 	if ($output_file) {
 	    my $size=(stat($output_file))[7];
 	    $extra_msg=", $size bytes generated";
+	    if ($size == $last_size) {
+		$unchanged_time++;
+		if ($timeout && ($unchanged_time > $timeout)) {
+		    kill(9, $pid); # Reaper will do the rest...I hope there's errors in the log.
+		}
+	    } else {
+		$last_size      = $size;
+		$unchanged_time = 0;
+	    }
 	}
 	if ($advanced_role) {
 	    &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,