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)12lruinit(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)21lruadd(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)33lruref(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)57lruderef(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