mirror of
https://github.com/samba-team/samba.git
synced 2025-08-04 08:22:08 +03:00
util_tdb: move timeout chainlock variants from source3/lib/util/util_tdb.c
We're about to use them for dbwrap. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
@ -21,6 +21,7 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "system/filesys.h"
|
||||
#include "../lib/tdb/include/tdb.h"
|
||||
#include "../lib/util/util_tdb.h"
|
||||
|
||||
@ -301,6 +302,84 @@ int32_t tdb_change_int32_atomic(struct tdb_context *tdb, const char *keystr, int
|
||||
return ret;
|
||||
}
|
||||
|
||||
static sig_atomic_t gotalarm;
|
||||
|
||||
/***************************************************************
|
||||
Signal function to tell us we timed out.
|
||||
****************************************************************/
|
||||
|
||||
static void gotalarm_sig(int signum)
|
||||
{
|
||||
gotalarm = 1;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Lock a chain with timeout (in seconds).
|
||||
****************************************************************************/
|
||||
|
||||
static int tdb_chainlock_with_timeout_internal( TDB_CONTEXT *tdb, TDB_DATA key, unsigned int timeout, int rw_type)
|
||||
{
|
||||
/* Allow tdb_chainlock to be interrupted by an alarm. */
|
||||
int ret;
|
||||
gotalarm = 0;
|
||||
|
||||
if (timeout) {
|
||||
CatchSignal(SIGALRM, gotalarm_sig);
|
||||
tdb_setalarm_sigptr(tdb, &gotalarm);
|
||||
alarm(timeout);
|
||||
}
|
||||
|
||||
if (rw_type == F_RDLCK)
|
||||
ret = tdb_chainlock_read(tdb, key);
|
||||
else
|
||||
ret = tdb_chainlock(tdb, key);
|
||||
|
||||
if (timeout) {
|
||||
alarm(0);
|
||||
tdb_setalarm_sigptr(tdb, NULL);
|
||||
CatchSignal(SIGALRM, SIG_IGN);
|
||||
if (gotalarm && (ret != 0)) {
|
||||
DEBUG(0,("tdb_chainlock_with_timeout_internal: alarm (%u) timed out for key %s in tdb %s\n",
|
||||
timeout, key.dptr, tdb_name(tdb)));
|
||||
/* TODO: If we time out waiting for a lock, it might
|
||||
* be nice to use F_GETLK to get the pid of the
|
||||
* process currently holding the lock and print that
|
||||
* as part of the debugging message. -- mbp */
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return ret == 0 ? 0 : -1;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Write lock a chain. Return non-zero if timeout or lock failed.
|
||||
****************************************************************************/
|
||||
|
||||
int tdb_chainlock_with_timeout( TDB_CONTEXT *tdb, TDB_DATA key, unsigned int timeout)
|
||||
{
|
||||
return tdb_chainlock_with_timeout_internal(tdb, key, timeout, F_WRLCK);
|
||||
}
|
||||
|
||||
int tdb_lock_bystring_with_timeout(TDB_CONTEXT *tdb, const char *keyval,
|
||||
int timeout)
|
||||
{
|
||||
TDB_DATA key = string_term_tdb_data(keyval);
|
||||
|
||||
return tdb_chainlock_with_timeout(tdb, key, timeout);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Read lock a chain by string. Return non-zero if timeout or lock failed.
|
||||
****************************************************************************/
|
||||
|
||||
int tdb_read_lock_bystring_with_timeout(TDB_CONTEXT *tdb, const char *keyval, unsigned int timeout)
|
||||
{
|
||||
TDB_DATA key = string_term_tdb_data(keyval);
|
||||
|
||||
return tdb_chainlock_with_timeout_internal(tdb, key, timeout, F_RDLCK);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Atomic unsigned integer change. Returns old value. To create, set initial value in *oldval.
|
||||
****************************************************************************/
|
||||
|
@ -51,6 +51,24 @@ int tdb_read_lock_bystring(struct tdb_context *tdb, const char *keyval);
|
||||
****************************************************************************/
|
||||
void tdb_read_unlock_bystring(struct tdb_context *tdb, const char *keyval);
|
||||
|
||||
/****************************************************************************
|
||||
Lock a chain, with timeout.
|
||||
****************************************************************************/
|
||||
int tdb_chainlock_with_timeout( struct tdb_context *tdb, TDB_DATA key,
|
||||
unsigned int timeout);
|
||||
|
||||
/****************************************************************************
|
||||
Lock a chain by string, with timeout Return non-zero if lock failed.
|
||||
****************************************************************************/
|
||||
int tdb_lock_bystring_with_timeout(struct tdb_context *tdb, const char *keyval,
|
||||
int timeout);
|
||||
|
||||
/****************************************************************************
|
||||
Readlock a chain by string, with timeout Return non-zero if lock failed.
|
||||
****************************************************************************/
|
||||
int tdb_read_lock_bystring_with_timeout(TDB_CONTEXT *tdb, const char *keyval,
|
||||
unsigned int timeout);
|
||||
|
||||
/****************************************************************************
|
||||
Fetch a int32_t value by a arbitrary blob key, return -1 if not found.
|
||||
Output is int32_t in native byte order.
|
||||
|
@ -41,7 +41,7 @@ bld.SAMBA_SUBSYSTEM('UNIX_PRIVS',
|
||||
bld.SAMBA_LIBRARY('util_tdb',
|
||||
source='util_tdb.c',
|
||||
local_include=False,
|
||||
public_deps='tdb talloc',
|
||||
public_deps='tdb talloc samba-util',
|
||||
private_library=True
|
||||
)
|
||||
|
||||
|
@ -1567,7 +1567,30 @@ NTLM_AUTH_OBJ = ${NTLM_AUTH_OBJ1} \
|
||||
|
||||
|
||||
VLP_OBJ = printing/tests/vlp.o \
|
||||
../lib/util/util_tdb.o \
|
||||
../lib/util/util_tdb.o \
|
||||
../lib/util/signal.o \
|
||||
../lib/util/debug.o \
|
||||
../lib/util/util_strlist.o \
|
||||
../lib/util/fault.o \
|
||||
../lib/util/become_daemon.o \
|
||||
../lib/util/substitute.o \
|
||||
lib/util_sec.o \
|
||||
../lib/util/time.o \
|
||||
../lib/util/charset/util_str.o \
|
||||
../lib/util/charset/pull_push.o \
|
||||
../lib/util/charset/util_unistr_w.o \
|
||||
../lib/util/charset/codepoints.o \
|
||||
../lib/util/charset/iconv.o \
|
||||
../lib/util/charset/weird.o \
|
||||
../lib/util/charset/convert_string.o \
|
||||
../lib/util/talloc_stack.o \
|
||||
../lib/util/smb_threads.o \
|
||||
../lib/util/xfile.o \
|
||||
../lib/util/util_file.o \
|
||||
../lib/util/util.o \
|
||||
../lib/util/util_str_common.o \
|
||||
../lib/util/data_blob.o \
|
||||
../dynconfig/dynconfig.o \
|
||||
$(LIBSAMBAUTIL_OBJ) \
|
||||
param/util.o
|
||||
|
||||
|
@ -26,13 +26,6 @@
|
||||
#include "../libcli/util/ntstatus.h" /* for map_nt_error_from_tdb() */
|
||||
#include "../../lib/util/util_tdb.h"
|
||||
|
||||
int tdb_chainlock_with_timeout( struct tdb_context *tdb, TDB_DATA key,
|
||||
unsigned int timeout);
|
||||
int tdb_lock_bystring_with_timeout(struct tdb_context *tdb, const char *keyval,
|
||||
int timeout);
|
||||
int tdb_read_lock_bystring_with_timeout(TDB_CONTEXT *tdb, const char *keyval,
|
||||
unsigned int timeout);
|
||||
|
||||
int tdb_trans_store_bystring(TDB_CONTEXT *tdb, const char *keystr,
|
||||
TDB_DATA data, int flags);
|
||||
int tdb_trans_store(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf,
|
||||
|
@ -31,87 +31,6 @@
|
||||
/* these are little tdb utility functions that are meant to make
|
||||
dealing with a tdb database a little less cumbersome in Samba */
|
||||
|
||||
static SIG_ATOMIC_T gotalarm;
|
||||
|
||||
/***************************************************************
|
||||
Signal function to tell us we timed out.
|
||||
****************************************************************/
|
||||
|
||||
static void gotalarm_sig(int signum)
|
||||
{
|
||||
gotalarm = 1;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Lock a chain with timeout (in seconds).
|
||||
****************************************************************************/
|
||||
|
||||
static int tdb_chainlock_with_timeout_internal( TDB_CONTEXT *tdb, TDB_DATA key, unsigned int timeout, int rw_type)
|
||||
{
|
||||
/* Allow tdb_chainlock to be interrupted by an alarm. */
|
||||
int ret;
|
||||
gotalarm = 0;
|
||||
|
||||
if (timeout) {
|
||||
CatchSignal(SIGALRM, gotalarm_sig);
|
||||
tdb_setalarm_sigptr(tdb, &gotalarm);
|
||||
alarm(timeout);
|
||||
}
|
||||
|
||||
if (rw_type == F_RDLCK)
|
||||
ret = tdb_chainlock_read(tdb, key);
|
||||
else
|
||||
ret = tdb_chainlock(tdb, key);
|
||||
|
||||
if (timeout) {
|
||||
alarm(0);
|
||||
tdb_setalarm_sigptr(tdb, NULL);
|
||||
CatchSignal(SIGALRM, SIG_IGN);
|
||||
if (gotalarm && (ret != 0)) {
|
||||
DEBUG(0,("tdb_chainlock_with_timeout_internal: alarm (%u) timed out for key %s in tdb %s\n",
|
||||
timeout, key.dptr, tdb_name(tdb)));
|
||||
/* TODO: If we time out waiting for a lock, it might
|
||||
* be nice to use F_GETLK to get the pid of the
|
||||
* process currently holding the lock and print that
|
||||
* as part of the debugging message. -- mbp */
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return ret == 0 ? 0 : -1;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Write lock a chain. Return non-zero if timeout or lock failed.
|
||||
****************************************************************************/
|
||||
|
||||
int tdb_chainlock_with_timeout( TDB_CONTEXT *tdb, TDB_DATA key, unsigned int timeout)
|
||||
{
|
||||
return tdb_chainlock_with_timeout_internal(tdb, key, timeout, F_WRLCK);
|
||||
}
|
||||
|
||||
int tdb_lock_bystring_with_timeout(TDB_CONTEXT *tdb, const char *keyval,
|
||||
int timeout)
|
||||
{
|
||||
TDB_DATA key = string_term_tdb_data(keyval);
|
||||
|
||||
return tdb_chainlock_with_timeout(tdb, key, timeout);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Read lock a chain by string. Return non-zero if timeout or lock failed.
|
||||
****************************************************************************/
|
||||
|
||||
int tdb_read_lock_bystring_with_timeout(TDB_CONTEXT *tdb, const char *keyval, unsigned int timeout)
|
||||
{
|
||||
TDB_DATA key = string_term_tdb_data(keyval);
|
||||
|
||||
return tdb_chainlock_with_timeout_internal(tdb, key, timeout, F_RDLCK);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int tdb_trans_store_bystring(TDB_CONTEXT *tdb, const char *keystr,
|
||||
TDB_DATA data, int flags)
|
||||
{
|
||||
|
Reference in New Issue
Block a user