#ifndef _DB_DEBUG_H_
#define _DB_DEBUG_H_
#if defined(__cplusplus)
extern "C" {
#endif
#if !defined(__GNUC__) || __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
#define __attribute__(s)
#endif
#define CLEAR_BYTE 0xdb
#define GUARD_BYTE 0xdc
#if defined(__STDC__) && defined(DIAGNOSTIC)
#define DB_ASSERT(e) ((e) ? (void)0 : __db_assert(#e, __FILE__, __LINE__))
#else
#define DB_ASSERT(e)
#endif
#define COMPQUIET(n, v) \
(n) = (v); \
(n) = (n)
#ifdef UMRW
#define UMRW_SET(v) (v) = 0
#else
#define UMRW_SET(v)
#endif
#if defined(STDC_HEADERS) || defined(__cplusplus)
#define DB_REAL_ERR(env, error, error_set, stderr_default, fmt) { \
va_list ap; \
\
\
va_start(ap, fmt); \
if ((env) != NULL && (env)->db_errcall != NULL) \
__db_errcall(env, error, error_set, fmt, ap); \
va_end(ap); \
\
\
va_start(ap, fmt); \
if ((env) != NULL && (env)->db_errfile != NULL) \
__db_errfile(env, error, error_set, fmt, ap); \
va_end(ap); \
\
\
va_start(ap, fmt); \
if ((stderr_default) && ((env) == NULL || \
((env)->db_errcall == NULL && (env)->db_errfile == NULL))) \
__db_errfile(env, error, error_set, fmt, ap); \
va_end(ap); \
}
#else
#define DB_REAL_ERR(env, error, error_set, stderr_default, fmt) { \
va_list ap; \
\
\
va_start(ap); \
if ((env) != NULL && (env)->db_errcall != NULL) \
__db_errcall(env, error, error_set, fmt, ap); \
va_end(ap); \
\
\
va_start(ap); \
if ((env) != NULL && (env)->db_errfile != NULL) \
__db_errfile(env, error, error_set, fmt, ap); \
va_end(ap); \
\
\
va_start(ap); \
if ((stderr_default) && ((env) == NULL || \
((env)->db_errcall == NULL && (env)->db_errfile == NULL))) \
__db_errfile(env, error, error_set, fmt, ap); \
va_end(ap); \
}
#endif
#define LOG_OP(C, T, O, K, A, F) { \
DB_LSN __lsn; \
DBT __op; \
if (DBC_LOGGING((C))) { \
memset(&__op, 0, sizeof(__op)); \
__op.data = O; \
__op.size = strlen(O) + 1; \
(void)__db_debug_log((C)->dbp->dbenv, T, &__lsn, 0, \
&__op, (C)->dbp->log_filename->id, K, A, F); \
} \
}
#ifdef DEBUG_ROP
#define DEBUG_LREAD(C, T, O, K, A, F) LOG_OP(C, T, O, K, A, F)
#else
#define DEBUG_LREAD(C, T, O, K, A, F)
#endif
#ifdef DEBUG_WOP
#define DEBUG_LWRITE(C, T, O, K, A, F) LOG_OP(C, T, O, K, A, F)
#else
#define DEBUG_LWRITE(C, T, O, K, A, F)
#endif
#if CONFIG_TEST
#define DB_TEST_SUBLOCKS(env, flags) \
do { \
if ((env)->test_abort == DB_TEST_SUBDB_LOCKS) \
(flags) |= DB_LOCK_NOWAIT; \
} while (0)
#define DB_ENV_TEST_RECOVERY(env, val, ret, name) \
do { \
int __ret; \
PANIC_CHECK((env)); \
if ((env)->test_copy == (val)) { \
\
if ((__ret = __db_testcopy((env), NULL, (name))) != 0) \
(ret) = __db_panic((env), __ret); \
} \
if ((env)->test_abort == (val)) { \
\
(env)->test_abort = 0; \
(ret) = EINVAL; \
goto db_tr_err; \
} \
} while (0)
#define DB_TEST_RECOVERY(dbp, val, ret, name) \
do { \
int __ret; \
PANIC_CHECK((dbp)->dbenv); \
if ((dbp)->dbenv->test_copy == (val)) { \
\
if (F_ISSET((dbp), \
DB_AM_OPEN_CALLED) && (dbp)->mpf != NULL) \
(void)__db_sync(dbp); \
if ((__ret = \
__db_testcopy((dbp)->dbenv, (dbp), (name))) != 0) \
(ret) = __db_panic((dbp)->dbenv, __ret); \
} \
if ((dbp)->dbenv->test_abort == (val)) { \
\
(dbp)->dbenv->test_abort = 0; \
(ret) = EINVAL; \
goto db_tr_err; \
} \
} while (0)
#define DB_TEST_RECOVERY_LABEL db_tr_err:
#else
#define DB_TEST_SUBLOCKS(env, flags)
#define DB_ENV_TEST_RECOVERY(env, val, ret, name)
#define DB_TEST_RECOVERY(dbp, val, ret, name)
#define DB_TEST_RECOVERY_LABEL
#endif
#if defined(__cplusplus)
}
#endif
#endif