- 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::getline() is used by main thread to block and wait for input,
-// the behaviour mimics std::getline().