2008-02-08 03:17:38 +00:00
# ifndef TOKU_ASSERT_H
# define TOKU_ASSERT_H
2008-02-07 16:35:39 +00:00
/* The problem with assert.h: If NDEBUG is set then it doesn't execute the function, if NDEBUG isn't set then we get a branch that isn't taken. */
/* This version will complain if NDEBUG is set. */
/* It evaluates the argument and then calls a function toku_do_assert() which takes all the hits for the branches not taken. */
2013-04-16 23:59:15 -04:00
# include "c_dialects.h"
2013-04-16 23:59:23 -04:00
# include "errno.h"
2013-04-16 23:59:09 -04:00
2013-04-16 23:59:15 -04:00
C_BEGIN
2013-04-16 23:59:09 -04:00
2008-02-07 16:35:39 +00:00
# ifdef NDEBUG
# error NDEBUG should not be set
# endif
2013-04-16 23:59:23 -04:00
void toku_do_assert_fail ( const char */ * expr_as_string */ , const char */ * fun */ , const char */ * file */ , int /*line*/ , int /*errno*/ ) __attribute__ ( ( __visibility__ ( " default " ) ) ) __attribute__ ( ( __noreturn__ ) ) ;
void toku_do_assert ( int , const char */ * expr_as_string */ , const char */ * fun */ , const char */ * file */ , int /*line*/ , int /*errno*/ ) __attribute__ ( ( __visibility__ ( " default " ) ) ) ;
2008-02-07 16:35:39 +00:00
2013-04-16 23:57:24 -04:00
// Define GCOV if you want to get test-coverage information that ignores the assert statements.
2013-04-16 23:57:48 -04:00
// #define GCOV
2013-04-16 23:58:56 -04:00
2013-04-16 23:59:15 -04:00
extern void ( * do_assert_hook ) ( void ) ; // Set this to a function you want called after printing the assertion failure message but before calling abort(). By default this is NULL.
2013-04-16 23:58:56 -04:00
# if defined(GCOV) || TOKU_WINDOWS
2013-04-16 23:59:23 -04:00
# define assert(expr) toku_do_assert((expr) != 0, #expr, __FUNCTION__, __FILE__, __LINE__, errno)
2013-04-16 23:58:56 -04:00
# else
2013-04-16 23:59:23 -04:00
# define assert(expr) ((expr) ? (void)0 : toku_do_assert_fail(#expr, __FUNCTION__, __FILE__, __LINE__, errno))
2013-04-16 23:58:56 -04:00
# endif
2013-04-16 23:57:24 -04:00
# ifdef GCOV
# define WHEN_GCOV(x) x
# define WHEN_NOT_GCOV(x)
2008-02-07 16:35:39 +00:00
# else
2013-04-16 23:57:48 -04:00
# define WHEN_GCOV(x)
# define WHEN_NOT_GCOV(x) x
2008-02-08 03:17:38 +00:00
# endif
2013-04-16 23:57:48 -04:00
2013-04-16 23:59:13 -04:00
# define lazy_assert(a) assert(a) // indicates code is incomplete
# define invariant(a) assert(a) // indicates a code invariant that must be true
# define resource_assert(a) assert(a) // indicates resource must be available, otherwise unrecoverable
2013-04-16 23:59:15 -04:00
C_END
2013-04-16 23:59:09 -04:00
2008-02-07 16:35:39 +00:00
# endif