summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/lib/replace/replace.h4
-rw-r--r--source4/lib/replace/system/wait.h4
-rw-r--r--source4/lib/tdb/common/io.c8
-rw-r--r--source4/lib/tdb/common/lock.c12
-rw-r--r--source4/lib/tdb/common/tdb_private.h2
-rw-r--r--source4/lib/tdb/include/tdb.h2
-rw-r--r--source4/lib/tdb/tools/tdbbackup.c1
-rw-r--r--source4/lib/tdb/tools/tdbdump.c1
-rw-r--r--source4/lib/tdb/tools/tdbtool.c55
9 files changed, 84 insertions, 5 deletions
diff --git a/source4/lib/replace/replace.h b/source4/lib/replace/replace.h
index e42d5ff168..55ed2e9570 100644
--- a/source4/lib/replace/replace.h
+++ b/source4/lib/replace/replace.h
@@ -452,6 +452,10 @@ typedef int bool;
#define MAX(a,b) ((a)>(b)?(a):(b))
#endif
+#if !defined(HAVE_VOLATILE)
+#define volatile
+#endif
+
/**
this is a warning hack. The idea is to use this everywhere that we
get the "discarding const" warning from gcc. That doesn't actually
diff --git a/source4/lib/replace/system/wait.h b/source4/lib/replace/system/wait.h
index de94cf09d5..5784b1ae92 100644
--- a/source4/lib/replace/system/wait.h
+++ b/source4/lib/replace/system/wait.h
@@ -48,4 +48,8 @@
#define SA_RESETHAND SA_ONESHOT
#endif
+#if !defined(HAVE_SIG_ATOMIC_T_TYPE)
+typedef int sig_atomic_t;
+#endif
+
#endif
diff --git a/source4/lib/tdb/common/io.c b/source4/lib/tdb/common/io.c
index 3b7e712cfe..c963e66ad4 100644
--- a/source4/lib/tdb/common/io.c
+++ b/source4/lib/tdb/common/io.c
@@ -94,7 +94,7 @@ static int tdb_write(struct tdb_context *tdb, tdb_off_t off,
/* try once more */
TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_write: wrote only "
"%d of %d bytes at %d, trying once more\n",
- written, len, off));
+ (int)written, len, off));
errno = ENOSPC;
written = pwrite(tdb->fd, (void *)((char *)buf+written),
len-written,
@@ -274,11 +274,13 @@ static int tdb_expand_file(struct tdb_context *tdb, tdb_off_t size, tdb_off_t ad
return -1;
} else if (written == -1) {
TDB_LOG((tdb, TDB_DEBUG_FATAL, "expand_file write of "
- "%d bytes failed (%s)\n", n, strerror(errno)));
+ "%d bytes failed (%s)\n", (int)n,
+ strerror(errno)));
return -1;
} else if (written != n) {
TDB_LOG((tdb, TDB_DEBUG_WARNING, "expand_file: wrote "
- "only %d of %d bytes - retrying\n", written,n));
+ "only %d of %d bytes - retrying\n", (int)written,
+ (int)n));
}
addition -= written;
size += written;
diff --git a/source4/lib/tdb/common/lock.c b/source4/lib/tdb/common/lock.c
index c0cb9c8766..e3fe888c46 100644
--- a/source4/lib/tdb/common/lock.c
+++ b/source4/lib/tdb/common/lock.c
@@ -29,6 +29,11 @@
#define TDB_MARK_LOCK 0x80000000
+void tdb_setalarm_sigptr(struct tdb_context *tdb, volatile sig_atomic_t *ptr)
+{
+ tdb->interrupt_sig_ptr = ptr;
+}
+
/* a byte range locking function - return 0 on success
this functions locks/unlocks 1 byte at the specified offset.
@@ -60,6 +65,13 @@ int tdb_brlock(struct tdb_context *tdb, tdb_off_t offset,
do {
ret = fcntl(tdb->fd,lck_type,&fl);
+
+ /* Check for a sigalarm break. */
+ if (ret == -1 && errno == EINTR &&
+ tdb->interrupt_sig_ptr &&
+ *tdb->interrupt_sig_ptr) {
+ break;
+ }
} while (ret == -1 && errno == EINTR);
if (ret == -1) {
diff --git a/source4/lib/tdb/common/tdb_private.h b/source4/lib/tdb/common/tdb_private.h
index 99fa4434c0..00bd0eb537 100644
--- a/source4/lib/tdb/common/tdb_private.h
+++ b/source4/lib/tdb/common/tdb_private.h
@@ -28,6 +28,7 @@
#include "system/time.h"
#include "system/shmem.h"
#include "system/select.h"
+#include "system/wait.h"
#include "tdb.h"
#ifndef HAVE_GETPAGESIZE
@@ -162,6 +163,7 @@ struct tdb_context {
int page_size;
int max_dead_records;
bool have_transaction_lock;
+ volatile sig_atomic_t *interrupt_sig_ptr;
};
diff --git a/source4/lib/tdb/include/tdb.h b/source4/lib/tdb/include/tdb.h
index f3a0dbe7bf..7de4c419a8 100644
--- a/source4/lib/tdb/include/tdb.h
+++ b/source4/lib/tdb/include/tdb.h
@@ -147,6 +147,8 @@ int tdb_chainunlock_read(struct tdb_context *tdb, TDB_DATA key);
int tdb_chainlock_mark(struct tdb_context *tdb, TDB_DATA key);
int tdb_chainlock_unmark(struct tdb_context *tdb, TDB_DATA key);
+void tdb_setalarm_sigptr(struct tdb_context *tdb, volatile sig_atomic_t *sigptr);
+
/* Debug functions. Not used in production. */
void tdb_dump_all(struct tdb_context *tdb);
int tdb_printfreelist(struct tdb_context *tdb);
diff --git a/source4/lib/tdb/tools/tdbbackup.c b/source4/lib/tdb/tools/tdbbackup.c
index dedfb9e665..6f3ca48314 100644
--- a/source4/lib/tdb/tools/tdbbackup.c
+++ b/source4/lib/tdb/tools/tdbbackup.c
@@ -44,6 +44,7 @@
#include "system/locale.h"
#include "system/time.h"
#include "system/filesys.h"
+#include "system/wait.h"
#include "tdb.h"
#ifdef HAVE_GETOPT_H
diff --git a/source4/lib/tdb/tools/tdbdump.c b/source4/lib/tdb/tools/tdbdump.c
index a654c0fb31..8d930383b0 100644
--- a/source4/lib/tdb/tools/tdbdump.c
+++ b/source4/lib/tdb/tools/tdbdump.c
@@ -21,6 +21,7 @@
#include "system/locale.h"
#include "system/time.h"
#include "system/filesys.h"
+#include "system/wait.h"
#include "tdb.h"
static void print_data(TDB_DATA d)
diff --git a/source4/lib/tdb/tools/tdbtool.c b/source4/lib/tdb/tools/tdbtool.c
index 580dd9d02a..79435a3571 100644
--- a/source4/lib/tdb/tools/tdbtool.c
+++ b/source4/lib/tdb/tools/tdbtool.c
@@ -24,6 +24,7 @@
#include "system/locale.h"
#include "system/time.h"
#include "system/filesys.h"
+#include "system/wait.h"
#include "tdb.h"
static int do_command(void);
@@ -34,6 +35,7 @@ int bIterate = 0;
char *line;
TDB_DATA iterate_kbuf;
char cmdline[1024];
+static int disable_mmap;
enum commands {
CMD_CREATE_TDB,
@@ -50,6 +52,8 @@ enum commands {
CMD_LIST_HASH_FREE,
CMD_LIST_FREE,
CMD_INFO,
+ CMD_MMAP,
+ CMD_SPEED,
CMD_FIRST,
CMD_NEXT,
CMD_SYSTEM,
@@ -77,6 +81,8 @@ COMMAND_TABLE cmd_table[] = {
{"list", CMD_LIST_HASH_FREE},
{"free", CMD_LIST_FREE},
{"info", CMD_INFO},
+ {"speed", CMD_SPEED},
+ {"mmap", CMD_MMAP},
{"first", CMD_FIRST},
{"1", CMD_FIRST},
{"next", CMD_NEXT},
@@ -87,6 +93,20 @@ COMMAND_TABLE cmd_table[] = {
{NULL, CMD_HELP}
};
+struct timeval tp1,tp2;
+
+static void _start_timer(void)
+{
+ gettimeofday(&tp1,NULL);
+}
+
+static double _end_timer(void)
+{
+ gettimeofday(&tp2,NULL);
+ return((tp2.tv_sec - tp1.tv_sec) +
+ (tp2.tv_usec - tp1.tv_usec)*1.0e-6);
+}
+
/* a tdb tool for manipulating a tdb database */
static TDB_CONTEXT *tdb;
@@ -175,7 +195,7 @@ static void terror(const char *why)
static void create_tdb(const char *tdbname)
{
if (tdb) tdb_close(tdb);
- tdb = tdb_open(tdbname, 0, TDB_CLEAR_IF_FIRST,
+ tdb = tdb_open(tdbname, 0, TDB_CLEAR_IF_FIRST | (disable_mmap?TDB_NOMMAP:0),
O_RDWR | O_CREAT | O_TRUNC, 0600);
if (!tdb) {
printf("Could not create %s: %s\n", tdbname, strerror(errno));
@@ -185,7 +205,7 @@ static void create_tdb(const char *tdbname)
static void open_tdb(const char *tdbname)
{
if (tdb) tdb_close(tdb);
- tdb = tdb_open(tdbname, 0, 0, O_RDWR, 0600);
+ tdb = tdb_open(tdbname, 0, disable_mmap?TDB_NOMMAP:0, O_RDWR, 0600);
if (!tdb) {
printf("Could not open %s: %s\n", tdbname, strerror(errno));
}
@@ -365,6 +385,31 @@ static void info_tdb(void)
printf("%d records totalling %d bytes\n", count, total_bytes);
}
+static void speed_tdb(const char *tlimit)
+{
+ unsigned timelimit = tlimit?atoi(tlimit):0;
+ double t;
+ int ops=0;
+ if (timelimit == 0) timelimit = 10;
+ printf("Testing traverse speed for %u seconds\n", timelimit);
+ _start_timer();
+ while ((t=_end_timer()) < timelimit) {
+ tdb_traverse(tdb, traverse_fn, NULL);
+ printf("%10.3f ops/sec\r", (++ops)/t);
+ }
+ printf("\n");
+}
+
+static void toggle_mmap(void)
+{
+ disable_mmap = !disable_mmap;
+ if (disable_mmap) {
+ printf("mmap is disabled\n");
+ } else {
+ printf("mmap is enabled\n");
+ }
+}
+
static char *tdb_getline(const char *prompt)
{
static char thisline[1024];
@@ -493,6 +538,12 @@ static int do_command(void)
case CMD_INFO:
info_tdb();
return 0;
+ case CMD_SPEED:
+ speed_tdb(arg1);
+ return 0;
+ case CMD_MMAP:
+ toggle_mmap();
+ return 0;
case CMD_FIRST:
bIterate = 1;
first_record(tdb, &iterate_kbuf);