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>
-/// 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.
// 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.
// 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.
// 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)
{
// their work at this split point.
if (slavesCnt || Fake)
{
// 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.
// 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.
void wake_up();
bool cutoff_occurred() const;
bool is_available_to(Thread* master) const;
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 main_loop();
void timer_loop();
void wait_for_stop_or_ponderhit();
void main_loop();
void timer_loop();
void wait_for_stop_or_ponderhit();