Merge branch 'vfs-dev'
[lunaix-os.git] / lunaix-os / kernel / ds / lru.c
1 #include <lunaix/ds/lru.h>
2 #include <lunaix/mm/valloc.h>
3
4 struct llist_header zone_lead = { .next = &zone_lead, .prev = &zone_lead };
5
6 struct lru_zone*
7 lru_new_zone()
8 {
9     struct lru_zone* zone = valloc(sizeof(struct lru_zone));
10     if (!zone) {
11         return NULL;
12     }
13
14     llist_init_head(&zone->lead_node);
15     llist_append(&zone_lead, &zone->zones);
16
17     return zone;
18 }
19
20 void
21 lru_use_one(struct lru_zone* zone, struct lru_node* node)
22 {
23     if (node->lru_nodes.next && node->lru_nodes.prev) {
24         llist_delete(&node->lru_nodes);
25     }
26
27     llist_prepend(&zone->lead_node, &node->lru_nodes);
28 }
29
30 struct lru_node*
31 lru_evict_one(struct lru_zone* zone)
32 {
33     struct llist_header* tail = zone->lead_node.prev;
34     if (tail == &zone->lead_node) {
35         return;
36     }
37
38     llist_delete(tail);
39
40     return container_of(tail, struct lru_node, lru_nodes);
41 }
42
43 void
44 lru_remove(struct lru_node* node)
45 {
46     if (node->lru_nodes.next && node->lru_nodes.prev) {
47         llist_delete(&node->lru_nodes);
48     }
49 }