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