xref: /plan9/sys/src/cmd/cfs/lru.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1 /*
2  *  lru lists are circular with a list head
3  *  pointing to the start and end of the list
4  */
5 #include <u.h>
6 #include "lru.h"
7 
8 /*
9  *  Create an lru chain of buffers
10  */
11 void
lruinit(Lru * h)12 lruinit(Lru *h)
13 {
14 	h->lprev = h->lnext = h;
15 }
16 
17 /*
18  *  Add a member to an lru chain
19  */
20 void
lruadd(Lru * h,Lru * m)21 lruadd(Lru *h, Lru *m)
22 {
23 	h->lprev->lnext = m;
24 	m->lprev = h->lprev;
25 	h->lprev = m;
26 	m->lnext = h;
27 }
28 
29 /*
30  *  Move to end of lru list
31  */
32 void
lruref(Lru * h,Lru * m)33 lruref(Lru *h, Lru *m)
34 {
35 	if(h->lprev == m)
36 		return;		/* alread at end of list */
37 
38 	/*
39 	 *  remove from list
40 	 */
41 	m->lprev->lnext = m->lnext;
42 	m->lnext->lprev = m->lprev;
43 
44 	/*
45 	 *  add in at end
46 	 */
47 	h->lprev->lnext = m;
48 	m->lprev = h->lprev;
49 	h->lprev = m;
50 	m->lnext = h;
51 }
52 
53 /*
54  *  Move to head of lru list
55  */
56 void
lruderef(Lru * h,Lru * m)57 lruderef(Lru *h, Lru *m)
58 {
59 	if(h->lnext == m)
60 		return;		/* alread at head of list */
61 
62 	/*
63 	 *  remove from list
64 	 */
65 	m->lprev->lnext = m->lnext;
66 	m->lnext->lprev = m->lprev;
67 
68 	/*
69 	 *  add in at head
70 	 */
71 	h->lnext->lprev = m;
72 	m->lnext = h->lnext;
73 	h->lnext = m;
74 	m->lprev = h;
75 }
76