mirror of
https://github.com/postgres/postgres.git
synced 2025-06-02 00:01:40 -04:00
Remove the Trap and TrapMacro macros, which were nearly unused and confusingly had the opposite condition polarity from the otherwise-functionally-equivalent Assert macros. Having done that, it's very hard to justify carrying the errorType argument of ExceptionalCondition, so drop that too, and just let it assume everything's an Assert. This saves about 64K of code space as of current HEAD. Discussion: https://postgr.es/m/3928703.1665345117@sss.pgh.pa.us
68 lines
1.8 KiB
C
68 lines
1.8 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* assert.c
|
|
* Assert support code.
|
|
*
|
|
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
*
|
|
* IDENTIFICATION
|
|
* src/backend/utils/error/assert.c
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#include "postgres.h"
|
|
|
|
#include <unistd.h>
|
|
#ifdef HAVE_EXECINFO_H
|
|
#include <execinfo.h>
|
|
#endif
|
|
|
|
/*
|
|
* ExceptionalCondition - Handles the failure of an Assert()
|
|
*
|
|
* We intentionally do not go through elog() here, on the grounds of
|
|
* wanting to minimize the amount of infrastructure that has to be
|
|
* working to report an assertion failure.
|
|
*/
|
|
void
|
|
ExceptionalCondition(const char *conditionName,
|
|
const char *fileName,
|
|
int lineNumber)
|
|
{
|
|
/* Report the failure on stderr (or local equivalent) */
|
|
if (!PointerIsValid(conditionName)
|
|
|| !PointerIsValid(fileName))
|
|
write_stderr("TRAP: ExceptionalCondition: bad arguments in PID %d\n",
|
|
(int) getpid());
|
|
else
|
|
write_stderr("TRAP: failed Assert(\"%s\"), File: \"%s\", Line: %d, PID: %d\n",
|
|
conditionName, fileName, lineNumber, (int) getpid());
|
|
|
|
/* Usually this shouldn't be needed, but make sure the msg went out */
|
|
fflush(stderr);
|
|
|
|
/* If we have support for it, dump a simple backtrace */
|
|
#ifdef HAVE_BACKTRACE_SYMBOLS
|
|
{
|
|
void *buf[100];
|
|
int nframes;
|
|
|
|
nframes = backtrace(buf, lengthof(buf));
|
|
backtrace_symbols_fd(buf, nframes, fileno(stderr));
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* If configured to do so, sleep indefinitely to allow user to attach a
|
|
* debugger. It would be nice to use pg_usleep() here, but that can sleep
|
|
* at most 2G usec or ~33 minutes, which seems too short.
|
|
*/
|
|
#ifdef SLEEP_ON_ASSERT
|
|
sleep(1000000);
|
|
#endif
|
|
|
|
abort();
|
|
}
|