- while (true)
- {
- lock_grab(&sleepLock);
-
- do_sleep = true; // Always return to sleep after a search
-
- is_searching = false;
-
- while (do_sleep && !do_terminate)
- {
- cond_signal(&Threads.sleepCond); // Wake up UI thread if needed
- cond_wait(&sleepCond, &sleepLock);
- }
-
- is_searching = true;
-
- lock_release(&sleepLock);
-
- if (do_terminate)
- return;
-
- Search::think();
- }
-}
-
-
-// ThreadsManager::wait_end_of_search() blocks UI thread until main thread has
-// returned to sleep in main_loop(). It is needed becuase xboard sends immediately
-// new position to search after a "stop" due to ponder miss.
-
-void ThreadsManager::wait_end_of_search() {
-
- Thread& main = threads[0];
-
- lock_grab(&main.sleepLock);
-
- while (!main.do_sleep)
- cond_wait(&sleepCond, &main.sleepLock);
-
- lock_release(&main.sleepLock);
-}
-
-
-// ThreadsManager::start_thinking() is used by UI thread to wake up the main
-// thread parked in main_loop() and starting a new search. If asyncMode is true
-// then function returns immediately, otherwise caller is blocked waiting for
-// the search to finish.
-
-void ThreadsManager::start_thinking(bool asyncMode) {
-
- Thread& main = threads[0];
-
- // Wait main thread has finished before to launch a new search
- wait_end_of_search();
-
- lock_grab(&main.sleepLock);
-
- // Reset signals before to start the search
- memset((void*)&Search::Signals, 0, sizeof(Search::Signals));
-
- main.do_sleep = false;
- cond_signal(&main.sleepCond); // Wake up main thread
-
- if (!asyncMode)
- cond_wait(&sleepCond, &main.sleepLock);
-
- lock_release(&main.sleepLock);
+ Thread* main = threads[0];
+ lock_grab(main->sleepLock);
+ while (!main->do_sleep) cond_wait(sleepCond, main->sleepLock);
+ lock_release(main->sleepLock);