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.
string fenFile = (is >> token) ? token : "default";
string limitType = (is >> token) ? token : "depth";
string fenFile = (is >> token) ? token : "default";
string limitType = (is >> token) ? token : "depth";
- Options["Hash"] = ttSize;
+ Search::clear(); // Wait for search finished
Options["Threads"] = threads;
Options["Threads"] = threads;
+ Options["Hash"] = ttSize;
if (limitType == "time")
limits.movetime = stoi(limit); // movetime is in millisecs
if (limitType == "time")
limits.movetime = stoi(limit); // movetime is in millisecs
#include "position.h"
#include "search.h"
#include "thread.h"
#include "position.h"
#include "search.h"
#include "thread.h"
#include "uci.h"
#include "syzygy/tbprobe.h"
#include "uci.h"
#include "syzygy/tbprobe.h"
Bitbases::init();
Search::init();
Pawns::init();
Bitbases::init();
Search::init();
Pawns::init();
+ Tablebases::init(Options["SyzygyPath"]);
+ TT.resize(Options["Hash"]);
+ Search::clear(); // After threads are up
-/// Search::clear() resets search state to its initial value, to obtain reproducible results
+/// Search::clear() resets search state to its initial value
+ Threads.main()->wait_for_search_finished();
+
+ Time.availableNodes = 0;
TT.clear();
for (Thread* th : Threads)
TT.clear();
for (Thread* th : Threads)
Threads.start_thinking(pos, States, limits);
}
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;
- }
-
Position pos;
string token, cmd;
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]) + " ";
for (int i = 1; i < argc; ++i)
cmd += std::string(argv[i]) + " ";
<< "\n" << Options
<< "\nuciok" << sync_endl;
<< "\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);
else if (token == "isready") sync_cout << "readyok" << sync_endl;
else if (token == "go") go(pos, is);
else if (token == "position") position(pos, is);
} while (token != "quit" && argc == 1); // Passed args have one-shot behaviour
Threads.main()->wait_for_search_finished();
} while (token != "quit" && argc == 1); // Passed args have one-shot behaviour
Threads.main()->wait_for_search_finished();