db_deadlock.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996, 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char copyright[] =
  10.     "Copyright (c) 1996-2000nSleepycat Software Inc.  All rights reserved.n";
  11. static const char revid[] =
  12.     "$Id: db_deadlock.c,v 11.19 2001/01/18 18:36:57 bostic Exp $";
  13. #endif
  14. #ifndef NO_SYSTEM_INCLUDES
  15. #include <sys/types.h>
  16. #if TIME_WITH_SYS_TIME
  17. #include <sys/time.h>
  18. #include <time.h>
  19. #else
  20. #if HAVE_SYS_TIME_H
  21. #include <sys/time.h>
  22. #else
  23. #include <time.h>
  24. #endif
  25. #endif
  26. #include <limits.h>
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <unistd.h>
  30. #endif
  31. #include "db_int.h"
  32. #include "clib_ext.h"
  33. int  main __P((int, char *[]));
  34. void  usage __P((void));
  35. void  version_check __P((void));
  36. DB_ENV  *dbenv;
  37. const char
  38. *progname = "db_deadlock"; /* Program name. */
  39. int
  40. main(argc, argv)
  41. int argc;
  42. char *argv[];
  43. {
  44. extern char *optarg;
  45. extern int optind;
  46. u_int32_t atype;
  47. time_t now;
  48. long usecs;
  49. u_int32_t flags;
  50. int ch, e_close, exitval, ret, verbose;
  51. char *home, *logfile;
  52. version_check();
  53. atype = DB_LOCK_DEFAULT;
  54. home = logfile = NULL;
  55. usecs = 0;
  56. flags = 0;
  57. e_close = exitval = verbose = 0;
  58. while ((ch = getopt(argc, argv, "a:h:L:t:Vvw")) != EOF)
  59. switch (ch) {
  60. case 'a':
  61. switch (optarg[0]) {
  62. case 'o':
  63. atype = DB_LOCK_OLDEST;
  64. break;
  65. case 'y':
  66. atype = DB_LOCK_YOUNGEST;
  67. break;
  68. default:
  69. usage();
  70. /* NOTREACHED */
  71. }
  72. if (optarg[1] != '')
  73. usage();
  74. break;
  75. case 'h':
  76. home = optarg;
  77. break;
  78. case 'L':
  79. logfile = optarg;
  80. break;
  81. case 't':
  82. (void)__db_getlong(NULL,
  83.     progname, optarg, 1, LONG_MAX, &usecs);
  84. usecs *= 1000000;
  85. break;
  86. case 'V':
  87. printf("%sn", db_version(NULL, NULL, NULL));
  88. exit(0);
  89. case 'v':
  90. verbose = 1;
  91. break;
  92. case 'w':
  93. LF_SET(DB_LOCK_CONFLICT);
  94. break;
  95. case '?':
  96. default:
  97. usage();
  98. }
  99. argc -= optind;
  100. argv += optind;
  101. if (argc != 0)
  102. usage();
  103. if (usecs == 0 && !LF_ISSET(DB_LOCK_CONFLICT)) {
  104. fprintf(stderr,
  105.     "%s: at least one of -t and -w must be specifiedn",
  106.     progname);
  107. exit(1);
  108. }
  109. /*
  110.  * We detect every 100ms (100000 us) when we're running in
  111.  * DB_LOCK_CONFLICT mode.
  112.  */
  113. if (usecs == 0)
  114. usecs = 100000;
  115. /* Handle possible interruptions. */
  116. __db_util_siginit();
  117. /* Log our process ID. */
  118. if (logfile != NULL && __db_util_logset(progname, logfile))
  119. goto shutdown;
  120. /*
  121.  * Create an environment object and initialize it for error
  122.  * reporting.
  123.  */
  124. if ((ret = db_env_create(&dbenv, 0)) != 0) {
  125. fprintf(stderr,
  126.     "%s: db_env_create: %sn", progname, db_strerror(ret));
  127. goto shutdown;
  128. }
  129. e_close = 1;
  130. dbenv->set_errfile(dbenv, stderr);
  131. dbenv->set_errpfx(dbenv, progname);
  132. if (verbose) {
  133. (void)dbenv->set_verbose(dbenv, DB_VERB_DEADLOCK, 1);
  134. (void)dbenv->set_verbose(dbenv, DB_VERB_WAITSFOR, 1);
  135. }
  136. /* An environment is required. */
  137. if ((ret = dbenv->open(dbenv, home,
  138.     DB_JOINENV | DB_USE_ENVIRON, 0)) != 0) {
  139. dbenv->err(dbenv, ret, "open");
  140. goto shutdown;
  141. }
  142. while (!__db_util_interrupted()) {
  143. if (verbose) {
  144. (void)time(&now);
  145. dbenv->errx(dbenv, "running at %.24s", ctime(&now));
  146. }
  147. if ((ret = lock_detect(dbenv, flags, atype, NULL)) != 0) {
  148. dbenv->err(dbenv, ret, "lock_detect");
  149. goto shutdown;
  150. }
  151. /* Make a pass every "usecs" usecs. */
  152. (void)__os_sleep(dbenv, 0, usecs);
  153. }
  154. if (0) {
  155. shutdown: exitval = 1;
  156. }
  157. /* Clean up the logfile. */
  158. if (logfile != NULL)
  159. remove(logfile);
  160. /* Clean up the environment. */
  161. if (e_close && (ret = dbenv->close(dbenv, 0)) != 0) {
  162. exitval = 1;
  163. fprintf(stderr,
  164.     "%s: dbenv->close: %sn", progname, db_strerror(ret));
  165. }
  166. /* Resend any caught signal. */
  167. __db_util_sigresend();
  168. return (exitval);
  169. }
  170. void
  171. usage()
  172. {
  173. (void)fprintf(stderr,
  174.     "usage: db_deadlock [-Vvw] [-a o | y] [-h home] [-L file] [-t sec]n");
  175. exit(1);
  176. }
  177. void
  178. version_check()
  179. {
  180. int v_major, v_minor, v_patch;
  181. /* Make sure we're loaded with the right version of the DB library. */
  182. (void)db_version(&v_major, &v_minor, &v_patch);
  183. if (v_major != DB_VERSION_MAJOR ||
  184.     v_minor != DB_VERSION_MINOR || v_patch != DB_VERSION_PATCH) {
  185. fprintf(stderr,
  186. "%s: version %d.%d.%d doesn't match library version %d.%d.%dn",
  187.     progname, DB_VERSION_MAJOR, DB_VERSION_MINOR,
  188.     DB_VERSION_PATCH, v_major, v_minor, v_patch);
  189. exit (1);
  190. }
  191. }