lru.c 1013 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. * Create an lru chain of buffers
  9. */
  10. void
  11. lruinit(Lru *h)
  12. {
  13. h->lprev = h->lnext = h;
  14. }
  15. /*
  16. * Add a member to an lru chain
  17. */
  18. void
  19. lruadd(Lru *h, Lru *m)
  20. {
  21. h->lprev->lnext = m;
  22. m->lprev = h->lprev;
  23. h->lprev = m;
  24. m->lnext = h;
  25. }
  26. /*
  27. * Move to end of lru list
  28. */
  29. void
  30. lruref(Lru *h, Lru *m)
  31. {
  32. if(h->lprev == m)
  33. return; /* alread at end of list */
  34. /*
  35. * remove from list
  36. */
  37. m->lprev->lnext = m->lnext;
  38. m->lnext->lprev = m->lprev;
  39. /*
  40. * add in at end
  41. */
  42. h->lprev->lnext = m;
  43. m->lprev = h->lprev;
  44. h->lprev = m;
  45. m->lnext = h;
  46. }
  47. /*
  48. * Move to head of lru list
  49. */
  50. void
  51. lruderef(Lru *h, Lru *m)
  52. {
  53. if(h->lnext == m)
  54. return; /* alread at head of list */
  55. /*
  56. * remove from list
  57. */
  58. m->lprev->lnext = m->lnext;
  59. m->lnext->lprev = m->lprev;
  60. /*
  61. * add in at head
  62. */
  63. h->lnext->lprev = m;
  64. m->lnext = h->lnext;
  65. h->lnext = m;
  66. m->lprev = h;
  67. }