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