How is that different from using svn_error_raise_on_malfunction()?

i.e., from passing --trap-assertion-failures ?

hwri...@apache.org wrote on Mon, Sep 12, 2011 at 18:03:42 -0000:
> Author: hwright
> Date: Mon Sep 12 18:03:41 2011
> New Revision: 1169851
> 
> URL: http://svn.apache.org/viewvc?rev=1169851&view=rev
> Log:
> Don't let an early abort in the C tests prevent the run of subsequent tests
> in the same test suite.
> 
> * subversion/tests/svn_test_main.c
>   (abort_handler): New.
>   (do_test_num): Set and return the above abort handler.
> 
> Modified:
>     subversion/trunk/subversion/tests/svn_test_main.c
> 
> Modified: subversion/trunk/subversion/tests/svn_test_main.c
> URL: 
> http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/svn_test_main.c?rev=1169851&r1=1169850&r2=1169851&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/tests/svn_test_main.c (original)
> +++ subversion/trunk/subversion/tests/svn_test_main.c Mon Sep 12 18:03:41 2011
> @@ -206,6 +206,22 @@ crash_handler(int signum)
>    longjmp(jump_buffer, 1);
>  }
>  
> +static svn_error_t *
> +abort_handler(svn_boolean_t can_return,
> +              const char *file,
> +              int line,
> +              const char *expr)
> +{
> +  if (!can_return)
> +    {
> +      printf("unrecoverable abort() in %s:%d: '%s'\n", file, line, expr);
> +      exit(1);
> +    }
> +
> +  return svn_error_createf(SVN_ERR_ASSERTION_FAIL, NULL,
> +                           _("In file '%s' line %d: assertion failed (%s)"),
> +                           file, line, expr);
> +}
>  
>  /* Execute a test number TEST_NUM.  Pretty-print test name and dots
>     according to our test-suite spec, and return the result code.
> @@ -226,6 +242,7 @@ do_test_num(const char *progname,
>    const struct svn_test_descriptor_t *desc;
>    const int array_size = get_array_size();
>    svn_boolean_t run_this_test; /* This test's mode matches DESC->MODE. */
> +  svn_error_malfunction_handler_t old_handler;
>  
>    /* Check our array bounds! */
>    if (test_num < 0)
> @@ -258,6 +275,8 @@ do_test_num(const char *progname,
>        apr_signal(SIGSEGV, crash_handler);
>      }
>  
> +  old_handler = svn_error_set_malfunction_handler(abort_handler);
> +
>    /* We use setjmp/longjmp to recover from the crash.  setjmp() essentially
>       establishes a rollback point, and longjmp() goes back to that point.
>       When we invoke longjmp(), it instructs setjmp() to return non-zero,
> @@ -286,6 +305,8 @@ do_test_num(const char *progname,
>                             "Test crashed "
>                             "(run in debugger with '--allow-segfaults')");
>  
> +  svn_error_set_malfunction_handler(old_handler);
> +
>    if (!allow_segfaults)
>      {
>        /* Now back to your regularly scheduled program... */
> 
> 

Reply via email to