mirror of
https://github.com/sockspls/badfish
synced 2025-05-01 01:03: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
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/// Check for console input. Original code from Beowulf and Olithink
|
/// Check for console input. Original code from Beowulf, Olithink and Greko
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
|
|
||||||
|
@ -225,35 +225,46 @@ int data_available()
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
int data_available()
|
int input_available()
|
||||||
{
|
{
|
||||||
static HANDLE inh = NULL;
|
static HANDLE inh = NULL;
|
||||||
static bool usePipe = false;
|
static bool usePipe = false;
|
||||||
INPUT_RECORD rec[256];
|
INPUT_RECORD rec[256];
|
||||||
DWORD dw, recCnt;
|
DWORD nchars, recCnt;
|
||||||
|
|
||||||
if (!inh)
|
if (!inh)
|
||||||
{
|
{
|
||||||
inh = GetStdHandle(STD_INPUT_HANDLE);
|
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);
|
FlushConsoleInputBuffer(inh);
|
||||||
} else
|
} else
|
||||||
usePipe = true;
|
usePipe = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we're running under XBoard then we can't use PeekConsoleInput() as
|
// When using Standard C input functions, also check if there
|
||||||
// the input commands are sent to us directly over the internal pipe.
|
// 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)
|
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,
|
// Count the number of unread input records, including keyboard,
|
||||||
// mouse, and window-resizing input records.
|
// mouse, and window-resizing input records.
|
||||||
GetNumberOfConsoleInputEvents(inh, &dw);
|
GetNumberOfConsoleInputEvents(inh, &nchars);
|
||||||
|
|
||||||
// Read data from console without removing it from the buffer
|
// 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;
|
return 0;
|
||||||
|
|
||||||
// Search for at least one keyboard event
|
// Search for at least one keyboard event
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
extern const std::string engine_name();
|
extern const std::string engine_name();
|
||||||
extern int get_system_time();
|
extern int get_system_time();
|
||||||
extern int cpu_count();
|
extern int cpu_count();
|
||||||
extern int data_available();
|
extern int input_available();
|
||||||
extern void prefetch(char* addr);
|
extern void prefetch(char* addr);
|
||||||
extern void prefetchPawn(Key, int);
|
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();
|
int t = current_search_time();
|
||||||
|
|
||||||
// Poll for input
|
// Poll for input
|
||||||
if (data_available())
|
if (input_available())
|
||||||
{
|
{
|
||||||
// We are line oriented, don't read single chars
|
// We are line oriented, don't read single chars
|
||||||
std::string command;
|
std::string command;
|
||||||
|
|
Loading…
Add table
Reference in a new issue