--- loncom/lonmaxima 2006/03/08 22:30:11 1.16 +++ loncom/lonmaxima 2006/03/09 21:38:26 1.17 @@ -3,7 +3,7 @@ # The LearningOnline Network with CAPA # Connect to MAXIMA CAS # -# $Id: lonmaxima,v 1.16 2006/03/08 22:30:11 www Exp $ +# $Id: lonmaxima,v 1.17 2006/03/09 21:38:26 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -44,7 +44,7 @@ use strict; # global variables my $PREFORK = 5; # number of children to maintain -my $MAX_CLIENTS_PER_CHILD = 5; # number of clients each child should process +my $MAX_CLIENTS_PER_CHILD = 50; # number of clients each child should process my %children = (); # keys are current child process IDs my $children = 0; # current number of children my $status; # string for current status @@ -243,6 +243,8 @@ sub make_new_child { sigprocmask(SIG_UNBLOCK, $sigset) or die("Can't unblock SIGINT for fork: $!\n"); + &logthis('New process started'); + my $command=Expect->spawn('maxima'); $command->log_stdout(0); @@ -251,10 +253,20 @@ sub make_new_child { for (my $i=0; $i < $MAX_CLIENTS_PER_CHILD; $i++) { &status('Accepting connections'); my $client = $server->accept() or last; + print $command "kill(all);reset();\n"; + &getmaximaoutput($command); while (my $cmd=<$client>) { &status('Processing command'); - print $command &unescape($cmd).";\n"; - print $client &escape(&getmaximaoutput($command))."\n"; + print $command &unescape($cmd); + my $reply=&getmaximaoutput($command); + print $client &escape($reply)."\n"; + if ($reply=~/^Error\:/) { + &logthis('Died through '.$reply); + $client->close(); + $command->hard_close(); + exit; + } + &status('Waiting for commands'); } } @@ -271,7 +283,10 @@ sub make_new_child { sub getmaximaoutput { my ($command)=@_; - my (undef,undef,undef,$output)=$command->expect(20, -re => '\(\%i\d+\)'); + my (undef,$error,undef,$output)=$command->expect(20, -re => '\(\%i\d+\)'); + if ($error) { + return 'Error: '.$error; + } my $foundoutput=0; my $realoutput=''; foreach my $line (split(/\n/,$output)) {