From 0f81f97bb6e7b3a8f8489d468cfc045e9b0a1849 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sat, 8 Jan 2011 14:16:04 +0100 Subject: [PATCH] Improve I/O responsivness Added checking of (stdin->_cnt > 0) from Greko. This seems to greatly improve responsivness when running under console. Now while running a 'stockfish bench', any key press immediately is detected by SF while before there was a delay of some fraction of a second. No functional change. Signed-off-by: Marco Costalba --- src/misc.cpp | 31 +++++++++++++++++++++---------- src/misc.h | 2 +- src/search.cpp | 2 +- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/misc.cpp b/src/misc.cpp index d18f48d6..ba6f24f8 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -205,7 +205,7 @@ int cpu_count() { #endif -/// Check for console input. Original code from Beowulf and Olithink +/// Check for console input. Original code from Beowulf, Olithink and Greko #ifndef _WIN32 @@ -225,35 +225,46 @@ int data_available() #else -int data_available() +int input_available() { static HANDLE inh = NULL; static bool usePipe = false; INPUT_RECORD rec[256]; - DWORD dw, recCnt; + DWORD nchars, recCnt; if (!inh) { inh = GetStdHandle(STD_INPUT_HANDLE); - if (GetConsoleMode(inh, &dw)) + if (GetConsoleMode(inh, &nchars)) { - SetConsoleMode(inh, dw & ~(ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT)); + SetConsoleMode(inh, nchars & ~(ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT)); FlushConsoleInputBuffer(inh); } else usePipe = true; } - // If we're running under XBoard then we can't use PeekConsoleInput() as - // the input commands are sent to us directly over the internal pipe. + // When using Standard C input functions, also check if there + // is anything in the buffer. After a call to such functions, + // the input waiting in the pipe will be copied to the buffer, + // and the call to PeekNamedPipe can indicate no input available. + // Setting stdin to unbuffered was not enough. [from Greko] + if (stdin->_cnt > 0) + return 1; + + // When running under a GUI the input commands are sent to us + // directly over the internal pipe. If PeekNamedPipe() returns 0 + // then something went wrong. Probably the parent program exited. + // Returning 1 will make the next call to the input function + // return EOF, where this should be catched then. if (usePipe) - return PeekNamedPipe(inh, NULL, 0, NULL, &dw, NULL) ? dw : 1; + return PeekNamedPipe(inh, NULL, 0, NULL, &nchars, NULL) ? nchars : 1; // Count the number of unread input records, including keyboard, // mouse, and window-resizing input records. - GetNumberOfConsoleInputEvents(inh, &dw); + GetNumberOfConsoleInputEvents(inh, &nchars); // Read data from console without removing it from the buffer - if (dw <= 0 || !PeekConsoleInput(inh, rec, Min(dw, 256), &recCnt)) + if (nchars <= 0 || !PeekConsoleInput(inh, rec, Min(nchars, 256), &recCnt)) return 0; // Search for at least one keyboard event diff --git a/src/misc.h b/src/misc.h index 8c3cf86e..c21992ba 100644 --- a/src/misc.h +++ b/src/misc.h @@ -46,7 +46,7 @@ extern const std::string engine_name(); extern int get_system_time(); extern int cpu_count(); -extern int data_available(); +extern int input_available(); extern void prefetch(char* addr); extern void prefetchPawn(Key, int); diff --git a/src/search.cpp b/src/search.cpp index cdd38407..9be9cccd 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -2013,7 +2013,7 @@ split_point_start: // At split points actual search starts from here int t = current_search_time(); // Poll for input - if (data_available()) + if (input_available()) { // We are line oriented, don't read single chars std::string command; -- 2.39.2