X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fthread.cpp;h=a644cae9b64ede6d5a1e682cd62f5aff9b4e01af;hb=c645aca199ac7db2ffcfc229b3cda8dafa6fb835;hp=faa3a5716aa1570945c5dcaea7cb345ca0e75455;hpb=5a2d525048ca5eec1d5d0effc8868cb2fdc701bb;p=stockfish diff --git a/src/thread.cpp b/src/thread.cpp index faa3a571..a644cae9 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -34,15 +34,11 @@ namespace { extern "C" { // start_routine() is the C function which is called when a new thread // is launched. It is a wrapper to member function pointed by start_fn. - long start_routine(Thread* th) { - - Threads.set_this_thread(th); // Save pointer into thread local storage - (th->*(th->start_fn))(); - return 0; - } + long start_routine(Thread* th) { (th->*(th->start_fn))(); return 0; } } } + // Thread c'tor starts a newly-created thread of execution that will call // the idle loop function pointed by start_fn going immediately to sleep. @@ -205,12 +201,10 @@ bool Thread::is_available_to(Thread* master) const { void ThreadsManager::init() { - tls_init(tlsKey); cond_init(sleepCond); lock_init(splitLock); timer = new Thread(&Thread::timer_loop); threads.push_back(new Thread(&Thread::main_loop)); - set_this_thread(main_thread()); // Use main thread's resources read_uci_options(); } @@ -225,7 +219,6 @@ ThreadsManager::~ThreadsManager() { delete timer; lock_destroy(splitLock); cond_destroy(sleepCond); - tls_destroy(tlsKey); } @@ -314,18 +307,19 @@ Value ThreadsManager::split(Position& pos, Stack* ss, Value alpha, Value beta, assert(beta <= VALUE_INFINITE); assert(depth > DEPTH_ZERO); - Thread* master = this_thread(); + Thread* master = pos.this_thread(); if (master->splitPointsCnt >= MAX_SPLITPOINTS_PER_THREAD) return bestValue; // Pick the next available split point from the split point stack - SplitPoint* sp = &master->splitPoints[master->splitPointsCnt++]; + SplitPoint* sp = &master->splitPoints[master->splitPointsCnt]; sp->parent = master->curSplitPoint; sp->master = master; sp->cutoff = false; sp->slavesMask = 1ULL << master->idx; + sp->allSlavesMask = 1ULL << master->idx; sp->depth = depth; sp->bestMove = *bestMove; sp->threatMove = threatMove; @@ -354,6 +348,7 @@ Value ThreadsManager::split(Position& pos, Stack* ss, Value alpha, Value beta, if (threads[i]->is_available_to(master)) { sp->slavesMask |= 1ULL << i; + sp->allSlavesMask |= 1ULL << i; threads[i]->curSplitPoint = sp; threads[i]->is_searching = true; // Slave leaves idle_loop() @@ -361,9 +356,14 @@ Value ThreadsManager::split(Position& pos, Stack* ss, Value alpha, Value beta, threads[i]->wake_up(); if (++slavesCnt + 1 >= maxThreadsPerSplitPoint) // Master is always included + { + sp->allSlavesMask = 0; // Disable reparenting to this split point break; + } } + master->splitPointsCnt++; + lock_release(splitLock); lock_release(sp->lock);