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