[Piglit] [PATCH] util: Prevent uncaught exceptions from being silently ignored on Windows.
Brian Paul
brianp at vmware.com
Thu Jun 5 07:33:35 PDT 2014
On 06/05/2014 05:37 AM, jfonseca at vmware.com wrote:
> From: José Fonseca <jfonseca at vmware.com>
>
> Therefore preventing tests from hanging. More details in the code comment.
> ---
> tests/util/piglit-util.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 61 insertions(+)
>
> diff --git a/tests/util/piglit-util.c b/tests/util/piglit-util.c
> index 9f09ba2..6fe146e 100644
> --- a/tests/util/piglit-util.c
> +++ b/tests/util/piglit-util.c
> @@ -276,6 +276,47 @@ char *strndup(const char *s, size_t n)
> #endif
>
>
> +#ifdef _WIN32
> +
> +#ifndef DBG_PRINTEXCEPTION_C
> +#define DBG_PRINTEXCEPTION_C 0x40010006
> +#endif
> +
> +static LONG WINAPI
> +exception_handler(PEXCEPTION_POINTERS pExceptionInfo)
> +{
> + PEXCEPTION_RECORD pExceptionRecord = pExceptionInfo->ExceptionRecord;
> +
> + /* Ignore OutputDebugStringA exceptions. */
> + if (pExceptionRecord->ExceptionCode == DBG_PRINTEXCEPTION_C) {
> + return EXCEPTION_CONTINUE_SEARCH;
> + }
> +
> + /* Ignore C++ exceptions
> + * http://support.microsoft.com/kb/185294
> + * http://blogs.msdn.com/b/oldnewthing/archive/2010/07/30/10044061.aspx
> + */
> + if (pExceptionRecord->ExceptionCode == 0xe06d7363) {
> + return EXCEPTION_CONTINUE_SEARCH;
> + }
> +
> + /* Ignore thread naming exception.
> + * http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
> + */
> + if (pExceptionRecord->ExceptionCode == 0x406d1388) {
> + return EXCEPTION_CONTINUE_SEARCH;
> + }
> +
> + fprintf(stderr, "warning: uncaught exception 0x%08lx\n", pExceptionRecord->ExceptionCode);
> +
> + TerminateProcess(GetCurrentProcess(), EXIT_FAILURE);
> +
> + return EXCEPTION_CONTINUE_SEARCH;
> +}
> +
> +#endif /* _WIN32 */
> +
> +
> void
> piglit_disable_error_message_boxes(void)
> {
> @@ -309,6 +350,26 @@ piglit_disable_error_message_boxes(void)
> _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
> #endif
> }
> +
> + /* Catch any exceptions and abort immediately.
> + *
> + * At least with certain implementations of GLUT (namely
> + * freeglut-2.8.1), the glutDisplayFunc()'s callback called inside a
> + * WindowProc callback function.
> + *
> + * And on certain cases (depending on the Windows version and 32 vs 64
> + * bits processes) uncaught exceptions inside WindowProc callbacks are
> + * silently ignored! (See Remarks section of
> + * http://msdn.microsoft.com/en-us/library/windows/desktop/ms633573.aspx
> + * page.) The end result is that automatic tests end up blocking
> + * waiting for user input when an uncaught exceptionhappens, as control
> + * flow is interrupted before it reaches piglit_report_result(), and
> + * the process never aborts.
> + *
> + * By installing our own exception handler we can ensure that uncaught
> + * exceptions will never be silently ignored.
> + */
> + AddVectoredExceptionHandler(0, exception_handler);
> #endif /* _WIN32 */
> }
Looks good AFAICT.
Reviewed-by: Brian Paul <brianp at vmware.com>
More information about the Piglit
mailing list