cacheplcs.h revision 172344
1187983Sluigi/*- 2187983Sluigi * Copyright (c) 2005 Michael Bushkov <bushman@rsu.ru> 3187983Sluigi * All rights reserved. 4187983Sluigi * 5187983Sluigi * Redistribution and use in source and binary forms, with or without 6187983Sluigi * modification, are permitted provided that the following conditions 7187983Sluigi * are met: 8187983Sluigi * 1. Redistributions of source code must retain the above copyright 9187983Sluigi * notice, this list of conditions and the following disclaimer. 10187983Sluigi * 2. Redistributions in binary form must reproduce the above copyright 11187983Sluigi * notice, this list of conditions and the following disclaimer in the 12187983Sluigi * documentation and/or other materials provided with the distribution. 13187983Sluigi * 14187983Sluigi * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15187983Sluigi * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16187983Sluigi * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17187983Sluigi * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18187983Sluigi * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19187983Sluigi * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20187983Sluigi * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21187983Sluigi * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22187983Sluigi * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23187983Sluigi * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24187983Sluigi * SUCH DAMAGE. 25187983Sluigi * 26187983Sluigi * $FreeBSD: head/usr.sbin/nscd/cacheplcs.h 171795 2007-08-09 13:06:12Z bushman $ 27187983Sluigi */ 28187983Sluigi 29187983Sluigi#ifndef __NSCD_CACHEPLCS_H__ 30187983Sluigi#define __NSCD_CACHEPLCS_H__ 31187983Sluigi 32187983Sluigi#include <sys/queue.h> 33187983Sluigi#include <sys/time.h> 34187983Sluigi#include <stdlib.h> 35187983Sluigi 36187983Sluigi/* common policy definitions */ 37187983Sluigi#define CACHELIB_MAX_FREQUENCY 100 38187983Sluigi 39187983Sluigi/* 40187983Sluigi * cache_policy_item_ represents some abstract cache element in the policy 41187983Sluigi * queue. connected_item pointers to the corresponding cache_policy_item_ in 42204591Sluigi * another policy queue. 43187983Sluigi */ 44187983Sluigistruct cache_policy_item_ 45187983Sluigi{ 46187983Sluigi char *key; 47187983Sluigi size_t key_size; 48187983Sluigi 49187983Sluigi size_t request_count; 50187983Sluigi struct timeval last_request_time; 51187983Sluigi struct timeval creation_time; 52187983Sluigi 53187983Sluigi struct cache_policy_item_ *connected_item; 54187983Sluigi}; 55187983Sluigi 56187983Sluigi/* 57187983Sluigi * cache_policy_ represents an abstract policy queue. It can be customized by 58187983Sluigi * setting appropriate function pointers 59187983Sluigi */ 60187983Sluigistruct cache_policy_ 61187983Sluigi{ 62187983Sluigi struct cache_policy_item_* (*create_item_func)(); 63187983Sluigi void (*destroy_item_func)(struct cache_policy_item_ *); 64187983Sluigi 65187983Sluigi void (*add_item_func)(struct cache_policy_ *, 66187983Sluigi struct cache_policy_item_ *); 67187983Sluigi void (*remove_item_func)(struct cache_policy_ *, 68187983Sluigi struct cache_policy_item_ *); 69187983Sluigi void (*update_item_func)(struct cache_policy_ *, 70187983Sluigi struct cache_policy_item_ *); 71187983Sluigi 72187983Sluigi struct cache_policy_item_ *(*get_first_item_func)( 73187983Sluigi struct cache_policy_ *); 74187983Sluigi struct cache_policy_item_ *(*get_last_item_func)( 75187983Sluigi struct cache_policy_ *); 76187983Sluigi struct cache_policy_item_ *(*get_next_item_func)( 77187983Sluigi struct cache_policy_ *, struct cache_policy_item_ *); 78187983Sluigi struct cache_policy_item_ *(*get_prev_item_func)( 79187983Sluigi struct cache_policy_ *, struct cache_policy_item_ *); 80187983Sluigi}; 81187983Sluigi 82187983Sluigi/* 83187983Sluigi * LFU cache policy item "inherited" from cache_policy_item_ structure 84187983Sluigi */ 85187983Sluigistruct cache_lfu_policy_item_ 86187983Sluigi{ 87187983Sluigi struct cache_policy_item_ parent_data; 88187983Sluigi int frequency; 89187983Sluigi 90187983Sluigi TAILQ_ENTRY(cache_lfu_policy_item_) entries; 91187983Sluigi}; 92187983Sluigi 93187983SluigiTAILQ_HEAD(cache_lfu_policy_group_, cache_lfu_policy_item_); 94187983Sluigi 95187983Sluigi/* 96187983Sluigi * LFU policy queue "inherited" from cache_policy_. 97187983Sluigi */ 98187983Sluigistruct cache_lfu_policy_ 99187983Sluigi{ 100187983Sluigi struct cache_policy_ parent_data; 101187983Sluigi struct cache_lfu_policy_group_ groups[CACHELIB_MAX_FREQUENCY]; 102187983Sluigi}; 103187983Sluigi 104187983Sluigi/* 105187983Sluigi * LRU and FIFO policies item "inherited" from cache_policy_item_ 106187983Sluigi */ 107187983Sluigistruct cache_queue_policy_item_ 108187983Sluigi{ 109187983Sluigi struct cache_policy_item_ parent_data; 110187983Sluigi TAILQ_ENTRY(cache_queue_policy_item_) entries; 111187983Sluigi}; 112187983Sluigi 113187983Sluigi/* 114187983Sluigi * LRU and FIFO policies "inherited" from cache_policy_ 115187983Sluigi */ 116187983Sluigistruct cache_queue_policy_ 117187983Sluigi{ 118187983Sluigi struct cache_policy_ parent_data; 119187983Sluigi TAILQ_HEAD(cache_queue_policy_head_, cache_queue_policy_item_) head; 120187983Sluigi}; 121187983Sluigi 122187983Sluigitypedef struct cache_queue_policy_ cache_fifo_policy_; 123187983Sluigitypedef struct cache_queue_policy_ cache_lru_policy_; 124187983Sluigi 125189394Sluigi/* fifo policy routines */ 126187983Sluigiextern struct cache_policy_ *init_cache_fifo_policy(); 127187983Sluigiextern void destroy_cache_fifo_policy(struct cache_policy_ *); 128187983Sluigi 129187983Sluigi/* lru policy routines */ 130187983Sluigiextern struct cache_policy_ *init_cache_lru_policy(); 131187983Sluigiextern void destroy_cache_lru_policy(struct cache_policy_ *); 132187983Sluigi 133187983Sluigi/* lfu policy routines */ 134187983Sluigiextern struct cache_policy_ *init_cache_lfu_policy(); 135187983Sluigiextern void destroy_cache_lfu_policy(struct cache_policy_ *); 136187983Sluigi 137187983Sluigi#endif 138187983Sluigi