Commit 1a5fb654 authored by Marc G. Fournier's avatar Marc G. Fournier

From: Massimo Dal Zotto <dz@cs.unitn.it>

assert.patch

        adds a switch to turn on/off the assert checking if enabled at compile
        time. You can now compile postgres with assert checking and disable it
        at runtime in a production environment.
parent 1682c362
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.93 1998/07/09 03:28:47 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.94 1998/08/25 21:04:36 scrappy Exp $
* *
* NOTES * NOTES
* *
...@@ -238,6 +238,9 @@ void GetCharSetByHost(char *, int, char *); ...@@ -238,6 +238,9 @@ void GetCharSetByHost(char *, int, char *);
#endif #endif
#ifdef USE_ASSERT_CHECKING
int assert_enabled = 1;
#endif
static void static void
checkDataDir(const char *DataDir, bool *DataDirOK) checkDataDir(const char *DataDir, bool *DataDirOK)
...@@ -295,8 +298,6 @@ checkDataDir(const char *DataDir, bool *DataDirOK) ...@@ -295,8 +298,6 @@ checkDataDir(const char *DataDir, bool *DataDirOK)
} }
} }
int int
PostmasterMain(int argc, char *argv[]) PostmasterMain(int argc, char *argv[])
{ {
...@@ -365,10 +366,22 @@ PostmasterMain(int argc, char *argv[]) ...@@ -365,10 +366,22 @@ PostmasterMain(int argc, char *argv[])
DataDir = getenv("PGDATA"); /* default value */ DataDir = getenv("PGDATA"); /* default value */
opterr = 0; opterr = 0;
while ((opt = getopt(nonblank_argc, argv, "a:B:b:D:dim:Mno:p:Ss")) != EOF) while ((opt = getopt(nonblank_argc, argv,"A:a:B:b:D:dim:Mno:p:Ss")) != EOF)
{ {
switch (opt) switch (opt)
{ {
case 'A':
#ifndef USE_ASSERT_CHECKING
fprintf(stderr, "Assert checking is not enabled\n");
#else
/*
* Pass this option also to each backend.
*/
assert_enabled = atoi(optarg);
strcat(ExtraOptions, " -A ");
strcat(ExtraOptions, optarg);
#endif
break;
case 'a': case 'a':
/* Can no longer set authentication method. */ /* Can no longer set authentication method. */
break; break;
...@@ -566,6 +579,9 @@ static void ...@@ -566,6 +579,9 @@ static void
usage(const char *progname) usage(const char *progname)
{ {
fprintf(stderr, "usage: %s [options]\n", progname); fprintf(stderr, "usage: %s [options]\n", progname);
#ifdef USE_ASSERT_CHECKING
fprintf(stderr, "\t-A [1|0]\tenable/disable runtime assert checking\n");
#endif
fprintf(stderr, "\t-B nbufs\tset number of shared buffers\n"); fprintf(stderr, "\t-B nbufs\tset number of shared buffers\n");
fprintf(stderr, "\t-D datadir\tset data directory\n"); fprintf(stderr, "\t-D datadir\tset data directory\n");
fprintf(stderr, "\t-S \t\tsilent mode (disassociate from tty)\n"); fprintf(stderr, "\t-S \t\tsilent mode (disassociate from tty)\n");
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.84 1998/08/25 15:00:17 thomas Exp $ * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.85 1998/08/25 21:04:38 scrappy Exp $
* *
* NOTES * NOTES
* this is the "main" module of the postgres backend and * this is the "main" module of the postgres backend and
...@@ -850,6 +850,9 @@ usage(char *progname) ...@@ -850,6 +850,9 @@ usage(char *progname)
{ {
fprintf(stderr, fprintf(stderr,
"Usage: %s [options] [dbname]\n", progname); "Usage: %s [options] [dbname]\n", progname);
#ifdef USE_ASSERT_CHECKING
fprintf(stderr, " A: enable/disable assert checking\n");
#endif
fprintf(stderr, "\t-B buffers\tset number of buffers in buffer pool\n"); fprintf(stderr, "\t-B buffers\tset number of buffers in buffer pool\n");
fprintf(stderr, "\t-C \t\tsupress version info\n"); fprintf(stderr, "\t-C \t\tsupress version info\n");
fprintf(stderr, "\t-D dir\t\tdata directory\n"); fprintf(stderr, "\t-D dir\t\tdata directory\n");
...@@ -866,6 +869,7 @@ usage(char *progname) ...@@ -866,6 +869,7 @@ usage(char *progname)
fprintf(stderr, "\t-o file\t\tsend stdout and stderr to given filename \n"); fprintf(stderr, "\t-o file\t\tsend stdout and stderr to given filename \n");
fprintf(stderr, "\t-s \t\tshow stats after each query\n"); fprintf(stderr, "\t-s \t\tshow stats after each query\n");
fprintf(stderr, "\t-v version\tset protocol version being used by frontend\n"); fprintf(stderr, "\t-v version\tset protocol version being used by frontend\n");
fprintf(stderr, "\t-W \t\twait N seconds to allow attach from a debugger\n");
} }
/* ---------------------------------------------------------------- /* ----------------------------------------------------------------
...@@ -943,10 +947,22 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) ...@@ -943,10 +947,22 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
optind = 1; /* reset after postmaster usage */ optind = 1; /* reset after postmaster usage */
while ((flag = getopt(argc, argv, "B:bCD:d:Eef:iK:Lm:MNo:P:pQS:st:v:x:F")) while ((flag = getopt(argc, argv,
"A:B:bCD:d:Eef:iK:Lm:MNo:P:pQS:st:v:x:FW:"))
!= EOF) != EOF)
switch (flag) switch (flag)
{ {
case 'A':
/* ----------------
* enable/disable assert checking.
* ----------------
*/
#ifdef USE_ASSERT_CHECKING
assert_enabled = atoi(optarg);
#else
fprintf(stderr, "Assert checking is not enabled\n");
#endif
break;
case 'b': case 'b':
/* ---------------- /* ----------------
...@@ -955,6 +971,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) ...@@ -955,6 +971,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
*/ */
BushyPlanFlag = 1; BushyPlanFlag = 1;
break; break;
case 'B': case 'B':
/* ---------------- /* ----------------
* specify the size of buffer pool * specify the size of buffer pool
...@@ -1165,6 +1182,14 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) ...@@ -1165,6 +1182,14 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
FrontendProtocol = (ProtocolVersion) atoi(optarg); FrontendProtocol = (ProtocolVersion) atoi(optarg);
break; break;
case 'W':
/* ----------------
* wait N seconds to allow attach from a debugger
* ----------------
*/
sleep(atoi(optarg));
break;
case 'x': case 'x':
#if 0 /* planner/xfunc.h */ #if 0 /* planner/xfunc.h */
...@@ -1390,7 +1415,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) ...@@ -1390,7 +1415,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
if (!IsUnderPostmaster) if (!IsUnderPostmaster)
{ {
puts("\nPOSTGRES backend interactive interface"); puts("\nPOSTGRES backend interactive interface");
puts("$Revision: 1.84 $ $Date: 1998/08/25 15:00:17 $"); puts("$Revision: 1.85 $ $Date: 1998/08/25 21:04:38 $");
} }
/* ---------------- /* ----------------
...@@ -1631,3 +1656,29 @@ ShowUsage(void) ...@@ -1631,3 +1656,29 @@ ShowUsage(void)
PrintBufferUsage(StatFp); PrintBufferUsage(StatFp);
/* DisplayTupleCount(StatFp); */ /* DisplayTupleCount(StatFp); */
} }
#ifdef USE_ASSERT_CHECKING
int
assertEnable(int val)
{
assert_enabled = val;
return val;
}
#ifdef ASSERT_CHECKING_TEST
int
assertTest(int val)
{
Assert(val == 0);
if (assert_enabled) {
/* val != 0 should be trapped by previous Assert */
elog(NOTICE, "Assert test successfull (val = %d)", val);
} else {
elog(NOTICE, "Assert checking is disabled (val = %d)", val);
}
return val;
}
#endif
#endif
...@@ -7,11 +7,11 @@ ...@@ -7,11 +7,11 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/init/Attic/enbl.c,v 1.2 1997/09/07 04:53:42 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/init/Attic/enbl.c,v 1.3 1998/08/25 21:04:40 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "c.h" #include "postgres.h"
#include "utils/module.h" /* where the declarations go */ #include "utils/module.h" /* where the declarations go */
/* /*
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: c.h,v 1.42 1998/06/23 15:35:46 momjian Exp $ * $Id: c.h,v 1.43 1998/08/25 21:04:41 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -583,12 +583,10 @@ typedef struct Exception ...@@ -583,12 +583,10 @@ typedef struct Exception
} Exception; } Exception;
/* /*
* USE_ASSERT_CHECKING, if defined, turns off all the assertions. * USE_ASSERT_CHECKING, if defined, turns on all the assertions.
* - plai 9/5/90 * - plai 9/5/90
* *
* It should _NOT_ be undef'ed in releases or in benchmark copies * It should _NOT_ be defined in releases or in benchmark copies
*
* #undef USE_ASSERT_CHECKING
*/ */
/* /*
...@@ -597,7 +595,7 @@ typedef struct Exception ...@@ -597,7 +595,7 @@ typedef struct Exception
* *
*/ */
#define Trap(condition, exception) \ #define Trap(condition, exception) \
{ if (condition) \ { if ((assert_enabled) && (condition)) \
ExceptionalCondition(CppAsString(condition), &(exception), \ ExceptionalCondition(CppAsString(condition), &(exception), \
(char*)NULL, __FILE__, __LINE__); } (char*)NULL, __FILE__, __LINE__); }
...@@ -609,7 +607,7 @@ typedef struct Exception ...@@ -609,7 +607,7 @@ typedef struct Exception
* Isn't CPP fun? * Isn't CPP fun?
*/ */
#define TrapMacro(condition, exception) \ #define TrapMacro(condition, exception) \
((bool) ((! condition) || \ ((bool) ((! assert_enabled) || (! condition) || \
(ExceptionalCondition(CppAsString(condition), \ (ExceptionalCondition(CppAsString(condition), \
&(exception), \ &(exception), \
(char*) NULL, __FILE__, __LINE__)))) (char*) NULL, __FILE__, __LINE__))))
...@@ -619,6 +617,7 @@ typedef struct Exception ...@@ -619,6 +617,7 @@ typedef struct Exception
#define AssertMacro(condition) (void)true #define AssertMacro(condition) (void)true
#define AssertArg(condition) #define AssertArg(condition)
#define AssertState(condition) #define AssertState(condition)
#define assert_enabled 0
#else #else
#define Assert(condition) \ #define Assert(condition) \
Trap(!(condition), FailedAssertion) Trap(!(condition), FailedAssertion)
...@@ -632,6 +631,7 @@ typedef struct Exception ...@@ -632,6 +631,7 @@ typedef struct Exception
#define AssertState(condition) \ #define AssertState(condition) \
Trap(!(condition), BadState) Trap(!(condition), BadState)
extern int assert_enabled;
#endif /* USE_ASSERT_CHECKING */ #endif /* USE_ASSERT_CHECKING */
/* /*
...@@ -640,7 +640,7 @@ typedef struct Exception ...@@ -640,7 +640,7 @@ typedef struct Exception
* *
*/ */
#define LogTrap(condition, exception, printArgs) \ #define LogTrap(condition, exception, printArgs) \
{ if (condition) \ { if ((assert_enabled) && (condition)) \
ExceptionalCondition(CppAsString(condition), &(exception), \ ExceptionalCondition(CppAsString(condition), &(exception), \
form printArgs, __FILE__, __LINE__); } form printArgs, __FILE__, __LINE__); }
...@@ -650,7 +650,7 @@ typedef struct Exception ...@@ -650,7 +650,7 @@ typedef struct Exception
* #define foo(x) (LogAssertMacro(x != 0, "yow!") && bar(x)) * #define foo(x) (LogAssertMacro(x != 0, "yow!") && bar(x))
*/ */
#define LogTrapMacro(condition, exception, printArgs) \ #define LogTrapMacro(condition, exception, printArgs) \
((bool) ((! condition) || \ ((bool) ((! assert_enabled) || (! condition) || \
(ExceptionalCondition(CppAsString(condition), \ (ExceptionalCondition(CppAsString(condition), \
&(exception), \ &(exception), \
form printArgs, __FILE__, __LINE__)))) form printArgs, __FILE__, __LINE__))))
...@@ -673,6 +673,10 @@ typedef struct Exception ...@@ -673,6 +673,10 @@ typedef struct Exception
#define LogAssertState(condition, printArgs) \ #define LogAssertState(condition, printArgs) \
LogTrap(!(condition), BadState, printArgs) LogTrap(!(condition), BadState, printArgs)
extern int assertEnable(int val);
#ifdef ASSERT_CHECKING_TEST
extern int assertTest(int val);
#endif
#endif /* USE_ASSERT_CHECKING */ #endif /* USE_ASSERT_CHECKING */
/* ---------------------------------------------------------------- /* ----------------------------------------------------------------
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment