version 1.35, 2007/11/09 18:51:10
|
version 1.42, 2013/07/04 11:44:44
|
Line 134 sub catchexception {
|
Line 134 sub catchexception {
|
|
|
sub child_announce_death { |
sub child_announce_death { |
$SIG{USR1} = \&child_announce_death; |
$SIG{USR1} = \&child_announce_death; |
$extra_children++; |
if ($extra_children < $PREFORK*10) { |
|
$extra_children++; |
|
} |
} |
} |
|
|
# ---------------------------------------------------------------- Main program |
# ---------------------------------------------------------------- Main program |
Line 257 sub make_new_child {
|
Line 259 sub make_new_child {
|
|
|
&logthis('New process started'); |
&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 |
# soft/hard_close can take awhile and we really |
# don't care we just want it gone |
# don't care we just want it gone |
$SIG{INT} = sub { |
$SIG{INT} = sub { |
Line 266 sub make_new_child {
|
Line 272 sub make_new_child {
|
exit; |
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++) { |
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 ("display2d:false;kill(all);\n"); |
&sync($command); |
|
print $command ("display2d:false;simp:true;kill(all);\n"); |
&getmaximaoutput($command,2); |
&getmaximaoutput($command,2); |
&sync($command); |
&sync($command); |
my $syntaxerr = 0; |
my $syntaxerr = 0; |
Line 299 sub make_new_child {
|
Line 303 sub make_new_child {
|
kill('USR1' => $ppid); |
kill('USR1' => $ppid); |
print $command ("quit();\n"); |
print $command ("quit();\n"); |
# tidy up gracefully and finish |
# tidy up gracefully and finish |
|
sleep(15); |
$command->soft_close(); |
$command->soft_close(); |
|
|
# this exit is VERY important, otherwise the child will become |
# this exit is VERY important, otherwise the child will become |
Line 333 sub getmaximaoutput {
|
Line 337 sub getmaximaoutput {
|
if ($numcheck eq 2) { |
if ($numcheck eq 2) { |
# command was the killall so should get a full reset on |
# command was the killall so should get a full reset on |
# command numbers |
# command numbers |
$regexp = '(\(\%i(1)\)|Incorrect syntax\:)'; |
$regexp = '(\(\%i(1)\)|[Ii]ncorrect syntax\:)'; |
} elsif ($command->match() =~ /\(\%i(\d+)\)/) { |
} elsif ($command->match() =~ /\(\%i(\d+)\)/) { |
my $nextmatch = $1+1; |
my $nextmatch = $1+1; |
$regexp = '(\(\%i'.$nextmatch.'\)|Incorrect syntax\:)'; |
$regexp = '(\(\%i'.$nextmatch.'\)|[Ii]ncorrect syntax\:)'; |
} |
} |
} |
} |
my $timeout = 20; |
my $timeout = 20; |
my (undef,$error,$matched,$output) = |
my (undef,$error,$matched,$output) = |
$command->expect($timeout, -re => $regexp); |
$command->expect($timeout, -re => $regexp); |
|
|
if ($numcheck && $matched eq 'Incorrect syntax:') { |
if ($numcheck && lc($matched) eq 'incorrect syntax:') { |
$syntaxerr = 1; |
$syntaxerr = 1; |
if (wantarray) { |
if (wantarray) { |
return ($matched,$syntaxerr); |
return ($matched,$syntaxerr); |
Line 354 sub getmaximaoutput {
|
Line 358 sub getmaximaoutput {
|
if ($error) { |
if ($error) { |
return 'Error: '.$error; |
return 'Error: '.$error; |
} |
} |
$output =~ s/\r+//g; # Remove Windows-style linebreaks |
$output =~ s/\r+//gs; # Remove Windows-style linebreaks |
my $foundoutput=0; |
my $foundoutput=0; |
my $found_label=0; |
my $found_label=0; |
my $realoutput=''; |
my $realoutput=''; |
foreach my $line (split(/\n/,$output)) { |
foreach my $line (split(/\n/,$output)) { |
if ($line=~/\;/) { $foundoutput=1; next; } |
if ($line=~/\;/) { $foundoutput=1; next; } |
if (!$foundoutput) { next; } |
if (!$foundoutput) { next; } |
if ($line=~/^Incorrect syntax:/) { $syntaxerr = 1; next; } |
if ($line=~/^[Ii]ncorrect syntax:/) { $syntaxerr = 1; next; } |
if ($line=~ /^(\(\%o\d+\))(.+)$/){ |
if ($line=~ /^(\(\%o\d+\))(.+)$/){ |
my $label = $1; |
my $label = $1; |
$line = $2; |
$line = $2; |