[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: