- // 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::getline() is used by main thread to block and wait for input,
-// the behaviour mimics std::getline().
-
-void ThreadsManager::getline(std::string& cmd) {
-
- Thread& listener = threads[MAX_THREADS];
-
- lock_grab(&listener.sleepLock);
-
- listener.is_searching = false; // Set sync mode
-
- // If there is already some input to grab then skip without to wake up the
- // listener. This can happen if after we send the "bestmove", the GUI sends
- // a command that the listener buffers in inputLine before going to sleep.
- if (inputLine.empty())
- {
- listener.do_sleep = false;
- cond_signal(&listener.sleepCond); // Wake up listener thread
-
- while (!listener.do_sleep)
- cond_wait(&sleepCond, &listener.sleepLock); // Wait for input
- }
-
- cmd = inputLine;
- inputLine = ""; // Input has been consumed
-
- lock_release(&listener.sleepLock);
-}
-
-
-// ThreadsManager::start_listener() is called at the beginning of the search to
-// swith from sync behaviour (default) to async and so be able to read from UCI
-// while other threads are searching. This avoids main thread polling for input.
-
-void ThreadsManager::start_listener() {
-
- Thread& listener = threads[MAX_THREADS];
-
- lock_grab(&listener.sleepLock);
- listener.is_searching = true;
- listener.do_sleep = false;
- cond_signal(&listener.sleepCond); // Wake up listener thread
- lock_release(&listener.sleepLock);
-}