-// Thread::listener_loop() is where the listener thread, used for I/O, waits for
-// input. When is_searching is false then input is read in sync with main thread
-// (that blocks), otherwise the listener thread reads any input asynchronously
-// and processes the input line calling do_uci_async_cmd().
-
-void Thread::listener_loop() {
-
- std::string cmd;
-
- while (true)
- {
- lock_grab(&sleepLock);
-
- Threads.inputLine = cmd;
- do_sleep = !is_searching;
-
- // Here the thread is parked in sync mode after a line has been read
- while (do_sleep && !do_terminate) // Catches spurious wake ups
- {
- cond_signal(&Threads.sleepCond); // Wake up main thread
- cond_wait(&sleepCond, &sleepLock); // Sleep here
- }
-
- lock_release(&sleepLock);
-
- if (do_terminate)
- return;
-
- if (!std::getline(std::cin, cmd)) // Block waiting for input
- cmd = "quit";
-
- lock_grab(&sleepLock);
-
- // If we are in async mode then process the command now
- if (is_searching)
- {
- // Command "quit" is the last one received by the GUI, so park the
- // thread waiting for exiting. Also, after a "stop", for instance on a
- // ponder miss, GUI can immediately send the new position to search,
- // so return to in-sync mode to avoid discarding good data.
- if (cmd == "quit" || cmd == "stop")
- is_searching = false;
-
- do_uci_async_cmd(cmd);
- cmd = ""; // Input has been consumed
- }
-
- lock_release(&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 async is true
+// then function returns immediately, otherwise caller is blocked waiting for
+// the search to finish.