diff options
Diffstat (limited to 'storage/innobase/include/ut0dbg.h')
-rw-r--r-- | storage/innobase/include/ut0dbg.h | 158 |
1 files changed, 106 insertions, 52 deletions
diff --git a/storage/innobase/include/ut0dbg.h b/storage/innobase/include/ut0dbg.h index 3f5baef0a3c..cf80c1aa0ad 100644 --- a/storage/innobase/include/ut0dbg.h +++ b/storage/innobase/include/ut0dbg.h @@ -32,27 +32,12 @@ Created 1/30/1994 Heikki Tuuri #define ut_error assert(0) #else /* !UNIV_INNOCHECKSUM */ -#include "univ.i" -#include <stdlib.h> -#include "os0thread.h" +/* Do not include univ.i because univ.i includes this. */ -#if defined(__GNUC__) && (__GNUC__ > 2) -/** Test if an assertion fails. -@param EXPR assertion expression -@return nonzero if EXPR holds, zero if not */ -# define UT_DBG_FAIL(EXPR) UNIV_UNLIKELY(!((ulint)(EXPR))) -#else -/** This is used to eliminate compiler warnings */ -extern ulint ut_dbg_zero; -/** Test if an assertion fails. -@param EXPR assertion expression -@return nonzero if EXPR holds, zero if not */ -# define UT_DBG_FAIL(EXPR) !((ulint)(EXPR) + ut_dbg_zero) -#endif +#include "os0thread.h" /*************************************************************//** Report a failed assertion. */ -UNIV_INTERN void ut_dbg_assertion_failed( /*====================*/ @@ -61,30 +46,24 @@ ut_dbg_assertion_failed( ulint line) /*!< in: line number of the assertion */ UNIV_COLD MY_ATTRIBUTE((nonnull(2))); -/** Abort the execution. */ -# define UT_DBG_PANIC abort() - /** Abort execution if EXPR does not evaluate to nonzero. -@param EXPR assertion expression that should hold */ +@param EXPR assertion expression that should hold */ #define ut_a(EXPR) do { \ - if (UT_DBG_FAIL(EXPR)) { \ + if (UNIV_UNLIKELY(!(ulint) (EXPR))) { \ ut_dbg_assertion_failed(#EXPR, \ __FILE__, (ulint) __LINE__); \ - UT_DBG_PANIC; \ } \ } while (0) /** Abort execution. */ -#define ut_error do { \ - ut_dbg_assertion_failed(0, __FILE__, (ulint) __LINE__); \ - UT_DBG_PANIC; \ -} while (0) +#define ut_error \ + ut_dbg_assertion_failed(0, __FILE__, (ulint) __LINE__) #ifdef UNIV_DEBUG /** Debug assertion. Does nothing unless UNIV_DEBUG is defined. */ #define ut_ad(EXPR) ut_a(EXPR) /** Debug statement. Does nothing unless UNIV_DEBUG is defined. */ -#define ut_d(EXPR) do {EXPR;} while (0) +#define ut_d(EXPR) EXPR #else /** Debug assertion. Does nothing unless UNIV_DEBUG is defined. */ #define ut_ad(EXPR) @@ -93,39 +72,114 @@ ut_dbg_assertion_failed( #endif /** Silence warnings about an unused variable by doing a null assignment. -@param A the unused variable */ +@param A the unused variable */ #define UT_NOT_USED(A) A = A -#ifdef UNIV_COMPILE_TEST_FUNCS +#if defined(HAVE_SYS_TIME_H) && defined(HAVE_SYS_RESOURCE_H) + +#define HAVE_UT_CHRONO_T #include <sys/types.h> #include <sys/time.h> #include <sys/resource.h> -/** structure used for recording usage statistics */ -struct speedo_t { - struct rusage ru; /*!< getrusage() result */ - struct timeval tv; /*!< gettimeofday() result */ +/** A "chronometer" used to clock snippets of code. +Example usage: + ut_chrono_t ch("this loop"); + for (;;) { ... } + ch.show(); +would print the timings of the for() loop, prefixed with "this loop:" */ +class ut_chrono_t { +public: + /** Constructor. + @param[in] name chrono's name, used when showing the values */ + ut_chrono_t( + const char* name) + : + m_name(name), + m_show_from_destructor(true) + { + reset(); + } + + /** Resets the chrono (records the current time in it). */ + void + reset() + { + gettimeofday(&m_tv, NULL); + + getrusage(RUSAGE_SELF, &m_ru); + } + + /** Shows the time elapsed and usage statistics since the last reset. */ + void + show() + { + struct rusage ru_now; + struct timeval tv_now; + struct timeval tv_diff; + + getrusage(RUSAGE_SELF, &ru_now); + + gettimeofday(&tv_now, NULL); + +#ifndef timersub +#define timersub(a, b, r) \ + do { \ + (r)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ + (r)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ + if ((r)->tv_usec < 0) { \ + (r)->tv_sec--; \ + (r)->tv_usec += 1000000; \ + } \ + } while (0) +#endif /* timersub */ + +#define CHRONO_PRINT(type, tvp) \ + fprintf(stderr, "%s: %s% 5ld.%06ld sec\n", \ + m_name, type, \ + static_cast<long>((tvp)->tv_sec), \ + static_cast<long>((tvp)->tv_usec)) + + timersub(&tv_now, &m_tv, &tv_diff); + CHRONO_PRINT("real", &tv_diff); + + timersub(&ru_now.ru_utime, &m_ru.ru_utime, &tv_diff); + CHRONO_PRINT("user", &tv_diff); + + timersub(&ru_now.ru_stime, &m_ru.ru_stime, &tv_diff); + CHRONO_PRINT("sys ", &tv_diff); + } + + /** Cause the timings not to be printed from the destructor. */ + void end() + { + m_show_from_destructor = false; + } + + /** Destructor. */ + ~ut_chrono_t() + { + if (m_show_from_destructor) { + show(); + } + } + +private: + /** Name of this chronometer. */ + const char* m_name; + + /** True if the current timings should be printed by the destructor. */ + bool m_show_from_destructor; + + /** getrusage() result as of the last reset(). */ + struct rusage m_ru; + + /** gettimeofday() result as of the last reset(). */ + struct timeval m_tv; }; -/*******************************************************************//** -Resets a speedo (records the current time in it). */ -UNIV_INTERN -void -speedo_reset( -/*=========*/ - speedo_t* speedo); /*!< out: speedo */ - -/*******************************************************************//** -Shows the time elapsed and usage statistics since the last reset of a -speedo. */ -UNIV_INTERN -void -speedo_show( -/*========*/ - const speedo_t* speedo); /*!< in: speedo */ - -#endif /* UNIV_COMPILE_TEST_FUNCS */ +#endif /* HAVE_SYS_TIME_H && HAVE_SYS_RESOURCE_H */ #endif /* !UNIV_INNOCHECKSUM */ |