aboutsummaryrefslogtreecommitdiff
path: root/src/gdbmdefs.h
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 /src/gdbmdefs.h
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 'src/gdbmdefs.h')
-rw-r--r--src/gdbmdefs.h12
1 files changed, 4 insertions, 8 deletions
diff --git a/src/gdbmdefs.h b/src/gdbmdefs.h
index 819abbc..2221aa5 100644
--- a/src/gdbmdefs.h
+++ b/src/gdbmdefs.h
@@ -124,8 +124,6 @@ typedef struct {
data_cache_elem ca_data;
} cache_elem;
-
-
/* This final structure contains all main memory based information for
a gdbm file. This allows multiple gdbm files to be opened at the same
time by one program. */
@@ -153,7 +151,8 @@ struct gdbm_file_info {
/* Whether or not we're allowing mmap() use. */
unsigned allow_mmap :1;
-
+ unsigned mmap_inited :1;
+
/* Type of file locking in use. */
enum { LOCKING_NONE = 0, LOCKING_FLOCK, LOCKING_LOCKF,
LOCKING_FCNTL } lock_type;
@@ -173,7 +172,7 @@ struct gdbm_file_info {
/* The bucket cache. */
cache_elem *bucket_cache;
- int cache_size;
+ size_t cache_size;
int last_read;
/* Points to the current hash bucket in the cache. */
@@ -193,15 +192,12 @@ struct gdbm_file_info {
unsigned second_changed :1;
/* Mmap info */
+ size_t mapped_size_max;/* Max. allowed value for mapped_size */
void *mapped_region; /* Mapped region */
size_t mapped_size; /* Size of the region */
off_t mapped_pos; /* Current offset in the region */
off_t mapped_off; /* Position in the file where the region
begins */
- int mapped_remap; /* When set, any call to
- _gdbm_mapped_{write|read} will remap the
- region according to the above fields. */
-
};
/* Now define all the routines in use. */

Return to:

Send suggestions and report system problems to the System administrator.