2
* See the file LICENSE for redistribution information.
4
* Copyright (c) 1997-2002
5
* Sleepycat Software. All rights reserved.
10
#include <sys/types.h>
16
extern int getopt(int, char * const *, const char *);
23
int db_init __P((const char *, u_int32_t, int));
24
int main __P((int, char *[]));
25
int usage __P((void));
29
*progname = "ex_lock"; /* Program name. */
41
db_lockmode_t lock_type;
43
u_int32_t len, locker, maxlocks;
44
int ch, do_unlink, did_get, i, lockid, lockcount, ret;
46
char opbuf[16], objbuf[1024], lockbuf[16];
51
while ((ch = getopt(argc, argv, "h:m:u")) != EOF)
57
if ((i = atoi(optarg)) <= 0)
59
maxlocks = (u_int32_t)i; /* XXX: possible overflow. */
74
/* Initialize the database environment. */
75
if ((ret = db_init(home, maxlocks, do_unlink)) != 0)
82
* Accept lock requests.
84
if ((ret = dbenv->lock_id(dbenv, &locker)) != 0) {
85
dbenv->err(dbenv, ret, "unable to get locker id");
86
(void)dbenv->close(dbenv, 0);
87
return (EXIT_FAILURE);
91
memset(&lock_dbt, 0, sizeof(lock_dbt));
92
for (held = 0, did_get = 0;;) {
93
printf("Operation get/release [get]> ");
95
if (fgets(opbuf, sizeof(opbuf), stdin) == NULL)
97
if ((len = strlen(opbuf)) <= 1 || strcmp(opbuf, "get\n") == 0) {
99
printf("input object (text string) to lock> ");
101
if (fgets(objbuf, sizeof(objbuf), stdin) == NULL)
103
if ((len = strlen(objbuf)) <= 1)
107
printf("lock type read/write [read]> ");
110
sizeof(lockbuf), stdin) == NULL)
112
len = strlen(lockbuf);
114
strcmp(lockbuf, "read\n") != 0 &&
115
strcmp(lockbuf, "write\n") != 0);
116
if (len == 1 || strcmp(lockbuf, "read\n") == 0)
117
lock_type = DB_LOCK_READ;
119
lock_type = DB_LOCK_WRITE;
121
lock_dbt.data = objbuf;
122
lock_dbt.size = strlen(objbuf);
123
ret = dbenv->lock_get(dbenv, locker,
124
DB_LOCK_NOWAIT, &lock_dbt, lock_type, &lock);
127
lockid = lockcount++;
130
(DB_LOCK *)malloc(sizeof(DB_LOCK));
132
locks = (DB_LOCK *)realloc(locks,
133
lockcount * sizeof(DB_LOCK));
134
locks[lockid] = lock;
137
/* Release a lock. */
139
printf("input lock to release> ");
142
sizeof(objbuf), stdin) == NULL)
144
} while ((len = strlen(objbuf)) <= 1);
145
lockid = strtol(objbuf, NULL, 16);
146
if (lockid < 0 || lockid >= lockcount) {
147
printf("Lock #%d out of range\n", lockid);
150
lock = locks[lockid];
151
ret = dbenv->lock_put(dbenv, &lock);
156
printf("Lock #%d %s\n", lockid,
157
did_get ? "granted" : "released");
158
held += did_get ? 1 : -1;
160
case DB_LOCK_NOTGRANTED:
161
dbenv->err(dbenv, ret, NULL);
163
case DB_LOCK_DEADLOCK:
164
dbenv->err(dbenv, ret,
165
"lock_%s", did_get ? "get" : "put");
168
dbenv->err(dbenv, ret,
169
"lock_%s", did_get ? "get" : "put");
170
(void)dbenv->close(dbenv, 0);
171
return (EXIT_FAILURE);
175
printf("\nClosing lock region %ld locks held\n", held);
180
if ((ret = dbenv->close(dbenv, 0)) != 0) {
182
"%s: dbenv->close: %s\n", progname, db_strerror(ret));
183
return (EXIT_FAILURE);
185
return (EXIT_SUCCESS);
190
* Initialize the environment.
193
db_init(home, maxlocks, do_unlink)
200
if ((ret = db_env_create(&dbenv, 0)) != 0) {
201
fprintf(stderr, "%s: db_env_create: %s\n",
202
progname, db_strerror(ret));
203
return (EXIT_FAILURE);
207
if ((ret = dbenv->remove(dbenv, home, DB_FORCE)) != 0) {
208
fprintf(stderr, "%s: dbenv->remove: %s\n",
209
progname, db_strerror(ret));
210
return (EXIT_FAILURE);
212
if ((ret = db_env_create(&dbenv, 0)) != 0) {
213
fprintf(stderr, "%s: db_env_create: %s\n",
214
progname, db_strerror(ret));
215
return (EXIT_FAILURE);
219
dbenv->set_errfile(dbenv, stderr);
220
dbenv->set_errpfx(dbenv, progname);
222
dbenv->set_lk_max_locks(dbenv, maxlocks);
225
dbenv->open(dbenv, home, DB_CREATE | DB_INIT_LOCK, 0)) != 0) {
226
dbenv->err(dbenv, ret, NULL);
227
(void)dbenv->close(dbenv, 0);
228
return (EXIT_FAILURE);
236
(void)fprintf(stderr,
237
"usage: %s [-u] [-h home] [-m maxlocks]\n", progname);
238
return (EXIT_FAILURE);