mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-20 00:56:39 +08:00
Import C++11 branch
Import C++11 branch from:
https://github.com/mcostalba/Stockfish/tree/c++11
The version imported is teh last one as of today:
6670e93e50
Branch is fully equivalent with master but syzygy
tablebases that are missing (but will be added with
next commit).
bench: 8080602
This commit is contained in:
@@ -33,19 +33,13 @@ extern void check_time();
|
||||
|
||||
namespace {
|
||||
|
||||
// start_routine() is the C function which is called when a new thread
|
||||
// is launched. It is a wrapper to the virtual function idle_loop().
|
||||
|
||||
extern "C" { long start_routine(ThreadBase* th) { th->idle_loop(); return 0; } }
|
||||
|
||||
|
||||
// Helpers to launch a thread after creation and joining before delete. Must be
|
||||
// outside Thread c'tor and d'tor because the object must be fully initialized
|
||||
// when start_routine (and hence virtual idle_loop) is called and when joining.
|
||||
|
||||
template<typename T> T* new_thread() {
|
||||
T* th = new T();
|
||||
thread_create(th->handle, start_routine, th); // Will go to sleep
|
||||
th->nativeThread = std::thread(&ThreadBase::idle_loop, th); // Will go to sleep
|
||||
return th;
|
||||
}
|
||||
|
||||
@@ -56,7 +50,7 @@ namespace {
|
||||
th->mutex.unlock();
|
||||
|
||||
th->notify_one();
|
||||
thread_join(th->handle); // Wait for thread termination
|
||||
th->nativeThread.join(); // Wait for thread termination
|
||||
delete th;
|
||||
}
|
||||
|
||||
@@ -67,9 +61,8 @@ namespace {
|
||||
|
||||
void ThreadBase::notify_one() {
|
||||
|
||||
mutex.lock();
|
||||
std::unique_lock<std::mutex>(this->mutex);
|
||||
sleepCondition.notify_one();
|
||||
mutex.unlock();
|
||||
}
|
||||
|
||||
|
||||
@@ -77,9 +70,8 @@ void ThreadBase::notify_one() {
|
||||
|
||||
void ThreadBase::wait_for(volatile const bool& condition) {
|
||||
|
||||
mutex.lock();
|
||||
while (!condition) sleepCondition.wait(mutex);
|
||||
mutex.unlock();
|
||||
std::unique_lock<std::mutex> lk(mutex);
|
||||
sleepCondition.wait(lk, [&]{ return condition; });
|
||||
}
|
||||
|
||||
|
||||
@@ -90,8 +82,8 @@ Thread::Thread() /* : splitPoints() */ { // Initialization of non POD broken in
|
||||
|
||||
searching = false;
|
||||
maxPly = splitPointsSize = 0;
|
||||
activeSplitPoint = NULL;
|
||||
activePosition = NULL;
|
||||
activeSplitPoint = nullptr;
|
||||
activePosition = nullptr;
|
||||
idx = Threads.size(); // Starts from 0
|
||||
}
|
||||
|
||||
@@ -178,11 +170,11 @@ void Thread::split(Position& pos, Stack* ss, Value alpha, Value beta, Value* bes
|
||||
sp.allSlavesSearching = true; // Must be set under lock protection
|
||||
++splitPointsSize;
|
||||
activeSplitPoint = &sp;
|
||||
activePosition = NULL;
|
||||
activePosition = nullptr;
|
||||
|
||||
Thread* slave;
|
||||
|
||||
while ((slave = Threads.available_slave(this)) != NULL)
|
||||
while ((slave = Threads.available_slave(this)) != nullptr)
|
||||
{
|
||||
sp.slavesMask.set(slave->idx);
|
||||
slave->activeSplitPoint = &sp;
|
||||
@@ -231,12 +223,12 @@ void TimerThread::idle_loop() {
|
||||
|
||||
while (!exit)
|
||||
{
|
||||
mutex.lock();
|
||||
std::unique_lock<std::mutex> lk(mutex);
|
||||
|
||||
if (!exit)
|
||||
sleepCondition.wait_for(mutex, run ? Resolution : INT_MAX);
|
||||
sleepCondition.wait_for(lk, std::chrono::milliseconds(run ? Resolution : INT_MAX));
|
||||
|
||||
mutex.unlock();
|
||||
lk.unlock();
|
||||
|
||||
if (run)
|
||||
check_time();
|
||||
@@ -251,17 +243,17 @@ void MainThread::idle_loop() {
|
||||
|
||||
while (!exit)
|
||||
{
|
||||
mutex.lock();
|
||||
std::unique_lock<std::mutex> lk(mutex);
|
||||
|
||||
thinking = false;
|
||||
|
||||
while (!thinking && !exit)
|
||||
{
|
||||
Threads.sleepCondition.notify_one(); // Wake up the UI thread if needed
|
||||
sleepCondition.wait(mutex);
|
||||
sleepCondition.wait(lk);
|
||||
}
|
||||
|
||||
mutex.unlock();
|
||||
lk.unlock();
|
||||
|
||||
if (!exit)
|
||||
{
|
||||
@@ -297,8 +289,8 @@ void ThreadPool::exit() {
|
||||
|
||||
delete_thread(timer); // As first because check_time() accesses threads data
|
||||
|
||||
for (iterator it = begin(); it != end(); ++it)
|
||||
delete_thread(*it);
|
||||
for (Thread* th : *this)
|
||||
delete_thread(th);
|
||||
}
|
||||
|
||||
|
||||
@@ -335,11 +327,11 @@ void ThreadPool::read_uci_options() {
|
||||
|
||||
Thread* ThreadPool::available_slave(const Thread* master) const {
|
||||
|
||||
for (const_iterator it = begin(); it != end(); ++it)
|
||||
if ((*it)->available_to(master))
|
||||
return *it;
|
||||
for (Thread* th : *this)
|
||||
if (th->available_to(master))
|
||||
return th;
|
||||
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
@@ -347,10 +339,8 @@ Thread* ThreadPool::available_slave(const Thread* master) const {
|
||||
|
||||
void ThreadPool::wait_for_think_finished() {
|
||||
|
||||
MainThread* th = main();
|
||||
th->mutex.lock();
|
||||
while (th->thinking) sleepCondition.wait(th->mutex);
|
||||
th->mutex.unlock();
|
||||
std::unique_lock<std::mutex> lk(main()->mutex);
|
||||
sleepCondition.wait(lk, [&]{ return !main()->thinking; });
|
||||
}
|
||||
|
||||
|
||||
@@ -371,14 +361,14 @@ void ThreadPool::start_thinking(const Position& pos, const LimitsType& limits,
|
||||
Limits = limits;
|
||||
if (states.get()) // If we don't set a new position, preserve current state
|
||||
{
|
||||
SetupStates = states; // Ownership transfer here
|
||||
SetupStates = std::move(states); // Ownership transfer here
|
||||
assert(!states.get());
|
||||
}
|
||||
|
||||
for (MoveList<LEGAL> it(pos); *it; ++it)
|
||||
for (const ExtMove& ms : MoveList<LEGAL>(pos))
|
||||
if ( limits.searchmoves.empty()
|
||||
|| std::count(limits.searchmoves.begin(), limits.searchmoves.end(), *it))
|
||||
RootMoves.push_back(RootMove(*it));
|
||||
|| std::count(limits.searchmoves.begin(), limits.searchmoves.end(), ms.move))
|
||||
RootMoves.push_back(RootMove(ms.move));
|
||||
|
||||
main()->thinking = true;
|
||||
main()->notify_one(); // Starts main thread
|
||||
|
||||
Reference in New Issue
Block a user