Diff for /loncom/lonmaxima between versions 1.16 and 1.18

version 1.16, 2006/03/08 22:30:11 version 1.18, 2006/05/10 01:08:01
Line 44  use strict; Line 44  use strict;
   
 # global variables  # global variables
 my $PREFORK                = 5;        # number of children to maintain  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               = ();       # keys are current child process IDs
 my $children               = 0;        # current number of children  my $children               = 0;        # current number of children
 my $status;                            # string for current status  my $status;                            # string for current status
Line 52  my $pidfile;                           # Line 52  my $pidfile;                           #
 my $port;                              # path to UNIX socket file  my $port;                              # path to UNIX socket file
 my %perlvar;                           # configuration file info  my %perlvar;                           # configuration file info
 my $lastlog;                           # last string that was logged  my $lastlog;                           # last string that was logged
   
 use vars qw($PREFORK $MAX_CLIENTS_PER_CHILD %children $children $status  use vars qw($PREFORK $MAX_CLIENTS_PER_CHILD %children $children $status
     $pidfile $port %perlvar $lastlog);      $pidfile $port %perlvar $lastlog);
     
Line 243  sub make_new_child { Line 244  sub make_new_child {
         sigprocmask(SIG_UNBLOCK, $sigset)          sigprocmask(SIG_UNBLOCK, $sigset)
             or die("Can't unblock SIGINT for fork: $!\n");              or die("Can't unblock SIGINT for fork: $!\n");
   
           &logthis('New process started');
   
         my $command=Expect->spawn('maxima');          my $command=Expect->spawn('maxima');
         $command->log_stdout(0);          $command->log_stdout(0);
   
Line 251  sub make_new_child { Line 254  sub make_new_child {
         for (my $i=0; $i < $MAX_CLIENTS_PER_CHILD; $i++) {          for (my $i=0; $i < $MAX_CLIENTS_PER_CHILD; $i++) {
            &status('Accepting connections');             &status('Accepting connections');
            my $client = $server->accept()     or last;             my $client = $server->accept()     or last;
              print $command "kill(all);reset();\n";
              &getmaximaoutput($command);
            while (my $cmd=<$client>) {             while (my $cmd=<$client>) {
               &status('Processing command');                &status('Processing command');
               print $command &unescape($cmd).";\n";        &sync($command);
               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');
            }             }
         }          }
   
Line 269  sub make_new_child { Line 283  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 {  sub getmaximaoutput {
     my ($command)=@_;      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 $foundoutput=0;
     my $realoutput='';      my $realoutput='';
     foreach my $line (split(/\n/,$output)) {      foreach my $line (split(/\n/,$output)) {

Removed from v.1.16  
changed lines
  Added in v.1.18


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>