--- loncom/lonmaxima 2006/03/08 22:30:11 1.16 +++ loncom/lonmaxima 2006/05/10 02:15:51 1.20 @@ -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.20 2006/05/10 02:15:51 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 @@ -52,6 +52,7 @@ my $pidfile; # my $port; # path to UNIX socket file my %perlvar; # configuration file info my $lastlog; # last string that was logged + use vars qw($PREFORK $MAX_CLIENTS_PER_CHILD %children $children $status $pidfile $port %perlvar $lastlog); @@ -243,6 +244,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 +254,22 @@ 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); + &sync($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; + } + &sync($command); + &status('Waiting for commands'); } } @@ -269,9 +284,28 @@ sub make_new_child { } } +{ + my $counter; + sub sync { + my ($command)=@_; + $counter++; + my $expect=$counter.time; + print $command "$expect;\n"; + while (1) { + my $output=&getmaximaoutput($command); + if (($output=~/\Q$expect\E/) || ($output=~/^Error\:/)) { + return; + } + } + } +} + 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)) {