[PATCH 1/5] Centralize Assert* macros into c.h so its common between backend/frontend - Mailing list pgsql-hackers

From Andres Freund
Subject [PATCH 1/5] Centralize Assert* macros into c.h so its common between backend/frontend
Date
Msg-id 1357672187-7693-2-git-send-email-andres@2ndquadrant.com
Whole thread Raw
In response to [PATCH] xlogreader-v4  (Andres Freund <andres@2ndquadrant.com>)
Responses Re: [PATCH 1/5] Centralize Assert* macros into c.h so its common between backend/frontend
List pgsql-hackers
From: Andres Freund <andres@anarazel.de>

c.h already had parts of the assert support (StaticAssert*) and its the shared
file between postgres.h and postgres_fe.h. This makes it easier to build
frontend programs which have to do the hack.
---src/include/c.h           | 65 +++++++++++++++++++++++++++++++++++++++++++++++src/include/postgres.h    | 54
++-------------------------------------src/include/postgres_fe.h| 12 ---------3 files changed, 67 insertions(+), 64
deletions(-)

diff --git a/src/include/c.h b/src/include/c.h
index f7db157..c30df8b 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -694,6 +694,71 @@ typedef NameData *Name;/*
+ * USE_ASSERT_CHECKING, if defined, turns on all the assertions.
+ * - plai  9/5/90
+ *
+ * It should _NOT_ be defined in releases or in benchmark copies
+ */
+
+/*
+ * Assert() can be used in both frontend and backend code. In frontend code it
+ * just calls the standard assert, if it's available. If use of assertions is
+ * not configured, it does nothing.
+ */
+#ifndef USE_ASSERT_CHECKING
+
+#define Assert(condition)
+#define AssertMacro(condition)    ((void)true)
+#define AssertArg(condition)
+#define AssertState(condition)
+
+#elif defined FRONTEND
+
+#include <assert.h>
+#define Assert(p) assert(p)
+#define AssertMacro(p)    ((void) assert(p))
+
+#else /* USE_ASSERT_CHECKING && FRONTEND */
+
+/*
+ * Trap
+ *        Generates an exception if the given condition is true.
+ */
+#define Trap(condition, errorType) \
+    do { \
+        if ((assert_enabled) && (condition)) \
+            ExceptionalCondition(CppAsString(condition), (errorType), \
+                                 __FILE__, __LINE__); \
+    } while (0)
+
+/*
+ *    TrapMacro is the same as Trap but it's intended for use in macros:
+ *
+ *        #define foo(x) (AssertMacro(x != 0), bar(x))
+ *
+ *    Isn't CPP fun?
+ */
+#define TrapMacro(condition, errorType) \
+    ((bool) ((! assert_enabled) || ! (condition) || \
+             (ExceptionalCondition(CppAsString(condition), (errorType), \
+                                   __FILE__, __LINE__), 0)))
+
+#define Assert(condition) \
+        Trap(!(condition), "FailedAssertion")
+
+#define AssertMacro(condition) \
+        ((void) TrapMacro(!(condition), "FailedAssertion"))
+
+#define AssertArg(condition) \
+        Trap(!(condition), "BadArgument")
+
+#define AssertState(condition) \
+        Trap(!(condition), "BadState")
+
+#endif /* USE_ASSERT_CHECKING && !FRONTEND */
+
+
+/* * Macros to support compile-time assertion checks. * * If the "condition" (a compile-time-constant expression)
evaluatesto false,
 
diff --git a/src/include/postgres.h b/src/include/postgres.h
index b6e922f..bbe125a 100644
--- a/src/include/postgres.h
+++ b/src/include/postgres.h
@@ -25,7 +25,7 @@ *      -------    ------------------------------------------------ *        1)        variable-length
datatypes(TOAST support) *        2)        datum type + support macros
 
- *        3)        exception handling definitions
+ *        3)        exception handling * *     NOTES *
@@ -627,62 +627,12 @@ extern Datum Float8GetDatum(float8 X);/*
----------------------------------------------------------------
- *                Section 3:    exception handling definitions
- *                            Assert, Trap, etc macros
+ *                Section 3:    exception handling backend support *
----------------------------------------------------------------*/extern PGDLLIMPORT bool assert_enabled;
 
-/*
- * USE_ASSERT_CHECKING, if defined, turns on all the assertions.
- * - plai  9/5/90
- *
- * It should _NOT_ be defined in releases or in benchmark copies
- */
-
-/*
- * Trap
- *        Generates an exception if the given condition is true.
- */
-#define Trap(condition, errorType) \
-    do { \
-        if ((assert_enabled) && (condition)) \
-            ExceptionalCondition(CppAsString(condition), (errorType), \
-                                 __FILE__, __LINE__); \
-    } while (0)
-
-/*
- *    TrapMacro is the same as Trap but it's intended for use in macros:
- *
- *        #define foo(x) (AssertMacro(x != 0), bar(x))
- *
- *    Isn't CPP fun?
- */
-#define TrapMacro(condition, errorType) \
-    ((bool) ((! assert_enabled) || ! (condition) || \
-             (ExceptionalCondition(CppAsString(condition), (errorType), \
-                                   __FILE__, __LINE__), 0)))
-
-#ifndef USE_ASSERT_CHECKING
-#define Assert(condition)
-#define AssertMacro(condition)    ((void)true)
-#define AssertArg(condition)
-#define AssertState(condition)
-#else
-#define Assert(condition) \
-        Trap(!(condition), "FailedAssertion")
-
-#define AssertMacro(condition) \
-        ((void) TrapMacro(!(condition), "FailedAssertion"))
-
-#define AssertArg(condition) \
-        Trap(!(condition), "BadArgument")
-
-#define AssertState(condition) \
-        Trap(!(condition), "BadState")
-#endif   /* USE_ASSERT_CHECKING */
-extern void ExceptionalCondition(const char *conditionName,                     const char *errorType,
constchar *fileName, int lineNumber) __attribute__((noreturn));
 
diff --git a/src/include/postgres_fe.h b/src/include/postgres_fe.h
index af31227..0f35ecc 100644
--- a/src/include/postgres_fe.h
+++ b/src/include/postgres_fe.h
@@ -24,16 +24,4 @@#include "c.h"
-/*
- * Assert() can be used in both frontend and backend code. In frontend code it
- * just calls the standard assert, if it's available. If use of assertions is
- * not configured, it does nothing.
- */
-#ifdef USE_ASSERT_CHECKING
-#include <assert.h>
-#define Assert(p) assert(p)
-#else
-#define Assert(p)
-#endif
-#endif   /* POSTGRES_FE_H */
-- 
1.7.12.289.g0ce9864.dirty




pgsql-hackers by date:

Previous
From: Andres Freund
Date:
Subject: [PATCH 2/5] Make relpathbackend return a statically result instead of palloc()'ing it
Next
From: Andres Freund
Date:
Subject: [PATCH 4/5] Add pg_xlogdump contrib module