50 lines
968 B
50 lines
968 B
#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; |
|
}
|
|
|