2
* See the file LICENSE for redistribution information.
4
* Copyright (c) 1996-2002
5
* Sleepycat Software. All rights reserved.
11
static const char copyright[] =
12
"Copyright (c) 1996-2002\nSleepycat Software Inc. All rights reserved.\n";
13
static const char revid[] =
17
#ifndef NO_SYSTEM_INCLUDES
18
#include <sys/types.h>
20
#if TIME_WITH_SYS_TIME
40
int db_deadlock_main __P((int, char *[]));
41
int db_deadlock_usage __P((void));
42
int db_deadlock_version_check __P((const char *));
51
__db_util_arg("db_deadlock", args, &argc, &argv);
52
return (db_deadlock_main(argc, argv) ? EXIT_FAILURE : EXIT_SUCCESS);
56
#define ERROR_RETURN ERROR
59
db_deadlock_main(argc, argv)
64
extern int optind, __db_getopt_reset;
65
const char *progname = "db_deadlock";
70
int ch, e_close, exitval, ret, verbose;
71
char *home, *logfile, *str;
73
if ((ret = db_deadlock_version_check(progname)) != 0)
76
atype = DB_LOCK_DEFAULT;
77
home = logfile = NULL;
79
e_close = exitval = verbose = 0;
80
__db_getopt_reset = 1;
81
while ((ch = getopt(argc, argv, "a:h:L:t:Vvw")) != EOF)
86
atype = DB_LOCK_EXPIRE;
89
atype = DB_LOCK_MAXLOCKS;
92
atype = DB_LOCK_MINLOCKS;
95
atype = DB_LOCK_OLDEST;
98
atype = DB_LOCK_MINWRITE;
101
atype = DB_LOCK_YOUNGEST;
104
return (db_deadlock_usage());
107
if (optarg[1] != '\0')
108
return (db_deadlock_usage());
117
if ((str = strchr(optarg, '.')) != NULL) {
119
if (*str != '\0' && __db_getlong(
120
NULL, progname, str, 0, LONG_MAX, &usecs))
121
return (EXIT_FAILURE);
123
if (*optarg != '\0' && __db_getlong(
124
NULL, progname, optarg, 0, LONG_MAX, &secs))
125
return (EXIT_FAILURE);
126
if (secs == 0 && usecs == 0)
127
return (db_deadlock_usage());
132
printf("%s\n", db_version(NULL, NULL, NULL));
133
return (EXIT_SUCCESS);
137
case 'w': /* Undocumented. */
138
/* Detect every 100ms (100000 us) when polling. */
144
return (db_deadlock_usage());
150
return (db_deadlock_usage());
152
/* Handle possible interruptions. */
155
/* Log our process ID. */
156
if (logfile != NULL && __db_util_logset(progname, logfile))
160
* Create an environment object and initialize it for error
163
if ((ret = db_env_create(&dbenv, 0)) != 0) {
165
"%s: db_env_create: %s\n", progname, db_strerror(ret));
170
dbenv->set_errfile(dbenv, stderr);
171
dbenv->set_errpfx(dbenv, progname);
174
(void)dbenv->set_verbose(dbenv, DB_VERB_DEADLOCK, 1);
175
(void)dbenv->set_verbose(dbenv, DB_VERB_WAITSFOR, 1);
178
/* An environment is required. */
179
if ((ret = dbenv->open(dbenv, home,
180
DB_JOINENV | DB_USE_ENVIRON, 0)) != 0) {
181
dbenv->err(dbenv, ret, "open");
185
while (!__db_util_interrupted()) {
188
dbenv->errx(dbenv, "running at %.24s", ctime(&now));
191
if ((ret = dbenv->lock_detect(dbenv, 0, atype, NULL)) != 0) {
192
dbenv->err(dbenv, ret, "DB_ENV->lock_detect");
196
/* Make a pass every "secs" secs and "usecs" usecs. */
197
if (secs == 0 && usecs == 0)
199
(void)__os_sleep(dbenv, secs, usecs);
203
shutdown: exitval = 1;
206
/* Clean up the logfile. */
210
/* Clean up the environment. */
211
if (e_close && (ret = dbenv->close(dbenv, 0)) != 0) {
214
"%s: dbenv->close: %s\n", progname, db_strerror(ret));
217
/* Resend any caught signal. */
218
__db_util_sigresend();
220
return (exitval == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
226
(void)fprintf(stderr, "%s\n\t%s\n",
227
"usage: db_deadlock [-Vv]",
228
"[-a e | m | n | o | w | y] [-h home] [-L file] [-t sec.usec]");
229
return (EXIT_FAILURE);
233
db_deadlock_version_check(progname)
234
const char *progname;
236
int v_major, v_minor, v_patch;
238
/* Make sure we're loaded with the right version of the DB library. */
239
(void)db_version(&v_major, &v_minor, &v_patch);
240
if (v_major != DB_VERSION_MAJOR ||
241
v_minor != DB_VERSION_MINOR || v_patch != DB_VERSION_PATCH) {
243
"%s: version %d.%d.%d doesn't match library version %d.%d.%d\n",
244
progname, DB_VERSION_MAJOR, DB_VERSION_MINOR,
245
DB_VERSION_PATCH, v_major, v_minor, v_patch);
246
return (EXIT_FAILURE);