From: Tom Lane Date: Sun, 3 Aug 2003 23:44:44 +0000 (+0000) Subject: Reconsider context for calling callback functions --- original idea X-Git-Tag: REL7_4_BETA1~30 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c1c7b338eebe986dfa50da8a99b804ccc4e85160;p=postgresql Reconsider context for calling callback functions --- original idea that they aren't part of error processing is clearly faulty. --- diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 33b2a72049..a8d2984009 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -37,7 +37,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.115 2003/07/27 21:49:54 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.116 2003/08/03 23:44:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -318,12 +318,19 @@ errfinish(int dummy, ...) MemoryContext oldcontext; ErrorContextCallback *econtext; + recursion_depth++; CHECK_STACK_DEPTH(); /* - * Call any context callback functions. We can treat ereports occuring - * in callback functions as re-entrant rather than recursive case, so - * don't increment recursion_depth yet. + * Do processing in ErrorContext, which we hope has enough reserved space + * to report an error. + */ + oldcontext = MemoryContextSwitchTo(ErrorContext); + + /* + * Call any context callback functions. Errors occurring in callback + * functions will be treated as recursive errors --- this ensures we + * will avoid infinite recursion (see errstart). */ for (econtext = error_context_stack; econtext != NULL; @@ -332,15 +339,6 @@ errfinish(int dummy, ...) (*econtext->callback) (econtext->arg); } - /* Now we are ready to process the error. */ - recursion_depth++; - - /* - * Do processing in ErrorContext, which we hope has enough reserved space - * to report an error. - */ - oldcontext = MemoryContextSwitchTo(ErrorContext); - /* Send to server log, if enabled */ if (edata->output_to_server) send_message_to_server_log(edata);