head 1.2; access; symbols RPM_4_2_1:1.1.1.5 RPM_4_2:1.1.1.5 RPM_4_1_1:1.1.1.5 RPM_4_1:1.1.1.4 RPM_4_0_5:1.1.1.3 RPM_4_0_4:1.1.1.2 RPM_4_0_3:1.1.1.1 RPM:1.1.1; locks; strict; comment @// @; 1.2 date 2008.01.02.09.56.56; author rse; state dead; branches; next 1.1; commitid z4cpSiAhOCXk5PLs; 1.1 date 2001.07.23.20.45.39; author rse; state Exp; branches 1.1.1.1; next ; 1.1.1.1 date 2001.07.23.20.45.39; author rse; state Exp; branches; next 1.1.1.2; 1.1.1.2 date 2002.01.08.00.47.42; author rse; state Exp; branches; next 1.1.1.3; 1.1.1.3 date 2003.01.18.13.49.05; author rse; state Exp; branches; next 1.1.1.4; 1.1.1.4 date 2001.12.06.00.07.33; author rse; state Exp; branches; next 1.1.1.5; 1.1.1.5 date 2003.01.18.14.05.01; author rse; state Exp; branches; next ; desc @@ 1.2 log @remove the ancient RPM 4.2.1 source tree copy @ text @/*- * See the file LICENSE for redistribution information. * * Copyright (c) 1997-2001 * Sleepycat Software. All rights reserved. * * $Id: LockExample.cpp,v 1.1 2001/07/23 20:45:39 rse Exp $ */ #include #include #include #include #include #include char *progname = "LockExample"; // Program name. // // An example of a program using DBLock and related classes. // class LockExample : public DbEnv { public: void run(); LockExample(const char *home, u_int32_t maxlocks, int do_unlink); private: static const char FileName[]; // no need for copy and assignment LockExample(const LockExample &); void operator = (const LockExample &); }; static void usage(); // forward int main(int argc, char *argv[]) { const char *home; int do_unlink; u_int32_t maxlocks; int i; home = "TESTDIR"; maxlocks = 0; do_unlink = 0; for (int argnum = 1; argnum < argc; ++argnum) { if (strcmp(argv[argnum], "-h") == 0) { if (++argnum >= argc) usage(); home = argv[argnum]; } else if (strcmp(argv[argnum], "-m") == 0) { if (++argnum >= argc) usage(); if ((i = atoi(argv[argnum])) <= 0) usage(); maxlocks = (u_int32_t)i; /* XXX: possible overflow. */ } else if (strcmp(argv[argnum], "-u") == 0) { do_unlink = 1; } else { usage(); } } try { if (do_unlink) { // Create an environment that immediately // removes all files. LockExample tmp(home, maxlocks, do_unlink); } LockExample app(home, maxlocks, do_unlink); app.run(); app.close(0); return EXIT_SUCCESS; } catch (DbException &dbe) { cerr << "LockExample: " << dbe.what() << "\n"; return EXIT_FAILURE; } } LockExample::LockExample(const char *home, u_int32_t maxlocks, int do_unlink) : DbEnv(0) { int ret; if (do_unlink) { if ((ret = remove(home, DB_FORCE)) != 0) { cerr << progname << ": DbEnv::remove: " << strerror(errno) << "\n"; exit(EXIT_FAILURE); } } else { set_error_stream(&cerr); set_errpfx("LockExample"); if (maxlocks != 0) set_lk_max_locks(maxlocks); open(home, DB_CREATE | DB_INIT_LOCK, 0); } } void LockExample::run() { long held; u_int32_t len, locker; int did_get, ret; DbLock *locks = 0; int lockcount = 0; char objbuf[1024]; int lockid = 0; // // Accept lock requests. // lock_id(&locker); for (held = 0;;) { cout << "Operation get/release [get]> "; cout.flush(); char opbuf[16]; cin.getline(opbuf, sizeof(opbuf)); if (cin.eof()) break; if ((len = strlen(opbuf)) <= 1 || strcmp(opbuf, "get") == 0) { // Acquire a lock. cout << "input object (text string) to lock> "; cout.flush(); cin.getline(objbuf, sizeof(objbuf)); if (cin.eof()) break; if ((len = strlen(objbuf)) <= 0) continue; char lockbuf[16]; do { cout << "lock type read/write [read]> "; cout.flush(); cin.getline(lockbuf, sizeof(lockbuf)); if (cin.eof()) break; len = strlen(lockbuf); } while (len >= 1 && strcmp(lockbuf, "read") != 0 && strcmp(lockbuf, "write") != 0); db_lockmode_t lock_type; if (len <= 1 || strcmp(lockbuf, "read") == 0) lock_type = DB_LOCK_READ; else lock_type = DB_LOCK_WRITE; Dbt dbt(objbuf, strlen(objbuf)); DbLock lock; ret = lock_get(locker, DB_LOCK_NOWAIT, &dbt, lock_type, &lock); did_get = 1; lockid = lockcount++; if (locks == NULL) { locks = new DbLock[1]; } else { DbLock *newlocks = new DbLock[lockcount]; for (int lockno = 0; lockno < lockid; lockno++) { newlocks[lockno] = locks[lockno]; } delete locks; locks = newlocks; } locks[lockid] = lock; } else { // Release a lock. do { cout << "input lock to release> "; cout.flush(); cin.getline(objbuf, sizeof(objbuf)); if (cin.eof()) break; } while ((len = strlen(objbuf)) <= 0); lockid = strtol(objbuf, NULL, 16); if (lockid < 0 || lockid >= lockcount) { cout << "Lock #" << lockid << " out of range\n"; continue; } DbLock lock = locks[lockid]; ret = lock.put(this); did_get = 0; } switch (ret) { case 0: cout << "Lock #" << lockid << " " << (did_get ? "granted" : "released") << "\n"; held += did_get ? 1 : -1; break; case DB_LOCK_NOTGRANTED: cout << "Lock not granted\n"; break; case DB_LOCK_DEADLOCK: cerr << "LockExample: lock_" << (did_get ? "get" : "put") << ": " << "returned DEADLOCK"; break; default: cerr << "LockExample: lock_get: %s", strerror(errno); } } cout << "\n"; cout << "Closing lock region " << held << " locks held\n"; if (locks != 0) delete locks; } static void usage() { cerr << "usage: LockExample [-u] [-h home] [-m maxlocks]\n"; exit(EXIT_FAILURE); } @ 1.1 log @Initial revision @ text @d7 1 a7 1 * $Id: LockExample.cpp,v 11.16 2001/05/10 17:14:07 bostic Exp $ @ 1.1.1.1 log @Import: RPM 4.0.3 @ text @@ 1.1.1.2 log @Import: RPM 4.0.4 @ text @d7 1 a7 1 * Id: LockExample.cpp,v 11.19 2001/11/10 04:59:07 mjc Exp d13 1 a13 1 #include a18 4 using std::cin; using std::cout; using std::cerr; a27 1 int error_code() { return (ecode); } a32 1 int ecode; d39 1 a39 1 static int usage(); // forward d55 1 a55 1 return (usage()); d60 1 a60 1 return (usage()); d62 1 a62 1 return (usage()); d69 1 a69 1 return (usage()); a73 2 int ecode; a77 2 if ((ecode = tmp.error_code()) != 0) return (ecode); a80 2 if ((ecode = app.error_code()) != 0) return (ecode); d83 1 a83 1 return (EXIT_SUCCESS); d87 1 a87 1 return (EXIT_FAILURE); a92 1 , ecode(0) d100 1 a100 1 ecode = EXIT_FAILURE; d226 1 a226 1 static int d230 1 a230 1 return (EXIT_FAILURE); @ 1.1.1.3 log @Import: RPM 4.0.5 @ text @d4 1 a4 1 * Copyright (c) 1997-2002 d7 1 a7 1 * Id: LockExample.cpp,v 11.22 2002/01/11 15:52:15 bostic Exp d23 1 a23 1 const char *progname = "LockExample"; // Program name. d209 1 a209 1 ret = lock_put(&lock); @ 1.1.1.4 log @Import: RPM 4.1 @ text @d4 1 a4 1 * Copyright (c) 1997-2001 d7 1 a7 1 * Id: LockExample.cpp,v 11.19 2001/11/10 04:59:07 mjc Exp d23 1 a23 1 char *progname = "LockExample"; // Program name. d209 1 a209 1 ret = lock.put(this); @ 1.1.1.5 log @Import: RPM 4.1.1 @ text @d4 1 a4 1 * Copyright (c) 1997-2002 d7 1 a7 1 * Id: LockExample.cpp,v 11.22 2002/01/11 15:52:15 bostic Exp d23 1 a23 1 const char *progname = "LockExample"; // Program name. d209 1 a209 1 ret = lock_put(&lock); @