2013-04-17 00:00:59 -04:00
/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
// vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4:
# ident "$Id$"
# ident "Copyright (c) 2007-2012 Tokutek Inc. All rights reserved."
# ident "The technology is licensed by the Massachusetts Institute of Technology, Rutgers State University of New Jersey, and the Research Foundation of State University of New York at Stony Brook under United States of America Serial No. 11 / 760379 and to the patents and / or patent applications resulting from it."
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:23 -04:00
# include <stdint.h>
2013-04-16 23:59:23 -04:00
# include "errno.h"
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:47 -04:00
2013-04-17 00:00:58 -04:00
static inline int get_error_errno ( void ) ;
static inline int
get_maybe_error_errno ( void )
{
return errno ;
}
static inline void
set_errno ( int new_errno )
{
errno = new_errno ;
}
2013-04-17 00:00:25 -04:00
void toku_assert_init ( void ) __attribute__ ( ( constructor ) ) ;
2013-04-16 23:59:47 -04:00
void toku_assert_set_fpointers ( int ( * toku_maybe_get_engine_status_text_pointer ) ( char * , int ) ,
2013-04-17 00:00:58 -04:00
void ( * toku_maybe_set_env_panic_pointer ) ( int , const char * ) ,
2013-04-17 00:00:08 -04:00
uint64_t num_rows ) ;
2013-04-16 23:59:47 -04:00
2013-04-16 23:59:23 -04:00
void toku_do_assert ( int /*expr*/ , const char */ * expr_as_string */ , const char */ * fun */ , const char */ * file */ , int /*line*/ , int /*errno*/ ) __attribute__ ( ( __visibility__ ( " default " ) ) ) ;
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__ ) ) ;
2013-04-16 23:59:23 -04:00
void toku_do_assert_zero_fail ( uintptr_t /*expr*/ , const char */ * expr_as_string */ , const char */ * fun */ , const char */ * file */ , int /*line*/ , int /*errno*/ ) __attribute__ ( ( __visibility__ ( " default " ) ) ) __attribute__ ( ( __noreturn__ ) ) ;
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-17 00:00:58 -04:00
# define assert(expr) toku_do_assert((expr) != 0, #expr, __FUNCTION__, __FILE__, __LINE__, get_maybe_error_errno())
# define assert_zero(expr) toku_do_assert((expr) == 0, #expr, __FUNCTION__, __FILE__, __LINE__, get_maybe_error_errno())
2013-04-16 23:58:56 -04:00
# else
2013-04-17 00:00:58 -04:00
# define assert(expr) ((expr) ? (void)0 : toku_do_assert_fail(#expr, __FUNCTION__, __FILE__, __LINE__, get_maybe_error_errno()))
# define assert_zero(expr) ((expr) == 0 ? (void)0 : toku_do_assert_zero_fail((uintptr_t)(expr), #expr, __FUNCTION__, __FILE__, __LINE__, get_maybe_error_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:23 -04:00
# define lazy_assert(a) assert(a) // indicates code is incomplete
# define lazy_assert_zero(a) assert_zero(a) // indicates code is incomplete
# define invariant(a) assert(a) // indicates a code invariant that must be true
2013-04-17 00:00:57 -04:00
# define invariant_null(a) assert_zero(a) // indicates a code invariant that must be true
# define invariant_notnull(a) assert(a) // indicates a code invariant that must be true
2013-04-16 23:59:23 -04:00
# define invariant_zero(a) assert_zero(a) // indicates a code invariant that must be true
# define resource_assert(a) assert(a) // indicates resource must be available, otherwise unrecoverable
# define resource_assert_zero(a) assert_zero(a) // indicates resource must be available, otherwise unrecoverable
2013-04-16 23:59:13 -04:00
2013-04-17 00:00:58 -04:00
static inline int
get_error_errno ( void )
{
invariant ( errno ) ;
return errno ;
}
2013-04-16 23:59:09 -04:00
2008-02-07 16:35:39 +00:00
# endif