diff options
-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; |