]> granicus.if.org Git - postgresql/commitdiff
Reconsider context for calling callback functions --- original idea
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 3 Aug 2003 23:44:44 +0000 (23:44 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 3 Aug 2003 23:44:44 +0000 (23:44 +0000)
that they aren't part of error processing is clearly faulty.

src/backend/utils/error/elog.c

index 33b2a720491e6d8b23e710c8ab78c61e7b131c34..a8d29840095594a08ffb50f5eb35f31eebd6ff0d 100644 (file)
@@ -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);