#include "cache.h" #include "mru.h" void mru_append(struct mru *mru, void *item) { struct mru_entry *cur = xmalloc(sizeof(*cur)); cur->item = item; cur->prev = mru->tail; cur->next = NULL; if (mru->tail) mru->tail->next = cur; else mru->head = cur; mru->tail = cur; } void mru_mark(struct mru *mru, struct mru_entry *entry) { /* If we're already at the front of the list, nothing to do */ if (mru->head == entry) return; /* Otherwise, remove us from our current slot... */ if (entry->prev) entry->prev->next = entry->next; if (entry->next) entry->next->prev = entry->prev; else mru->tail = entry->prev; /* And insert us at the beginning. */ entry->prev = NULL; entry->next = mru->head; if (mru->head) mru->head->prev = entry; mru->head = entry; } void mru_clear(struct mru *mru) { struct mru_entry *p = mru->head; while (p) { struct mru_entry *to_free = p; p = p->next; free(to_free); } mru->head = mru->tail = NULL; }