aboutsummaryrefslogtreecommitdiff
path: root/tests/gtload.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-08-10 22:00:34 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2011-08-10 22:00:34 +0000
commit74f7fe561e31637bdbf21aeb817d4a22bbf9c91a (patch)
treebae9da9f2c749d290ad4f1764dc205bcd23b750e /tests/gtload.c
parent6b6dcc80555d77858733e44b72e92d1dc60e2c38 (diff)
downloadgdbm-74f7fe561e31637bdbf21aeb817d4a22bbf9c91a.tar.gz
gdbm-74f7fe561e31637bdbf21aeb817d4a22bbf9c91a.tar.bz2
Improve memory mapping support.
The new code is more flexible and performs better when lots of inserts are being made (e.g. when populating the database with new data). * src/gdbm.h.in (GDBM_SETMAXMAPSIZE): New constant. * src/gdbmconst.h (SIZE_T_MAX): New define. * src/gdbmdefs.h (gdbm_file_info) <cache_size>: Change type to size_t. <mmap_inited,mapped_size_max>: New member. <mapped_remap>: Remove. * src/gdbmopen.c: Fix a typo. (gdbm_open): Initialize new members. (_gdbm_init_cache): Second argument is size_t. * src/gdbmsetopt.c (gdbm_setopt): Optval argument is void*. Handle GDBM_SETMAXMAPSIZE. Improve error checking. * src/mmap.c (_GDBM_IN_MAPPED_REGION_P): Fix comparison with the lower bound. (_GDBM_NEED_REMAP): Return true if mapped_region is NULL. (SUM_FILE_SIZE): Rewrite. (_gdbm_mapped_unmap): Don't call msync. (_gdbm_internal_remap): Take 2 arguments, the second one giving the new mapped size. Unmap the region prior to remapping it. Always pass NULL as the argument to mmap. (_gdbm_mapped_remap): Rewrite the logic. Change semantics of the third argument. All uses updated. (_gdbm_mapped_init): Reflect the above changes. (_gdbm_mapped_read,_gdbm_mapped_write): Use mmap_inited to decide whether to use mmap, because mapped_region can be reset to zero by another functions (namely, _gdbm_mapped_lseek). Reset mmap_inited to FALSE, if _gdbm_mapped_remap fails. (_gdbm_mapped_lseek): Rewrite offset computations. Invalidate the mapped region. * src/proto.h (_gdbm_init_cache): Change prototype. * src/update.c (write_header, _gdbm_end_update): Remove checks for dbf->mapped_region. * tests/gtload.c: Implement the -maxmap option (set maximal mapped memory size). * doc/gdbm.texinfo: Document GDBM_SETMAXMAPSIZE.
Diffstat (limited to 'tests/gtload.c')
-rw-r--r--tests/gtload.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/tests/gtload.c b/tests/gtload.c
index 550833f..b89ae1f 100644
--- a/tests/gtload.c
+++ b/tests/gtload.c
@@ -18,6 +18,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <errno.h>
#include "gdbm.h"
#include "progname.h"
@@ -37,6 +38,7 @@ main (int argc, char **argv)
GDBM_FILE dbf;
int delim = '\t';
int data_z = 0;
+ size_t mapped_size_max = 0;
while (--argc)
{
@@ -44,7 +46,7 @@ main (int argc, char **argv)
if (strcmp (arg, "-h") == 0)
{
- printf ("usage: %s [-replace] [-clear] [-blocksize=N] [-null] [-nolock] [-nommap] [-sync] [-delim=CHR] DBFILE\n", progname);
+ printf ("usage: %s [-replace] [-clear] [-blocksize=N] [-null] [-nolock] [-nommap] [-maxmap=N] [-sync] [-delim=CHR] DBFILE\n", progname);
exit (0);
}
else if (strcmp (arg, "-replace") == 0)
@@ -61,6 +63,26 @@ main (int argc, char **argv)
flags |= GDBM_SYNC;
else if (strncmp (arg, "-blocksize=", 11) == 0)
block_size = atoi (arg + 11);
+ else if (strncmp (arg, "-maxmap=", 8) == 0)
+ {
+ char *p;
+
+ errno = 0;
+ mapped_size_max = strtoul (arg + 8, &p, 10);
+
+ if (errno)
+ {
+ fprintf (stderr, "%s: ", progname);
+ perror ("maxmap");
+ exit (1);
+ }
+
+ if (*p)
+ {
+ fprintf (stderr, "%s: bad maxmap\n", progname);
+ exit (1);
+ }
+ }
else if (strncmp (arg, "-delim=", 7) == 0)
delim = arg[7];
else if (strcmp (arg, "--") == 0)
@@ -92,6 +114,17 @@ main (int argc, char **argv)
exit (1);
}
+ if (mapped_size_max)
+ {
+ if (gdbm_setopt (dbf, GDBM_SETMAXMAPSIZE, &mapped_size_max,
+ sizeof (mapped_size_max)))
+ {
+ fprintf (stderr, "gdbm_setopt failed: %s\n",
+ gdbm_strerror (gdbm_errno));
+ exit (1);
+ }
+ }
+
while (fgets (buf, sizeof buf, stdin))
{
size_t i, j;

Return to:

Send suggestions and report system problems to the System administrator.