summaryrefslogtreecommitdiffstats
path: root/src/backend/utils/error/assert.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/error/assert.c')
-rw-r--r--src/backend/utils/error/assert.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/backend/utils/error/assert.c b/src/backend/utils/error/assert.c
new file mode 100644
index 0000000..4dfa326
--- /dev/null
+++ b/src/backend/utils/error/assert.c
@@ -0,0 +1,68 @@
+/*-------------------------------------------------------------------------
+ *
+ * assert.c
+ * Assert code.
+ *
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/error/assert.c
+ *
+ * NOTE
+ * This should eventually work with elog()
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <unistd.h>
+#ifdef HAVE_EXECINFO_H
+#include <execinfo.h>
+#endif
+
+/*
+ * ExceptionalCondition - Handles the failure of an Assert()
+ */
+void
+ExceptionalCondition(const char *conditionName,
+ const char *errorType,
+ const char *fileName,
+ int lineNumber)
+{
+ if (!PointerIsValid(conditionName)
+ || !PointerIsValid(fileName)
+ || !PointerIsValid(errorType))
+ write_stderr("TRAP: ExceptionalCondition: bad arguments\n");
+ else
+ {
+ write_stderr("TRAP: %s(\"%s\", File: \"%s\", Line: %d)\n",
+ errorType, conditionName,
+ fileName, lineNumber);
+ }
+
+ /* Usually this shouldn't be needed, but make sure the msg went out */
+ fflush(stderr);
+
+#ifdef HAVE_BACKTRACE_SYMBOLS
+ {
+ void *buf[100];
+ int nframes;
+
+ nframes = backtrace(buf, lengthof(buf));
+ backtrace_symbols_fd(buf, nframes, fileno(stderr));
+ }
+#endif
+
+#ifdef SLEEP_ON_ASSERT
+
+ /*
+ * It would be nice to use pg_usleep() here, but only does 2000 sec or 33
+ * minutes, which seems too short.
+ */
+ sleep(1000000);
+#endif
+
+ abort();
+}