Code: Select all
     SplitPoint *bestSp = NULL;
              int bestThread = 0;
              int bestScore = INT_MAX;
              for (size_t i = 0; i < Threads.size(); ++i)
              {
                  const int size = Threads[i]->splitPointsSize; // Local copy
                  sp = size ? &Threads[i]->splitPoints[size - 1] : NULL;
                  if (   sp
                      && sp->allSlavesSearching
                      && sp->slavesCount < MAX_SLAVES_PER_SPLITPOINT
                      && available_to(Threads[i]))
                  {
                      int score = sp->spLevel * 256 * 256 + sp->slavesCount * 256 - sp->depth * 1;
                      if (score < bestScore)
                      {
                           bestSp = sp;
                           bestThread = i;
                           bestScore = score;
                      }
                  }
              }
              if (bestSp)
              {
                  sp = bestSp;
 
                  // Recheck the conditions under lock protection
                  Threads.mutex.lock();
                  sp->mutex.lock();
                  if (   sp->allSlavesSearching
                      && sp->slavesCount < MAX_SLAVES_PER_SPLITPOINT
                      && available_to(Threads[bestThread]))
                  {
                      sp->slavesMask.set(idx);
                      sp->slavesCount++;
                      activeSplitPoint = sp;
                      searching = true;
                  }
                  sp->mutex.unlock();
                  Threads.mutex.unlock();
              }
          }Correction/elaboration welcome. Thanks.