From: Marco Costalba Date: Sun, 22 Mar 2015 11:41:11 +0000 (+0100) Subject: Allow Bitbases::init() to be called more than once X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=dc3a5f791ebf235444864e633564561811fa1244;ds=sidebyside Allow Bitbases::init() to be called more than once Currently if we call it more than once, we crash. This is not a real problem, because this function is indeed called just once. Nevertheless with this small fix, that gets rid of a hidden 'static' variable, we cleanly resolve the issue. While there, fix also ThreadPool::exit to return in a consistent state. Now all the init() functions but UCI::init() are reentrant and can be called multiple times. No functional change. --- diff --git a/src/bitbase.cpp b/src/bitbase.cpp index ebf3c59a..b3ae5c5f 100644 --- a/src/bitbase.cpp +++ b/src/bitbase.cpp @@ -85,9 +85,10 @@ bool Bitbases::probe(Square wksq, Square wpsq, Square bksq, Color us) { void Bitbases::init() { std::vector db(MAX_INDEX); + unsigned id = 0; // Initialize db with known win / draw positions - std::generate(db.begin(), db.end(), [](){ static unsigned id; return KPKPosition(id++); }); + std::generate(db.begin(), db.end(), [&id](){ return KPKPosition(id++); }); // Iterate through the positions until none of the unknown positions can be // changed to either wins or draws (15 cycles needed). diff --git a/src/thread.cpp b/src/thread.cpp index ef5ae857..048f2a7a 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -299,9 +299,12 @@ void ThreadPool::init() { void ThreadPool::exit() { delete_thread(timer); // As first because check_time() accesses threads data + timer = nullptr; for (Thread* th : *this) delete_thread(th); + + clear(); // Get rid of stale pointers }