2 * Copyright (c) 1990 The Regents of the University of California.
5 * This code is derived from software contributed to Berkeley by
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by the University of
19 * California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38 * @(#)lrucache.h 5.1 (Berkeley) 1/23/91
42 * LRU list entries. The head of the list is the most-recently requested
43 * block; the tail is the least-recently requested one.
46 typedef struct LRU_ENT
{
47 char *l_buffer
; /* buffer we return to user */
48 int l_pgno
; /* logical page number */
49 int l_flags
; /* FREE and DIRTY bits */
50 struct LRU_ENT
*l_prev
; /* predecessor in LRU list */
51 struct LRU_ENT
*l_next
; /* successor in LRU list */
55 * Cache entries. We use a hash table to avoid a linear walk of the LRU
56 * list when we need to look up blocks by number. The hash table is
60 typedef struct CACHE_ENT
{
63 struct CACHE_ENT
*c_chain
;
67 * The LRU cache structure. The cache size (lru_csize) is the largest size
68 * the user wants us to grow to; current size (lru_cursz) is always less than
69 * or equal to lru_csize. Note that we will grow the cache (lru_csize) if
70 * it's the only way that we can satisfy a user's block request.
73 typedef struct LRUCACHE
{
78 char *lru_opaque
; /* passed to inproc, outproc */
83 CACHE_ENT
**lru_cache
;
88 #endif /* ndef NULL */
90 /* this is the opaque type we return for LRU caches */
93 /* bits for l_flags in LRU_ENT structure */
94 #define F_DIRTY (1 << 0)
95 #define F_FREE (1 << 1)
97 /* lru module routines */
98 extern CACHE_ENT
*lruhashget();
99 extern CACHE_ENT
*lruhashput();
100 extern int lruhashdel();
101 extern void lruhead();
102 extern int lrugrow();
103 extern LRU
lruinit();
104 extern int lruwrite();
105 extern int lrusync();
106 extern char *lruget();
107 extern char *lrugetnew();
108 extern char *lrugetpg();
109 extern int lrurelease();
110 extern void lrufree();