--- loncom/lonmaxima 2007/11/09 18:51:10 1.35 +++ loncom/lonmaxima 2018/12/05 23:02:38 1.44 @@ -3,7 +3,7 @@ # The LearningOnline Network with CAPA # Connect to MAXIMA CAS # -# $Id: lonmaxima,v 1.35 2007/11/09 18:51:10 albertel Exp $ +# $Id: lonmaxima,v 1.44 2018/12/05 23:02:38 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -134,7 +134,9 @@ sub catchexception { sub child_announce_death { $SIG{USR1} = \&child_announce_death; - $extra_children++; + if ($extra_children < $PREFORK*10) { + $extra_children++; + } } # ---------------------------------------------------------------- Main program @@ -154,8 +156,8 @@ my $wwwid=getpwnam('www'); if ($wwwid!=$<) { my $emailto="$perlvar{'lonAdmEMail'},$perlvar{'lonSysEMail'}"; my $subj="LON: User ID mismatch"; - system("echo 'User ID mismatch. lonmaxima must be run as user www.' |\ - mailto $emailto -s '$subj' > /dev/null"); + system("echo 'User ID mismatch. lonmaxima must be run as user www.' |". + " mail -s '$subj' $emailto > /dev/null"); exit 1; } @@ -257,7 +259,11 @@ sub make_new_child { &logthis('New process started'); - my $command=Expect->spawn('maxima'); + my $command = new Expect(); + $command->log_stdout(0); + #$command->log_file("$execdir/logs/lonmaxima.session.log"); + $command->spawn('maxima'); + &getmaximaoutput($command, 2); # wait for maxima to finish initialization # soft/hard_close can take awhile and we really # don't care we just want it gone $SIG{INT} = sub { @@ -266,14 +272,12 @@ sub make_new_child { exit; }; - $command->log_stdout(0); - #$command->log_file("$execdir/logs/lonmaxima.session.log"); - &sync($command); for (my $i=0; $i < $MAX_CLIENTS_PER_CHILD; $i++) { &status('Accepting connections'); my $client = $server->accept() or last; - print $command ("display2d:false;kill(all);\n"); + &sync($command); + print $command ("display2d:false;simp:true;kill(all);\n"); &getmaximaoutput($command,2); &sync($command); my $syntaxerr = 0; @@ -299,7 +303,7 @@ sub make_new_child { kill('USR1' => $ppid); print $command ("quit();\n"); # tidy up gracefully and finish - + sleep(15); $command->soft_close(); # this exit is VERY important, otherwise the child will become @@ -333,17 +337,17 @@ sub getmaximaoutput { if ($numcheck eq 2) { # command was the killall so should get a full reset on # command numbers - $regexp = '(\(\%i(1)\)|Incorrect syntax\:)'; + $regexp = '(\(\%i(1)\)|[Ii]ncorrect syntax\:)'; } elsif ($command->match() =~ /\(\%i(\d+)\)/) { my $nextmatch = $1+1; - $regexp = '(\(\%i'.$nextmatch.'\)|Incorrect syntax\:)'; + $regexp = '(\(\%i'.$nextmatch.'\)|[Ii]ncorrect syntax\:)'; } } my $timeout = 20; my (undef,$error,$matched,$output) = $command->expect($timeout, -re => $regexp); - if ($numcheck && $matched eq 'Incorrect syntax:') { + if ($numcheck && lc($matched) eq 'incorrect syntax:') { $syntaxerr = 1; if (wantarray) { return ($matched,$syntaxerr); @@ -354,14 +358,14 @@ sub getmaximaoutput { if ($error) { return 'Error: '.$error; } - $output =~ s/\r+//g; # Remove Windows-style linebreaks + $output =~ s/\r+//gs; # Remove Windows-style linebreaks my $foundoutput=0; my $found_label=0; my $realoutput=''; foreach my $line (split(/\n/,$output)) { if ($line=~/\;/) { $foundoutput=1; next; } if (!$foundoutput) { next; } - if ($line=~/^Incorrect syntax:/) { $syntaxerr = 1; next; } + if ($line=~/^[Ii]ncorrect syntax:/) { $syntaxerr = 1; next; } if ($line=~ /^(\(\%o\d+\))(.+)$/){ my $label = $1; $line = $2;