Make sure 'quit' is sent to tardy engine
authorH.G.Muller <hgm@hgm-xboard.(none)>
Fri, 21 Dec 2018 13:20:55 +0000 (14:20 +0100)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Fri, 21 Dec 2018 13:20:55 +0000 (14:20 +0100)
We try to wake up an engine that should quit by sending it 'stop',
but that does not help when we are waiting for 'readyok' or 'uciok'.
To make sure 'quit' is sent before an impatient GUI kills us when we
are waiting for a tardy engine to produce these, we no have the GUI
thread sent an extra 'quit' after 500 msec, which will get to the engine
even when the engine thread remains blocked waiting for the engine until
the GUI kills us. The delay will also prevent excessive queueing of
'quit' commands when an EOF occurs because the GUI closes the stdin pipe.

UCI2WB.c

index 7cdf340..1140969 100644 (file)
--- a/UCI2WB.c
+++ b/UCI2WB.c
@@ -25,6 +25,8 @@
 #  include <sys/time.h>\r
    int GetTickCount() // with thanks to Tord\r
    { struct timeval t; gettimeofday(&t, NULL); return t.tv_sec*1000 + t.tv_usec/1000; }\r
+//#  include <unistd.h>\r
+   int Sleep(int msec) { return usleep(1000*msec); }\r
 #endif\r
 #include <fcntl.h>\r
 #include <string.h>\r
@@ -527,6 +529,8 @@ GUI2Engine()
        if(qStart == qEnd) qStart = qEnd = queue;\r
        p = line; while(qEnd < queue+10000 && (*qEnd++ = *p++) != '\n') {}\r
        Sync(WAKEUP);\r
+       // when 'stop' doesn't catch engine's attention in reasonable time, so the GUI might kill us:\r
+       if(!strcmp(command, "quit")) { Sleep(500); EPRINT((f, "quit\n")); } // make sure 'quit' is still sent\r
       }\r
     }\r
 }\r