diff --git a/src/server/cache-node.c b/src/server/cache-node.c index 0568976f63f2577e0acbf9da3186615b8be8d5a5..bef71a0cca4de70ddfe8be57db30db44609f09d4 100644 --- a/src/server/cache-node.c +++ b/src/server/cache-node.c @@ -4,6 +4,13 @@ * Used in diskomd. */ +#include <stdio.h> +#include <kom-types.h> +#include "exp.h" +#include "cache-node.h" +#include "smalloc.h" +#include "lyskomd.h" + EXPORT const Cache_node EMPTY_CACHE_NODE = ((Cache_node){{ 0, 0, 0}, NULL, NULL, 0, 0, 0, 0, NULL, NULL, 0}); @@ -21,17 +28,20 @@ unlink_lru(Cache_node *node, { Cache_node *link; - link = node->lru; + link = node->next; - if ( node->lru != NULL ) - node->lru->mru = node->mru; + if ( node->next != NULL ) + node->next->prev = node->prev; else if (*lru == node) - *lru = node->mru; + *lru = node->prev; - if ( node->mru != NULL ) - node->mru->lru = link; + if ( node->prev != NULL ) + node->prev->next = link; else if (*mru == node) *mru = link; + + node->next = NULL; + node->prev = NULL; } EXPORT void @@ -39,14 +49,38 @@ insert_mru(Cache_node *node, Cache_node **lru, Cache_node **mru) { - node->mru = NULL; - node->lru = *mru; + node->prev = NULL; + node->next = *mru; *mru = node; if ( *lru == NULL ) *lru = node; - if ( node->lru != NULL ) - node->lru->mru = node; + if ( node->next != NULL ) + node->next->prev = node; +} + +static Cache_node_mcb * +alloc_cache_node_mcb(void) +{ + Cache_node_mcb *t; + + t = smalloc(sizeof(Cache_node_mcb)); + *t = EMPTY_CACHE_NODE_MCB; + return t; +} + +static Cache_node_block * +alloc_cache_node_block(int table_size) +{ + Cache_node_block *t; + + t = smalloc(sizeof(Cache_node_block)); + *t = EMPTY_CACHE_NODE_BLOCK; + t->nodes = smalloc (table_size * sizeof (Cache_node)); + t->next_free = 0; + t->link = NULL; + + return t; } @@ -61,7 +95,7 @@ create_cache_node_mcb(int mcb_size, tmp->lookup_table = smalloc(sizeof(Cache_node *) * table_size); tmp->lookup_table_size = table_size; tmp->mcb_size = mcb_size; - tmp->last_block = alloc_cache_node_block(); + tmp->last_block = NULL; return tmp; } @@ -78,15 +112,36 @@ get_cache_node (Cache_node_mcb *control, } static Cache_node * -alloc_cache_node(void) +alloc_cache_node (Cache_node_mcb *control) { Cache_node *c; - c = smalloc(sizeof(Cache_node)); + if ( control->last_block == NULL + || control->last_block->next_free >= control->mcb_size ) + { + Cache_node_block *new_block; + + new_block = alloc_cache_node_block (control->mcb_size); + new_block->link = control->last_block; + control->last_block = new_block; + } + + c = &control->last_block->nodes[ control->last_block->next_free++ ]; + *c = EMPTY_CACHE_NODE; return c; } +EXPORT void +destruct_cache_node(Cache_node_mcb *control, + u_long key) +{ + if ( key >= control->lookup_table_size ) + return; + + control->lookup_table[ key ] = NULL; +} + EXPORT void create_cache_node (Cache_node_mcb *control, u_long key) @@ -96,9 +151,22 @@ create_cache_node (Cache_node_mcb *control, "lookup_table_size = %lu\n", control->lookup_table_size); - control->lookup_table[ key ] = alloc_cache_node(); + control->lookup_table[ key ] = alloc_cache_node(control); } +EXPORT void +zero_init_cache_node (Cache_node_mcb *control, + u_long key) +{ + if ( key >= control->lookup_table_size ) + restart_kom("ERROR: set_cache_node(%lu, %lu, value): " + "lookup_table_size = %lu\n", + control->lookup_table_size); + + control->lookup_table[ key ] = NULL; +} + + EXPORT void set_mru(Cache_node_mcb *mcb, @@ -114,4 +182,3 @@ set_mru(Cache_node_mcb *mcb, unlink_lru(node, &mcb->lru, &mcb->mru); insert_mru(node, &mcb->lru, &mcb->mru); } -