xref: /dflybsd-src/usr.sbin/nscd/cacheplcs.h (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
1*86d7f5d3SJohn Marino /*-
2*86d7f5d3SJohn Marino  * Copyright (c) 2005 Michael Bushkov <bushman@rsu.ru>
3*86d7f5d3SJohn Marino  * All rights reserved.
4*86d7f5d3SJohn Marino  *
5*86d7f5d3SJohn Marino  * Redistribution and use in source and binary forms, with or without
6*86d7f5d3SJohn Marino  * modification, are permitted provided that the following conditions
7*86d7f5d3SJohn Marino  * are met:
8*86d7f5d3SJohn Marino  * 1. Redistributions of source code must retain the above copyright
9*86d7f5d3SJohn Marino  *    notice, this list of conditions and the following disclaimer.
10*86d7f5d3SJohn Marino  * 2. Redistributions in binary form must reproduce the above copyright
11*86d7f5d3SJohn Marino  *    notice, this list of conditions and the following disclaimer in the
12*86d7f5d3SJohn Marino  *    documentation and/or other materials provided with the distribution.
13*86d7f5d3SJohn Marino  *
14*86d7f5d3SJohn Marino  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*86d7f5d3SJohn Marino  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*86d7f5d3SJohn Marino  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*86d7f5d3SJohn Marino  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*86d7f5d3SJohn Marino  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*86d7f5d3SJohn Marino  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*86d7f5d3SJohn Marino  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*86d7f5d3SJohn Marino  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*86d7f5d3SJohn Marino  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*86d7f5d3SJohn Marino  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*86d7f5d3SJohn Marino  * SUCH DAMAGE.
25*86d7f5d3SJohn Marino  *
26*86d7f5d3SJohn Marino  * $FreeBSD: src/usr.sbin/nscd/cacheplcs.h,v 1.3 2007/09/27 12:30:11 bushman Exp $
27*86d7f5d3SJohn Marino  */
28*86d7f5d3SJohn Marino 
29*86d7f5d3SJohn Marino #ifndef __NSCD_CACHEPLCS_H__
30*86d7f5d3SJohn Marino #define __NSCD_CACHEPLCS_H__
31*86d7f5d3SJohn Marino 
32*86d7f5d3SJohn Marino #include <sys/queue.h>
33*86d7f5d3SJohn Marino #include <sys/time.h>
34*86d7f5d3SJohn Marino #include <stdlib.h>
35*86d7f5d3SJohn Marino 
36*86d7f5d3SJohn Marino /* common policy definitions */
37*86d7f5d3SJohn Marino #define CACHELIB_MAX_FREQUENCY 100
38*86d7f5d3SJohn Marino 
39*86d7f5d3SJohn Marino /*
40*86d7f5d3SJohn Marino  * cache_policy_item_ represents some abstract cache element in the policy
41*86d7f5d3SJohn Marino  * queue. connected_item pointers to the corresponding cache_policy_item_ in
42*86d7f5d3SJohn Marino  * another policy queue.
43*86d7f5d3SJohn Marino  */
44*86d7f5d3SJohn Marino struct cache_policy_item_
45*86d7f5d3SJohn Marino {
46*86d7f5d3SJohn Marino 	char	*key;
47*86d7f5d3SJohn Marino 	size_t	key_size;
48*86d7f5d3SJohn Marino 
49*86d7f5d3SJohn Marino 	size_t	request_count;
50*86d7f5d3SJohn Marino 	struct timeval last_request_time;
51*86d7f5d3SJohn Marino 	struct timeval creation_time;
52*86d7f5d3SJohn Marino 
53*86d7f5d3SJohn Marino 	struct cache_policy_item_ *connected_item;
54*86d7f5d3SJohn Marino };
55*86d7f5d3SJohn Marino 
56*86d7f5d3SJohn Marino /*
57*86d7f5d3SJohn Marino  * cache_policy_ represents an abstract policy queue. It can be customized by
58*86d7f5d3SJohn Marino  * setting appropriate function pointers
59*86d7f5d3SJohn Marino  */
60*86d7f5d3SJohn Marino struct cache_policy_
61*86d7f5d3SJohn Marino {
62*86d7f5d3SJohn Marino 	struct cache_policy_item_* (*create_item_func)(void);
63*86d7f5d3SJohn Marino 	void (*destroy_item_func)(struct cache_policy_item_ *);
64*86d7f5d3SJohn Marino 
65*86d7f5d3SJohn Marino 	void (*add_item_func)(struct cache_policy_ *,
66*86d7f5d3SJohn Marino 		struct cache_policy_item_ *);
67*86d7f5d3SJohn Marino 	void (*remove_item_func)(struct cache_policy_ *,
68*86d7f5d3SJohn Marino 		struct cache_policy_item_ *);
69*86d7f5d3SJohn Marino 	void (*update_item_func)(struct cache_policy_ *,
70*86d7f5d3SJohn Marino 		struct cache_policy_item_ *);
71*86d7f5d3SJohn Marino 
72*86d7f5d3SJohn Marino 	struct cache_policy_item_ *(*get_first_item_func)(
73*86d7f5d3SJohn Marino 		struct cache_policy_ *);
74*86d7f5d3SJohn Marino 	struct cache_policy_item_ *(*get_last_item_func)(
75*86d7f5d3SJohn Marino 		struct cache_policy_ *);
76*86d7f5d3SJohn Marino 	struct cache_policy_item_ *(*get_next_item_func)(
77*86d7f5d3SJohn Marino 		struct cache_policy_ *, struct cache_policy_item_ *);
78*86d7f5d3SJohn Marino 	struct cache_policy_item_ *(*get_prev_item_func)(
79*86d7f5d3SJohn Marino 		struct cache_policy_ *, struct cache_policy_item_ *);
80*86d7f5d3SJohn Marino };
81*86d7f5d3SJohn Marino 
82*86d7f5d3SJohn Marino /*
83*86d7f5d3SJohn Marino  * LFU cache policy item "inherited" from cache_policy_item_ structure
84*86d7f5d3SJohn Marino  */
85*86d7f5d3SJohn Marino struct cache_lfu_policy_item_
86*86d7f5d3SJohn Marino {
87*86d7f5d3SJohn Marino 	struct cache_policy_item_ parent_data;
88*86d7f5d3SJohn Marino 	int	frequency;
89*86d7f5d3SJohn Marino 
90*86d7f5d3SJohn Marino 	TAILQ_ENTRY(cache_lfu_policy_item_) entries;
91*86d7f5d3SJohn Marino };
92*86d7f5d3SJohn Marino 
93*86d7f5d3SJohn Marino TAILQ_HEAD(cache_lfu_policy_group_, cache_lfu_policy_item_);
94*86d7f5d3SJohn Marino 
95*86d7f5d3SJohn Marino /*
96*86d7f5d3SJohn Marino  * LFU policy queue "inherited" from cache_policy_.
97*86d7f5d3SJohn Marino  */
98*86d7f5d3SJohn Marino struct cache_lfu_policy_
99*86d7f5d3SJohn Marino {
100*86d7f5d3SJohn Marino 	struct cache_policy_ parent_data;
101*86d7f5d3SJohn Marino 	struct cache_lfu_policy_group_ groups[CACHELIB_MAX_FREQUENCY];
102*86d7f5d3SJohn Marino };
103*86d7f5d3SJohn Marino 
104*86d7f5d3SJohn Marino /*
105*86d7f5d3SJohn Marino  * LRU and FIFO policies item "inherited" from cache_policy_item_
106*86d7f5d3SJohn Marino  */
107*86d7f5d3SJohn Marino struct cache_queue_policy_item_
108*86d7f5d3SJohn Marino {
109*86d7f5d3SJohn Marino 	struct cache_policy_item_ parent_data;
110*86d7f5d3SJohn Marino 	TAILQ_ENTRY(cache_queue_policy_item_) entries;
111*86d7f5d3SJohn Marino };
112*86d7f5d3SJohn Marino 
113*86d7f5d3SJohn Marino /*
114*86d7f5d3SJohn Marino  * LRU and FIFO policies "inherited" from cache_policy_
115*86d7f5d3SJohn Marino  */
116*86d7f5d3SJohn Marino struct cache_queue_policy_
117*86d7f5d3SJohn Marino {
118*86d7f5d3SJohn Marino 	struct cache_policy_ parent_data;
119*86d7f5d3SJohn Marino 	TAILQ_HEAD(cache_queue_policy_head_, cache_queue_policy_item_) head;
120*86d7f5d3SJohn Marino };
121*86d7f5d3SJohn Marino 
122*86d7f5d3SJohn Marino typedef struct cache_queue_policy_ cache_fifo_policy_;
123*86d7f5d3SJohn Marino typedef struct cache_queue_policy_ cache_lru_policy_;
124*86d7f5d3SJohn Marino 
125*86d7f5d3SJohn Marino /* fifo policy routines */
126*86d7f5d3SJohn Marino extern struct cache_policy_ *init_cache_fifo_policy(void);
127*86d7f5d3SJohn Marino extern void destroy_cache_fifo_policy(struct cache_policy_ *);
128*86d7f5d3SJohn Marino 
129*86d7f5d3SJohn Marino /* lru policy routines */
130*86d7f5d3SJohn Marino extern struct cache_policy_ *init_cache_lru_policy(void);
131*86d7f5d3SJohn Marino extern void destroy_cache_lru_policy(struct cache_policy_ *);
132*86d7f5d3SJohn Marino 
133*86d7f5d3SJohn Marino /* lfu policy routines */
134*86d7f5d3SJohn Marino extern struct cache_policy_ *init_cache_lfu_policy(void);
135*86d7f5d3SJohn Marino extern void destroy_cache_lfu_policy(struct cache_policy_ *);
136*86d7f5d3SJohn Marino 
137*86d7f5d3SJohn Marino #endif
138