aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bucket.c13
-rw-r--r--src/gdbmdefs.h17
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;

Return to:

Send suggestions and report system problems to the System administrator.