diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/cfs/lru.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/cfs/lru.c')
-rwxr-xr-x | sys/src/cmd/cfs/lru.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/sys/src/cmd/cfs/lru.c b/sys/src/cmd/cfs/lru.c new file mode 100755 index 000000000..55f6c6e8b --- /dev/null +++ b/sys/src/cmd/cfs/lru.c @@ -0,0 +1,75 @@ +/* + * lru lists are circular with a list head + * pointing to the start and end of the list + */ +#include <u.h> +#include "lru.h" + +/* + * Create an lru chain of buffers + */ +void +lruinit(Lru *h) +{ + h->lprev = h->lnext = h; +} + +/* + * Add a member to an lru chain + */ +void +lruadd(Lru *h, Lru *m) +{ + h->lprev->lnext = m; + m->lprev = h->lprev; + h->lprev = m; + m->lnext = h; +} + +/* + * Move to end of lru list + */ +void +lruref(Lru *h, Lru *m) +{ + if(h->lprev == m) + return; /* alread at end of list */ + + /* + * remove from list + */ + m->lprev->lnext = m->lnext; + m->lnext->lprev = m->lprev; + + /* + * add in at end + */ + h->lprev->lnext = m; + m->lprev = h->lprev; + h->lprev = m; + m->lnext = h; +} + +/* + * Move to head of lru list + */ +void +lruderef(Lru *h, Lru *m) +{ + if(h->lnext == m) + return; /* alread at head of list */ + + /* + * remove from list + */ + m->lprev->lnext = m->lnext; + m->lnext->lprev = m->lprev; + + /* + * add in at head + */ + h->lnext->lprev = m; + m->lnext = h->lnext; + h->lnext = m; + m->lprev = h; +} |