Hi,
OK, I have something that works and that seems half-decently coded. Here is a sample output for Randyplus with threaded genmove: ----- 30 genmove black =30 d1
40 genmove white 50 abort ?40 aborted
=50
60 genmove white =60 e11
-----
If you ask me how I managed to type the abort: I introduced a 10-second "thinking" delay in the separate genmove thread. ;-)
The implementation is coded using basic POSIX pthreads calls, so the basic algorithm should work on anything that has POSIX pthreads.
To abort the separate genmove thread, I have used the pthreads call pthreads_cancel( ).
In the threaded genmove, I use the call: pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); when I reach the commit point. Beyond that point, the cancel request is not honoured anymore.
All the changes to my original code were made in gtp.cpp.
Limitations: 1) Presently only genmove can be aborted (this can be extended easily but I didn't try it). 2) Abort only works if it is the first command following the genmove. Other commands will block, waiting for genmove to finish. 3) There must be a clearly established "commit point" in the genmove routine, beyond which it should not be cancelled.
Thanks to Bill and Gunnar for the necessary clarifying. Up to you now if you want to include "abort" as an optional GTP command!
Rather than packaging Randyplus again, I am attaching the bzipped diff file (2KB) if anyone wants to try it out.