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