1 #include <lunaix/ds/lru.h>
2 #include <lunaix/mm/valloc.h>
4 struct llist_header zone_lead = { .next = &zone_lead, .prev = &zone_lead };
7 lru_new_zone(evict_cb try_evict_cb)
9 struct lru_zone* zone = vzalloc(sizeof(struct lru_zone));
14 zone->try_evict = try_evict_cb;
16 llist_init_head(&zone->lead_node);
17 llist_append(&zone_lead, &zone->zones);
23 lru_use_one(struct lru_zone* zone, struct lru_node* node)
25 if (node->lru_nodes.next && node->lru_nodes.prev) {
26 llist_delete(&node->lru_nodes);
29 llist_prepend(&zone->lead_node, &node->lru_nodes);
34 __do_evict(struct lru_zone* zone, struct llist_header* elem)
37 if (!zone->try_evict(container_of(elem, struct lru_node, lru_nodes))) {
38 llist_append(&zone->lead_node, elem);
45 lru_evict_one(struct lru_zone* zone)
47 struct llist_header* tail = zone->lead_node.prev;
48 if (tail == &zone->lead_node) {
52 __do_evict(zone, tail);
56 lru_evict_half(struct lru_zone* zone)
58 int target = (int)(zone->objects / 2);
59 struct llist_header* tail = zone->lead_node.prev;
60 while (tail != &zone->lead_node && target > 0) {
61 __do_evict(zone, tail);
68 lru_remove(struct lru_zone* zone, struct lru_node* node)
70 if (node->lru_nodes.next && node->lru_nodes.prev) {
71 llist_delete(&node->lru_nodes);