]> git.sesse.net Git - remoteglot/blobdiff - remoteglot.pl
Fix so update is not indefinitely delayed by engine chatter.
[remoteglot] / remoteglot.pl
index cdabf43d382053d8fff9613b487a1379269be545..2f38f8ac61b8ed7ab3f7b931171950be8b9fdec1 100755 (executable)
@@ -24,6 +24,7 @@ my $engine2_cmdline = "./stockfish_13111119_x64_modern_sse42";
 my $telltarget = undef;   # undef to be silent
 my @tell_intervals = (5, 20, 60, 120, 240, 480, 960);  # after each move
 my $uci_assume_full_compliance = 0;                    # dangerous :-)
+my $update_max_interval = 2.0;
 my $second_engine_start_depth = 8;
 my @masters = (
        'Sesse',
@@ -35,6 +36,7 @@ my @masters = (
 
 # Program starts here
 $SIG{ALRM} = sub { output_screen(); };
+my $latest_update = undef;
 
 $| = 1;
 
@@ -52,8 +54,8 @@ $| = 1;
 select(STDOUT);
 
 # open the chess engine
-my $engine = open_engine($engine_cmdline);
-my $engine2 = open_engine($engine2_cmdline);
+my $engine = open_engine($engine_cmdline, 'E1');
+my $engine2 = open_engine($engine2_cmdline, 'E2');
 my ($last_move, $last_tell);
 my $last_text = '';
 my $last_told_text = '';
@@ -190,8 +192,7 @@ while (1) {
                }
                $sleep = 0;
 
-               # don't update too often
-               Time::HiRes::alarm(0.2);
+               output_screen();
        }
        if ($nfound > 0 && vec($rout, fileno($engine2->{'read'}), 1) == 1) {
                my @lines = read_lines($engine2);
@@ -200,8 +201,7 @@ while (1) {
                }
                $sleep = 0;
 
-               # don't update too often
-               Time::HiRes::alarm(0.2);
+               output_screen();
        }
 
        sleep $sleep;
@@ -213,7 +213,7 @@ sub handle_uci {
        chomp $line;
        $line =~ tr/\r//d;
        $line =~ s/  / /g;  # Sometimes needed for Zappa Mexico
-       print UCILOG localtime() . " <= $line\n";
+       print UCILOG localtime() . " $engine->{'tag'} <= $line\n";
        if ($line =~ /^info/) {
                my (@infos) = split / /, $line;
                shift @infos;
@@ -619,9 +619,17 @@ sub prettyprint_pv {
 
 sub output_screen {
        #return;
-       
+
        return if (!defined($pos_calculating));
 
+       # Don't update too often.
+       my $age = Time::HiRes::tv_interval($latest_update);
+       if ($age < $update_max_interval) {
+               Time::HiRes::alarm($update_max_interval + 0.01 - $age);
+               return;
+       }
+       $latest_update = [Time::HiRes::gettimeofday];
+
        my $info = $engine->{'info'};
        my $id = $engine->{'id'};
 
@@ -737,7 +745,7 @@ sub output_screen {
        for my $move (keys %refutation_moves) {
                eval {
                        my $m = $refutation_moves{$move};
-                       next if ($m->{'depth'} < $second_engine_start_depth);
+                       die if ($m->{'depth'} < $second_engine_start_depth);
                        my $pretty_move = join('', prettyprint_pv($pos_calculating->{'board'}, $move));
                        my @pretty_pv = prettyprint_pv($pos_calculating->{'board'}, $move, @{$m->{'pv'}});
                        if (scalar @pretty_pv > 5) {
@@ -1028,7 +1036,7 @@ sub can_reach {
 sub uciprint {
        my ($engine, $msg) = @_;
        print { $engine->{'write'} } "$msg\n";
-       print UCILOG localtime() . " => $msg\n";
+       print UCILOG localtime() . " $engine->{'tag'} => $msg\n";
 }
 
 sub short_score {
@@ -1164,7 +1172,7 @@ sub book_info {
 }
 
 sub open_engine {
-       my $cmdline = shift;
+       my ($cmdline, $tag) = @_;
        my ($uciread, $uciwrite);
        my $pid = IPC::Open2::open2($uciread, $uciwrite, $cmdline);
 
@@ -1175,6 +1183,7 @@ sub open_engine {
                write => $uciwrite,
                info => {},
                ids => {},
+               tag => $tag,
        };
 
        uciprint($engine, "uci");