diff --git a/src/search.cpp b/src/search.cpp index 8037e6e74f2..54a9ec878c4 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1622,6 +1622,7 @@ void Thread::idle_loop() { else assert(false); + spinlock.acquire(); assert(searching); searching = false; @@ -1633,6 +1634,7 @@ void Thread::idle_loop() { // After releasing the lock we can't access any SplitPoint related data // in a safe way because it could have been released under our feet by // the sp master. + spinlock.release(); sp->spinlock.release(); // Try to late join to another split point if none of its slaves has diff --git a/src/thread.cpp b/src/thread.cpp index 8eaee87500d..e2881c4ee78 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -145,6 +145,7 @@ void Thread::split(Position& pos, Stack* ss, Value alpha, Value beta, Value* bes SplitPoint& sp = splitPoints[splitPointsSize]; sp.spinlock.acquire(); // No contention here until we don't increment splitPointsSize + spinlock.acquire(); sp.master = this; sp.parentSplitPoint = activeSplitPoint; @@ -167,6 +168,7 @@ void Thread::split(Position& pos, Stack* ss, Value alpha, Value beta, Value* bes ++splitPointsSize; activeSplitPoint = &sp; activePosition = nullptr; + spinlock.release(); // Try to allocate available threads Thread* slave; @@ -194,6 +196,9 @@ void Thread::split(Position& pos, Stack* ss, Value alpha, Value beta, Value* bes Thread::idle_loop(); // Force a call to base class idle_loop() + sp.spinlock.acquire(); + spinlock.acquire(); + // In the helpful master concept, a master can help only a sub-tree of its // split point and because everything is finished here, it's not possible // for the master to be booked. @@ -205,8 +210,6 @@ void Thread::split(Position& pos, Stack* ss, Value alpha, Value beta, Value* bes // We have returned from the idle loop, which means that all threads are // finished. Note that decreasing splitPointsSize must be done under lock // protection to avoid a race with Thread::can_join(). - sp.spinlock.acquire(); - --splitPointsSize; activeSplitPoint = sp.parentSplitPoint; activePosition = &pos; @@ -214,6 +217,7 @@ void Thread::split(Position& pos, Stack* ss, Value alpha, Value beta, Value* bes *bestMove = sp.bestMove; *bestValue = sp.bestValue; + spinlock.release(); sp.spinlock.release(); }