#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; | |
} |