Skip to content

Commit

Permalink
Simplify idle_loop() signature
Browse files Browse the repository at this point in the history
We can detect the split point master also from within idle_loop,
so we can call the function without parameters and remove an
overloaded member hack in Thread class.

Note that we don't need to take a lock around curSplitPoint
when entering idle_loop() because if we are the master then
curSplitPoint cannot change under our feet (because is_searching
is set and so we cannot be reallocated), if we are a slave
we enter idle_loop() only upon Thread creation and in that case
is always splitPointsCnt == 0. This is true even in the very rare
case that curSplitPoint != NULL, if we have been already allocated
even before entering idle_loop().

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
  • Loading branch information
mcostalba committed Aug 19, 2012
1 parent 4b19430 commit dba1bc3
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 9 deletions.
12 changes: 8 additions & 4 deletions src/search.cpp
Expand Up @@ -1643,11 +1643,15 @@ void RootMove::insert_pv_in_tt(Position& pos) {
}


/// Thread::idle_loop() is where the thread is parked when it has no work to do.
/// The parameter 'master_sp', if non-NULL, is a pointer to an active SplitPoint
/// object for which the thread is the master.
/// Thread::idle_loop() is where the thread is parked when it has no work to do

void Thread::idle_loop(SplitPoint* sp_master) {
void Thread::idle_loop() {

// Pointer 'sp_master', if non-NULL, points to the active SplitPoint
// object for which the thread is the master.
const SplitPoint* sp_master = splitPointsCnt ? curSplitPoint : NULL;

assert(!sp_master || (sp_master->master == this && is_searching));

// If this thread is the master of a split point and all slaves have
// finished their work at this split point, return from the idle loop.
Expand Down
5 changes: 2 additions & 3 deletions src/thread.cpp
Expand Up @@ -365,12 +365,11 @@ Value ThreadPool::split(Position& pos, Stack* ss, Value alpha, Value beta,

// Everything is set up. The master thread enters the idle loop, from which
// it will instantly launch a search, because its is_searching flag is set.
// We pass the split point as a parameter to the idle loop, which means that
// the thread will return from the idle loop when all slaves have finished
// The thread will return from the idle loop when all slaves have finished
// their work at this split point.
if (slavesCnt || Fake)
{
master->idle_loop(sp);
master->idle_loop();

// In helpful master concept a master can help only a sub-tree of its split
// point, and because here is all finished is not possible master is booked.
Expand Down
3 changes: 1 addition & 2 deletions src/thread.h
Expand Up @@ -76,8 +76,7 @@ class Thread {
void wake_up();
bool cutoff_occurred() const;
bool is_available_to(Thread* master) const;
void idle_loop(SplitPoint* sp_master);
void idle_loop() { idle_loop(NULL); } // Hack to allow storing in start_fn
void idle_loop();
void main_loop();
void timer_loop();
void wait_for_stop_or_ponderhit();
Expand Down

0 comments on commit dba1bc3

Please sign in to comment.