[Piglit] [PATCH] util: fix Windows stdout/stderr buffering

Brian Paul brianp at vmware.com
Wed Jun 7 20:17:19 UTC 2017


Windows doesn't immediately flush stdout/stderr after printf().
Use setbuf() to disable buffering on Windows.

Refactor the init code a bit to avoid calling setbuf() from some
arbitrary place otherwise.
---
 tests/util/piglit-framework-gl.h |  2 +-
 tests/util/piglit-util.c         | 24 +++++++++++++++++++++++-
 tests/util/piglit-util.h         |  2 +-
 3 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/tests/util/piglit-framework-gl.h b/tests/util/piglit-framework-gl.h
index 992f28a..970fd55 100644
--- a/tests/util/piglit-framework-gl.h
+++ b/tests/util/piglit-framework-gl.h
@@ -271,7 +271,7 @@ piglit_gl_test_run(int argc, char *argv[],
         {                                                                    \
                 struct piglit_gl_test_config config;                         \
                                                                              \
-                piglit_disable_error_message_boxes();                        \
+                piglit_general_init();                                       \
                                                                              \
                 piglit_gl_test_config_init(&config);                         \
                                                                              \
diff --git a/tests/util/piglit-util.c b/tests/util/piglit-util.c
index 6b34c46..15a178b 100644
--- a/tests/util/piglit-util.c
+++ b/tests/util/piglit-util.c
@@ -317,7 +317,7 @@ piglit_report_subtest_result(enum piglit_result result, const char *format, ...)
 }
 
 
-void
+static void
 piglit_disable_error_message_boxes(void)
 {
 	/* When Windows' error message boxes are disabled for this process (as
@@ -354,6 +354,28 @@ piglit_disable_error_message_boxes(void)
 }
 
 
+static void
+piglit_set_line_buffering(void)
+{
+	/* Windows doesn't immediately flush stdout/stderr after printf
+	 * calls as we see on Linux.  To get immediate flushing, we disable
+	 * buffering here.
+	 */
+#ifdef _WIN32
+	setbuf(stdout, NULL);
+	setbuf(stderr, NULL);
+#endif
+}
+
+
+void
+piglit_general_init(void)
+{
+	piglit_disable_error_message_boxes();
+	piglit_set_line_buffering();
+}
+
+
 void
 piglit_set_rlimit(unsigned long lim)
 {
diff --git a/tests/util/piglit-util.h b/tests/util/piglit-util.h
index b30ae07..ad00817 100644
--- a/tests/util/piglit-util.h
+++ b/tests/util/piglit-util.h
@@ -414,7 +414,7 @@ void piglit_set_timeout(double seconds, enum piglit_result timeout_result);
 void piglit_report_subtest_result(enum piglit_result result,
 				  const char *format, ...) PRINTFLIKE(2, 3);
 
-void piglit_disable_error_message_boxes(void);
+void piglit_general_init(void);
 
 extern void piglit_set_rlimit(unsigned long lim);
 
-- 
1.9.1



More information about the Piglit mailing list