summaryrefslogtreecommitdiff
path: root/source3/tdb/tdb.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2002-11-09 03:36:47 +0000
committerJeremy Allison <jra@samba.org>2002-11-09 03:36:47 +0000
commit0c2f84dfd00d6f6141726150ec816d8804c70e88 (patch)
treee3884b932b649e4077c639566daf4e86c28a3c4c /source3/tdb/tdb.c
parent2458c8de648aa5b8f0785f521c2ec476e6707a93 (diff)
downloadsamba-0c2f84dfd00d6f6141726150ec816d8804c70e88.tar.gz
samba-0c2f84dfd00d6f6141726150ec816d8804c70e88.tar.bz2
samba-0c2f84dfd00d6f6141726150ec816d8804c70e88.zip
Add chainlock_read functions to get a read lock. Used in *massively*
contended tdb's (and I've got one :-). Jeremy. (This used to be commit d4b795e6a451d9abaa4a928cf5d34e12b2babc2d)
Diffstat (limited to 'source3/tdb/tdb.c')
-rw-r--r--source3/tdb/tdb.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/source3/tdb/tdb.c b/source3/tdb/tdb.c
index 2a6dca16a8..e539376ac7 100644
--- a/source3/tdb/tdb.c
+++ b/source3/tdb/tdb.c
@@ -186,7 +186,7 @@ static int tdb_brlock(TDB_CONTEXT *tdb, tdb_off offset,
if (tdb->flags & TDB_NOLOCK)
return 0;
- if (tdb->read_only) {
+ if ((rw_type == F_WRLCK) && (tdb->read_only)) {
errno = EACCES;
return -1;
}
@@ -1802,6 +1802,16 @@ int tdb_chainunlock(TDB_CONTEXT *tdb, TDB_DATA key)
return tdb_unlock(tdb, BUCKET(tdb_hash(&key)), F_WRLCK);
}
+int tdb_chainlock_read(TDB_CONTEXT *tdb, TDB_DATA key)
+{
+ return tdb_lock(tdb, BUCKET(tdb_hash(&key)), F_RDLCK);
+}
+
+int tdb_chainunlock_read(TDB_CONTEXT *tdb, TDB_DATA key)
+{
+ return tdb_unlock(tdb, BUCKET(tdb_hash(&key)), F_RDLCK);
+}
+
/* register a loging function */
void tdb_logging_function(TDB_CONTEXT *tdb, void (*fn)(TDB_CONTEXT *, int , const char *, ...))