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