]>
Commit | Line | Data |
---|---|---|
002f206f JK |
1 | #include "cache.h" |
2 | #include "mru.h" | |
3 | ||
4 | void mru_append(struct mru *mru, void *item) | |
5 | { | |
6 | struct mru_entry *cur = xmalloc(sizeof(*cur)); | |
7 | cur->item = item; | |
8 | cur->prev = mru->tail; | |
9 | cur->next = NULL; | |
10 | ||
11 | if (mru->tail) | |
12 | mru->tail->next = cur; | |
13 | else | |
14 | mru->head = cur; | |
15 | mru->tail = cur; | |
16 | } | |
17 | ||
18 | void mru_mark(struct mru *mru, struct mru_entry *entry) | |
19 | { | |
20 | /* If we're already at the front of the list, nothing to do */ | |
21 | if (mru->head == entry) | |
22 | return; | |
23 | ||
24 | /* Otherwise, remove us from our current slot... */ | |
25 | if (entry->prev) | |
26 | entry->prev->next = entry->next; | |
27 | if (entry->next) | |
28 | entry->next->prev = entry->prev; | |
29 | else | |
30 | mru->tail = entry->prev; | |
31 | ||
32 | /* And insert us at the beginning. */ | |
33 | entry->prev = NULL; | |
34 | entry->next = mru->head; | |
35 | if (mru->head) | |
36 | mru->head->prev = entry; | |
37 | mru->head = entry; | |
38 | } | |
39 | ||
40 | void mru_clear(struct mru *mru) | |
41 | { | |
42 | struct mru_entry *p = mru->head; | |
43 | ||
44 | while (p) { | |
45 | struct mru_entry *to_free = p; | |
46 | p = p->next; | |
47 | free(to_free); | |
48 | } | |
49 | mru->head = mru->tail = NULL; | |
50 | } |