debug.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1998-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  *
  7.  * $Id: debug.h,v 11.31 2002/08/06 06:37:08 bostic Exp $
  8.  */
  9. #ifndef _DB_DEBUG_H_
  10. #define _DB_DEBUG_H_
  11. #if defined(__cplusplus)
  12. extern "C" {
  13. #endif
  14. /*
  15.  * When running with #DIAGNOSTIC defined, we smash memory and do memory
  16.  * guarding with a special byte value.
  17.  */
  18. #define CLEAR_BYTE 0xdb
  19. #define GUARD_BYTE 0xdc
  20. /*
  21.  * DB assertions.
  22.  */
  23. #if defined(DIAGNOSTIC) && defined(__STDC__)
  24. #define DB_ASSERT(e) ((e) ? (void)0 : __db_assert(#e, __FILE__, __LINE__))
  25. #else
  26. #define DB_ASSERT(e)
  27. #endif
  28. /*
  29.  * Purify and other run-time tools complain about uninitialized reads/writes
  30.  * of structure fields whose only purpose is padding, as well as when heap
  31.  * memory that was never initialized is written to disk.
  32.  */
  33. #ifdef UMRW
  34. #define UMRW_SET(v) (v) = 0
  35. #else
  36. #define UMRW_SET(v)
  37. #endif
  38. /*
  39.  * Error message handling.  Use a macro instead of a function because va_list
  40.  * references to variadic arguments cannot be reset to the beginning of the
  41.  * variadic argument list (and then rescanned), by functions other than the
  42.  * original routine that took the variadic list of arguments.
  43.  */
  44. #if defined(__STDC__) || defined(__cplusplus)
  45. #define DB_REAL_ERR(env, error, error_set, stderr_default, fmt) {
  46. va_list ap;
  47. /* Call the user's callback function, if specified. */
  48. va_start(ap, fmt);
  49. if ((env) != NULL && (env)->db_errcall != NULL)
  50. __db_errcall(env, error, error_set, fmt, ap);
  51. va_end(ap);
  52. /* Write to the user's file descriptor, if specified. */
  53. va_start(ap, fmt);
  54. if ((env) != NULL && (env)->db_errfile != NULL)
  55. __db_errfile(env, error, error_set, fmt, ap);
  56. va_end(ap);
  57. /*
  58.  * If we have a default and we didn't do either of the above,
  59.  * write to the default.
  60.  */
  61. va_start(ap, fmt);
  62. if ((stderr_default) && ((env) == NULL ||
  63.     ((env)->db_errcall == NULL && (env)->db_errfile == NULL)))
  64. __db_errfile(env, error, error_set, fmt, ap);
  65. va_end(ap);
  66. }
  67. #else
  68. #define DB_REAL_ERR(env, error, error_set, stderr_default, fmt) {
  69. va_list ap;
  70. /* Call the user's callback function, if specified. */
  71. va_start(ap);
  72. if ((env) != NULL && (env)->db_errcall != NULL)
  73. __db_errcall(env, error, error_set, fmt, ap);
  74. va_end(ap);
  75. /* Write to the user's file descriptor, if specified. */
  76. va_start(ap);
  77. if ((env) != NULL && (env)->db_errfile != NULL)
  78. __db_errfile(env, error, error_set, fmt, ap);
  79. va_end(ap);
  80. /*
  81.  * If we have a default and we didn't do either of the above,
  82.  * write to the default.
  83.  */
  84. va_start(ap);
  85. if ((stderr_default) && ((env) == NULL ||
  86.     ((env)->db_errcall == NULL && (env)->db_errfile == NULL)))
  87. __db_errfile(env, error, error_set, fmt, ap);
  88. va_end(ap);
  89. }
  90. #endif
  91. /*
  92.  * Debugging macro to log operations.
  93.  * If DEBUG_WOP is defined, log operations that modify the database.
  94.  * If DEBUG_ROP is defined, log operations that read the database.
  95.  *
  96.  * D dbp
  97.  * T txn
  98.  * O operation (string)
  99.  * K key
  100.  * A data
  101.  * F flags
  102.  */
  103. #define LOG_OP(C, T, O, K, A, F) {
  104. DB_LSN __lsn;
  105. DBT __op;
  106. if (DBC_LOGGING((C))) {
  107. memset(&__op, 0, sizeof(__op));
  108. __op.data = O;
  109. __op.size = strlen(O) + 1;
  110. (void)__db_debug_log((C)->dbp->dbenv, T, &__lsn, 0,
  111.     &__op, (C)->dbp->log_filename->id, K, A, F);
  112. }
  113. }
  114. #ifdef DEBUG_ROP
  115. #define DEBUG_LREAD(C, T, O, K, A, F) LOG_OP(C, T, O, K, A, F)
  116. #else
  117. #define DEBUG_LREAD(C, T, O, K, A, F)
  118. #endif
  119. #ifdef DEBUG_WOP
  120. #define DEBUG_LWRITE(C, T, O, K, A, F) LOG_OP(C, T, O, K, A, F)
  121. #else
  122. #define DEBUG_LWRITE(C, T, O, K, A, F)
  123. #endif
  124. /*
  125.  * Hook for testing recovery at various places in the create/delete paths.
  126.  * Hook for testing subdb locks.
  127.  */
  128. #if CONFIG_TEST
  129. #define DB_TEST_SUBLOCKS(env, flags)
  130. do {
  131. if ((env)->test_abort == DB_TEST_SUBDB_LOCKS)
  132. (flags) |= DB_LOCK_NOWAIT;
  133. } while (0)
  134. #define DB_ENV_TEST_RECOVERY(env, val, ret, name)
  135. do {
  136. int __ret;
  137. PANIC_CHECK((env));
  138. if ((env)->test_copy == (val)) {
  139. /* COPY the FILE */
  140. if ((__ret = __db_testcopy((env), NULL, (name))) != 0)
  141. (ret) = __db_panic((env), __ret);
  142. }
  143. if ((env)->test_abort == (val)) {
  144. /* ABORT the TXN */
  145. (env)->test_abort = 0;
  146. (ret) = EINVAL;
  147. goto db_tr_err;
  148. }
  149. } while (0)
  150. #define DB_TEST_RECOVERY(dbp, val, ret, name)
  151. do {
  152. int __ret;
  153. PANIC_CHECK((dbp)->dbenv);
  154. if ((dbp)->dbenv->test_copy == (val)) {
  155. /* Copy the file. */
  156. if (F_ISSET((dbp),
  157.     DB_AM_OPEN_CALLED) && (dbp)->mpf != NULL)
  158. (void)(dbp)->sync((dbp), 0);
  159. if ((__ret =
  160.     __db_testcopy((dbp)->dbenv, (dbp), (name))) != 0)
  161. (ret) = __db_panic((dbp)->dbenv, __ret);
  162. }
  163. if ((dbp)->dbenv->test_abort == (val)) {
  164. /* Abort the transaction. */
  165. (dbp)->dbenv->test_abort = 0;
  166. (ret) = EINVAL;
  167. goto db_tr_err;
  168. }
  169. } while (0)
  170. #define DB_TEST_RECOVERY_LABEL db_tr_err:
  171. #else
  172. #define DB_TEST_SUBLOCKS(env, flags)
  173. #define DB_ENV_TEST_RECOVERY(env, val, ret, name)
  174. #define DB_TEST_RECOVERY(dbp, val, ret, name)
  175. #define DB_TEST_RECOVERY_LABEL
  176. #endif
  177. #if defined(__cplusplus)
  178. }
  179. #endif
  180. #endif /* !_DB_DEBUG_H_ */