1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 00:33:09 +00:00

Fix some races and clarify the code

Better split code that should be run at
startup from code run at ucinewgame. Also
fix several races when 'bench', 'perft' and
'ucinewgame' are sent just after 'bestomve'
from the engine threads are still running.

Also use a specific UI thread instead of
main thread when setting up the Position
object used by UI uci loop. This fixes a
race when sending 'eval' command while searching.

We accept a race on 'setoption' to allow the
GUI to change an option while engine is searching
withouth stalling the pipe. Note that changing an
option while searchingg is anyhow not mandated by
UCI protocol.

No functional change.
This commit is contained in:
Marco Costalba 2017-08-06 04:43:02 -07:00
parent dbc984d9f8
commit 750dfa0521
4 changed files with 14 additions and 16 deletions

View file

@ -109,9 +109,9 @@ void benchmark(const Position& current, istream& is) {
string fenFile = (is >> token) ? token : "default";
string limitType = (is >> token) ? token : "depth";
Options["Hash"] = ttSize;
Search::clear(); // Wait for search finished
Options["Threads"] = threads;
Search::clear();
Options["Hash"] = ttSize;
if (limitType == "time")
limits.movetime = stoi(limit); // movetime is in millisecs

View file

@ -24,6 +24,7 @@
#include "position.h"
#include "search.h"
#include "thread.h"
#include "tt.h"
#include "uci.h"
#include "syzygy/tbprobe.h"
@ -42,7 +43,10 @@ int main(int argc, char* argv[]) {
Bitbases::init();
Search::init();
Pawns::init();
Tablebases::init(Options["SyzygyPath"]);
TT.resize(Options["Hash"]);
Threads.init();
Search::clear(); // After threads are up
UCI::loop(argc, argv);

View file

@ -183,10 +183,13 @@ void Search::init() {
}
/// Search::clear() resets search state to its initial value, to obtain reproducible results
/// Search::clear() resets search state to its initial value
void Search::clear() {
Threads.main()->wait_for_search_finished();
Time.availableNodes = 0;
TT.clear();
for (Thread* th : Threads)

View file

@ -138,15 +138,6 @@ namespace {
Threads.start_thinking(pos, States, limits);
}
// On ucinewgame following steps are needed to reset the state
void newgame() {
TT.resize(Options["Hash"]);
Search::clear();
Tablebases::init(Options["SyzygyPath"]);
Time.availableNodes = 0;
}
} // namespace
@ -160,10 +151,9 @@ void UCI::loop(int argc, char* argv[]) {
Position pos;
string token, cmd;
Thread* uiThread = new Thread();
newgame(); // Implied ucinewgame before the first position command
pos.set(StartFEN, false, &States->back(), Threads.main());
pos.set(StartFEN, false, &States->back(), uiThread);
for (int i = 1; i < argc; ++i)
cmd += std::string(argv[i]) + " ";
@ -197,7 +187,7 @@ void UCI::loop(int argc, char* argv[]) {
<< "\n" << Options
<< "\nuciok" << sync_endl;
else if (token == "ucinewgame") newgame();
else if (token == "ucinewgame") Search::clear();
else if (token == "isready") sync_cout << "readyok" << sync_endl;
else if (token == "go") go(pos, is);
else if (token == "position") position(pos, is);
@ -225,6 +215,7 @@ void UCI::loop(int argc, char* argv[]) {
} while (token != "quit" && argc == 1); // Passed args have one-shot behaviour
Threads.main()->wait_for_search_finished();
delete uiThread;
}