diff options
-rw-r--r-- | source4/lib/replace/replace.h | 4 | ||||
-rw-r--r-- | source4/lib/replace/system/wait.h | 4 | ||||
-rw-r--r-- | source4/lib/tdb/common/io.c | 8 | ||||
-rw-r--r-- | source4/lib/tdb/common/lock.c | 12 | ||||
-rw-r--r-- | source4/lib/tdb/common/tdb_private.h | 2 | ||||
-rw-r--r-- | source4/lib/tdb/include/tdb.h | 2 | ||||
-rw-r--r-- | source4/lib/tdb/tools/tdbbackup.c | 1 | ||||
-rw-r--r-- | source4/lib/tdb/tools/tdbdump.c | 1 | ||||
-rw-r--r-- | source4/lib/tdb/tools/tdbtool.c | 55 |
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); |