+ // Copy input arguments to initialize the search
+ RootPosition.copy(pos, 0);
+ Limits = limits;
+ RootMoves.clear();
+
+ // Populate RootMoves with all the legal moves (default) or, if a searchMoves
+ // set is given, with the subset of legal moves to search.
+ for (MoveList<MV_LEGAL> ml(pos); !ml.end(); ++ml)
+ if (searchMoves.empty() || searchMoves.count(ml.move()))
+ RootMoves.push_back(RootMove(ml.move()));
+
+ // Reset signals before to start the new search
+ Signals.stopOnPonderhit = Signals.firstRootMove = false;
+ Signals.stop = Signals.failedLowAtRoot = false;
+
+ main.do_sleep = false;
+ cond_signal(&main.sleepCond); // Wake up main thread and start searching
+
+ if (!async)
+ while (!main.do_sleep)
+ cond_wait(&sleepCond, &main.sleepLock);
+