diff --git a/src/error.c b/src/error.c index 9cc6314250e008218e80672548c794d9eaaeb122..8f863f7a22c40a9cd6458b0c23d544ea5f8a91d0 100644 --- a/src/error.c +++ b/src/error.c @@ -2,7 +2,7 @@ || This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information. -|| $Id: error.c,v 1.119 2003/11/14 04:10:32 mast Exp $ +|| $Id: error.c,v 1.120 2004/02/09 18:49:16 mast Exp $ */ #define NO_PIKE_SHORTHAND @@ -23,7 +23,7 @@ #include "threads.h" #include "gc.h" -RCSID("$Id: error.c,v 1.119 2003/11/14 04:10:32 mast Exp $"); +RCSID("$Id: error.c,v 1.120 2004/02/09 18:49:16 mast Exp $"); #undef ATTRIBUTE #define ATTRIBUTE(X) @@ -410,10 +410,24 @@ PMOD_EXPORT DECLSPEC(noreturn) void debug_fatal(const char *fmt, ...) ATTRIBUTE( if(Pike_sp && Pike_interpreter.evaluator_stack && master_object && master_object->prog) { - push_error("Backtrace at time of fatal:\n"); - APPLY_MASTER("describe_backtrace",1); - if(Pike_sp[-1].type==PIKE_T_STRING) - write_to_stderr(Pike_sp[-1].u.string->str, Pike_sp[-1].u.string->len); + JMP_BUF jmp; + struct callback_list saved_eval_cbs = evaluator_callbacks; + /* Don't want thread switches or any other evaluator stuff while + * we let the master describe the backtrace below. */ + low_init_threads_disable(); + MEMSET (&evaluator_callbacks, 0, sizeof (evaluator_callbacks)); + if (SETJMP (jmp)) + fprintf(stderr,"Got exception when trying to describe backtrace.\n"); + else { + jmp.severity = THROW_EXIT; /* Don't want normal exit code to run here. */ + push_error("Backtrace at time of fatal:\n"); + APPLY_MASTER("describe_backtrace",1); + if(Pike_sp[-1].type==PIKE_T_STRING) + write_to_stderr(Pike_sp[-1].u.string->str, Pike_sp[-1].u.string->len); + } + UNSETJMP (jmp); + exit_threads_disable (NULL); + evaluator_callbacks = saved_eval_cbs; }else{ fprintf(stderr,"No stack - no backtrace.\n"); }