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:
parent
d9b96f0e49
commit
0f81f97bb6
3 changed files with 23 additions and 12 deletions
31
src/misc.cpp
31
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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue