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