diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2019-11-16 10:43:39 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2019-11-16 10:43:39 +0200 |
commit | 7aefde132304ec11edbacad76a3acd69db9e2fc4 (patch) | |
tree | 6a10e995f7413c9759494c905a035b73977123ac | |
parent | 6534535f18c41304b6623c4afd42e20da941e061 (diff) | |
download | gdbm-7aefde132304ec11edbacad76a3acd69db9e2fc4.tar.gz gdbm-7aefde132304ec11edbacad76a3acd69db9e2fc4.tar.bz2 |
Simplify memory allocation
* src/gdbmdefs.h (cache_elem): Place one hash_bucket element at the
end of the structure so it can be allocated along with it.
* src/bucket.c (cache_elem_new): Allocate enough space for cache_elem
and dbf->header->bucket_size hash bucket within.
-rw-r--r-- | src/bucket.c | 13 | ||||
-rw-r--r-- | src/gdbmdefs.h | 17 |
2 files changed, 14 insertions, 16 deletions
diff --git a/src/bucket.c b/src/bucket.c index 308908b..59bb964 100644 --- a/src/bucket.c +++ b/src/bucket.c @@ -128,17 +128,13 @@ cache_elem_new (GDBM_FILE dbf, off_t adr) } else { - elem = calloc (1, sizeof (*elem)); + elem = calloc (1, + sizeof (*elem) - + sizeof (elem->ca_bucket[0]) + + dbf->header->bucket_size); if (!elem) return NULL; - - elem->ca_bucket = malloc (dbf->header->bucket_size); - if (!elem->ca_bucket) - { - free (elem); - return NULL; - } } elem->ca_adr = adr; @@ -590,7 +586,6 @@ _gdbm_cache_free (GDBM_FILE dbf) { dbf->cache_avail = elem->ca_next; free (elem->ca_data.dptr); - free (elem->ca_bucket); free (elem); } } diff --git a/src/gdbmdefs.h b/src/gdbmdefs.h index 79b5e71..48dc0dd 100644 --- a/src/gdbmdefs.h +++ b/src/gdbmdefs.h @@ -170,16 +170,19 @@ struct cache_node struct cache_elem { - hash_bucket * ca_bucket; off_t ca_adr; char ca_changed; /* Data in the bucket changed. */ - data_cache_elem ca_data; - cache_elem *ca_prev, *ca_next; /* Previous and next elements in LRU list. - If the item is in cache_avail list, only - ca_next is used. It points to the next - available element. */ + data_cache_elem ca_data; /* Cached datum */ + cache_elem *ca_prev, /* Previous element in LRU list. */ + *ca_next; /* Next elements in LRU list. + If the item is in cache_avail list, only + ca_next is used. It points to the next + available element. */ size_t ca_hits; /* Number of times this element was requested */ - struct cache_node *ca_node; + cache_node *ca_node; /* Points back to the RBT node for this + element. */ + hash_bucket ca_bucket[1];/* Associated bucket (dbf->header->bucket_size + bytes). */ }; typedef struct cache_tree cache_tree; |