1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-29 16:23:09 +00:00

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 <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2011-01-08 14:16:04 +01:00
parent d9b96f0e49
commit 0f81f97bb6
3 changed files with 23 additions and 12 deletions

View file

@ -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

View file

@ -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);

View file

@ -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;