Wait for uciok before handling GUI input
authorH.G. Muller <h.g.muller@hccnet.nl>
Tue, 17 Apr 2012 18:09:56 +0000 (20:09 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Tue, 17 Apr 2012 18:09:56 +0000 (20:09 +0200)
WinBoard does not apply a feature timeout when restarting an engine that
had reuse=0, but immediately starts sending commands. This caused the
memory command to be ignored, because it arrived when UCI2WB had not seen
the engine's Hash option yet. Now UCI2WB stalls processing GUI commands
after receiving 'protover' until it sees 'uciok' from the engine.

UCI2WB.c

index 2ea2512..fa37c42 100644 (file)
--- a/UCI2WB.c
+++ b/UCI2WB.c
@@ -239,7 +239,7 @@ Engine2GUI()
            if(sscanf(line, "id name %[^\n]", name) == 1) printf("feature myname=\"%s (U%cI2WB)\"\n", name, sc-32);\r
        }\r
        else if(!strcmp(command, "readyok")) { pause = 0; Sync(WAKEUP); } // resume processing of GUI commands\r
-       else if(sscanf(command, "u%ciok", &c)==1 && c==sc)   printf("feature smp=1 memory=%d done=1\n", hasHash); // done with options\r
+       else if(sscanf(command, "u%ciok", &c)==1 && c==sc)   printf("feature smp=1 memory=%d done=1\n", hasHash), Sync(WAKEUP); // done with options\r
     }\r
 }\r
 \r
@@ -332,7 +332,8 @@ GUI2Engine()
            if(!variants) variants = sc=='s' ? "shogi,5x5+5_shogi" : VARIANTS;\r
            printf("feature variants=\"%s\" setboard=1 usermove=1 debug=1 ping=1 reuse=0 done=0\n", variants);\r
            printf("feature option=\"UCI2WB debug output -check %d\"\n", debug);\r
-           fprintf(toE, "u%ci\n", sc); // this prompts UCI engine for options\r
+           fprintf(toE, "u%ci\n", sc); fflush(toE); // this prompts UCI engine for options\r
+           Sync(PAUSE); // wait for uciok\r
        }\r
        else if(!strcmp(command, "setboard")) {\r
                if(strstr(line+9, " b ")) stm = BLACK;\r