mirror of
https://github.com/samba-team/samba.git
synced 2025-03-09 08:58:35 +03:00
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)
This commit is contained in:
parent
2458c8de64
commit
0c2f84dfd0
@ -186,7 +186,7 @@ static int tdb_brlock(TDB_CONTEXT *tdb, tdb_off offset,
|
|||||||
|
|
||||||
if (tdb->flags & TDB_NOLOCK)
|
if (tdb->flags & TDB_NOLOCK)
|
||||||
return 0;
|
return 0;
|
||||||
if (tdb->read_only) {
|
if ((rw_type == F_WRLCK) && (tdb->read_only)) {
|
||||||
errno = EACCES;
|
errno = EACCES;
|
||||||
return -1;
|
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);
|
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 */
|
/* register a loging function */
|
||||||
void tdb_logging_function(TDB_CONTEXT *tdb, void (*fn)(TDB_CONTEXT *, int , const char *, ...))
|
void tdb_logging_function(TDB_CONTEXT *tdb, void (*fn)(TDB_CONTEXT *, int , const char *, ...))
|
||||||
|
@ -39,7 +39,7 @@ static void gotalarm_sig(void)
|
|||||||
Lock a chain with timeout (in seconds).
|
Lock a chain with timeout (in seconds).
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int tdb_chainlock_with_timeout( TDB_CONTEXT *tdb, TDB_DATA key, unsigned int timeout)
|
static int tdb_chainlock_with_timeout( TDB_CONTEXT *tdb, TDB_DATA key, unsigned int timeout, int rw_type)
|
||||||
{
|
{
|
||||||
/* Allow tdb_chainlock to be interrupted by an alarm. */
|
/* Allow tdb_chainlock to be interrupted by an alarm. */
|
||||||
int ret;
|
int ret;
|
||||||
@ -51,13 +51,19 @@ int tdb_chainlock_with_timeout( TDB_CONTEXT *tdb, TDB_DATA key, unsigned int tim
|
|||||||
alarm(timeout);
|
alarm(timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = tdb_chainlock(tdb, key);
|
if (rw_type == F_RDLCK)
|
||||||
|
ret = tdb_chainlock_read(tdb, key);
|
||||||
|
else
|
||||||
|
ret = tdb_chainlock(tdb, key);
|
||||||
|
|
||||||
if (timeout) {
|
if (timeout) {
|
||||||
alarm(0);
|
alarm(0);
|
||||||
CatchSignal(SIGALRM, SIGNAL_CAST SIG_IGN);
|
CatchSignal(SIGALRM, SIGNAL_CAST SIG_IGN);
|
||||||
if (gotalarm)
|
if (gotalarm) {
|
||||||
|
DEBUG(0,("tdb_chainlock_with_timeout: alarm (%u) timed out for key %s in tdb %s\n",
|
||||||
|
timeout, key.dptr, tdb->name ));
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -74,7 +80,7 @@ int tdb_lock_bystring(TDB_CONTEXT *tdb, char *keyval, unsigned int timeout)
|
|||||||
key.dptr = keyval;
|
key.dptr = keyval;
|
||||||
key.dsize = strlen(keyval)+1;
|
key.dsize = strlen(keyval)+1;
|
||||||
|
|
||||||
return tdb_chainlock_with_timeout(tdb, key, timeout);
|
return tdb_chainlock_with_timeout(tdb, key, timeout, F_WRLCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -91,6 +97,35 @@ void tdb_unlock_bystring(TDB_CONTEXT *tdb, char *keyval)
|
|||||||
tdb_chainunlock(tdb, key);
|
tdb_chainunlock(tdb, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
Read lock a chain by string. Return -1 if timeout or lock failed.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int tdb_read_lock_bystring(TDB_CONTEXT *tdb, char *keyval, unsigned int timeout)
|
||||||
|
{
|
||||||
|
TDB_DATA key;
|
||||||
|
|
||||||
|
key.dptr = keyval;
|
||||||
|
key.dsize = strlen(keyval)+1;
|
||||||
|
|
||||||
|
return tdb_chainlock_with_timeout(tdb, key, timeout, F_RDLCK);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
Read unlock a chain by string.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void tdb_read_unlock_bystring(TDB_CONTEXT *tdb, char *keyval)
|
||||||
|
{
|
||||||
|
TDB_DATA key;
|
||||||
|
|
||||||
|
key.dptr = keyval;
|
||||||
|
key.dsize = strlen(keyval)+1;
|
||||||
|
|
||||||
|
tdb_chainunlock_read(tdb, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
Fetch a int32 value by a arbitrary blob key, return -1 if not found.
|
Fetch a int32 value by a arbitrary blob key, return -1 if not found.
|
||||||
Output is int32 in native byte order.
|
Output is int32 in native byte order.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user