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