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 Colombierlruinit(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 Colombierlruadd(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 Colombierlruref(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 Colombierlruderef(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