From: José Fonseca <[email protected]>

This (plus a corresponding Mesa change) enables to run the piglit
testsuite through piglit-run without human intervention.
---
 framework/programs/run.py        | 18 ++++++++++++++++++
 tests/util/piglit-framework-gl.h |  2 ++
 tests/util/piglit-util.c         | 37 +++++++++++++++++++++++++++++++++++++
 tests/util/piglit-util.h         |  2 ++
 4 files changed, 59 insertions(+)

diff --git a/framework/programs/run.py b/framework/programs/run.py
index 2337b8e..0c3ec01 100644
--- a/framework/programs/run.py
+++ b/framework/programs/run.py
@@ -98,6 +98,24 @@ def run(input_):
                         help="Path to results folder")
     args = parser.parse_args(input_)
 
+    # Disable Windows error message boxes for this and all child processes.
+    if sys.platform == 'win32':
+        # This disables messages boxes for uncaught exceptions, but it will not
+        # disable the message boxes for assertion failures or abort().  Those
+        # are created not by the system but by the CRT itself, and must be
+        # disabled by the child processes themselves.
+        import ctypes
+       SEM_FAILCRITICALERRORS     = 0x0001
+       SEM_NOALIGNMENTFAULTEXCEPT = 0x0004
+       SEM_NOGPFAULTERRORBOX      = 0x0002
+       SEM_NOOPENFILEERRORBOX     = 0x8000
+        uMode = ctypes.windll.kernel32.SetErrorMode(0)
+        uMode |= SEM_FAILCRITICALERRORS \
+             |  SEM_NOALIGNMENTFAULTEXCEPT \
+             |  SEM_NOGPFAULTERRORBOX \
+             |  SEM_NOOPENFILEERRORBOX
+        ctypes.windll.kernel32.SetErrorMode(uMode)
+
     # Set the platform to pass to waffle
     if args.platform:
         os.environ['PIGLIT_PLATFORM'] = args.platform
diff --git a/tests/util/piglit-framework-gl.h b/tests/util/piglit-framework-gl.h
index 6033897..cff4533 100644
--- a/tests/util/piglit-framework-gl.h
+++ b/tests/util/piglit-framework-gl.h
@@ -260,6 +260,8 @@ piglit_gl_test_run(int argc, char *argv[],
         {                                                                    \
                 struct piglit_gl_test_config config;                         \
                                                                              \
+                piglit_disable_error_message_boxes();                        \
+                                                                             \
                 piglit_gl_test_config_init(&config);                         \
                                                                              \
                 config.init = piglit_init;                                   \
diff --git a/tests/util/piglit-util.c b/tests/util/piglit-util.c
index cefc303..9f09ba2 100644
--- a/tests/util/piglit-util.c
+++ b/tests/util/piglit-util.c
@@ -277,6 +277,43 @@ char *strndup(const char *s, size_t n)
 
 
 void
+piglit_disable_error_message_boxes(void)
+{
+       /* When Windows' error message boxes are disabled for this process (as
+        * is always the case when running through `piglit run`) we disable CRT
+        * message boxes too.
+        *
+        * This will disable the CRT message boxes for the main executable, but
+        * it will not disable message boxes for assertion failures inside
+        * OpenGL ICD, unless this test's executable and the OpenGL ICD DLL are
+        * both dynamically linked to the same CRT DLL.  If the OpenGL ICD is
+        * statically linked to the CRT then it must do these calls itself.
+        */
+#ifdef _WIN32
+       UINT uMode;
+#if _WIN32_WINNT >= 0x0600
+       uMode = GetErrorMode();
+#else
+       uMode = SetErrorMode(0);
+       SetErrorMode(uMode);
+#endif
+       if (uMode & SEM_FAILCRITICALERRORS) {
+               /* Disable assertion failure message box.
+                * http://msdn.microsoft.com/en-us/library/sas1dkb2.aspx
+                */
+               _set_error_mode(_OUT_TO_STDERR);
+#ifdef _MSC_VER
+               /* Disable abort message box.
+                * http://msdn.microsoft.com/en-us/library/e631wekh.aspx
+                */
+               _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
+#endif
+       }
+#endif /* _WIN32 */
+}
+
+
+void
 piglit_set_rlimit(unsigned long lim)
 {
 #if defined(USE_SETRLIMIT) && defined(RLIMIT_AS)
diff --git a/tests/util/piglit-util.h b/tests/util/piglit-util.h
index 86b5c18..0f112ab 100644
--- a/tests/util/piglit-util.h
+++ b/tests/util/piglit-util.h
@@ -222,6 +222,8 @@ char *strchrnul(const char *s, int c);
 char *strndup(const char *s, size_t n);
 #endif
 
+void piglit_disable_error_message_boxes(void);
+
 extern void piglit_set_rlimit(unsigned long lim);
 
 char *piglit_load_text_file(const char *file_name, unsigned *size);
-- 
1.9.1

_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to