Set unbuffered I/O also for C standard library
authorMarco Costalba <mcostalba@gmail.com>
Tue, 11 Jan 2011 15:22:12 +0000 (16:22 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Tue, 11 Jan 2011 17:58:56 +0000 (18:58 +0100)
In input_available() we use function select(), so
we have to set as unbuffered also C library I/O
functions otherwise we can miss some input.

For instance in case GUI sends "go infinite\nstop\n" we
parse the "go infinite" but then input_available() under Linux
is unable to detect that we still have "stop" to be processed.

This is because "select" uses file descriptors instead of file
pointers. So it cannot know about the buffer associated to a file
pointer.

This patch, by BB+, should fix the problem.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/main.cpp

index fa821151359ac31cb904ebfd66226ae89d49955a..0f7d0e783b369c7118e842ce04b5e278cd462ba4 100644 (file)
@@ -25,6 +25,7 @@
 //// Includes
 ////
 
+#include <cstdio>
 #include <iostream>
 #include <string>
 
@@ -54,7 +55,9 @@ extern void benchmark(int argc, char* argv[]);
 
 int main(int argc, char* argv[]) {
 
-  // Disable IO buffering
+  // Disable IO buffering for C and C++ standard libraries
+  setvbuf(stdin, NULL, _IONBF, 0);
+  setvbuf(stdout, NULL, _IONBF, 0);
   cout.rdbuf()->pubsetbuf(NULL, 0);
   cin.rdbuf()->pubsetbuf(NULL, 0);