X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/9461d582084ab8c0d85e8dca1df276945366a84b..af8e873ae38b72a56a89485c62bb5ccd22a9f8a7:/lunaix-os/kernel/ds/lru.c diff --git a/lunaix-os/kernel/ds/lru.c b/lunaix-os/kernel/ds/lru.c new file mode 100644 index 0000000..ebabeef --- /dev/null +++ b/lunaix-os/kernel/ds/lru.c @@ -0,0 +1,49 @@ +#include +#include + +struct llist_header zone_lead = { .next = &zone_lead, .prev = &zone_lead }; + +struct lru_zone* +lru_new_zone() +{ + struct lru_zone* zone = valloc(sizeof(struct lru_zone)); + if (!zone) { + return NULL; + } + + llist_init_head(&zone->lead_node); + llist_append(&zone_lead, &zone->zones); + + return zone; +} + +void +lru_use_one(struct lru_zone* zone, struct lru_node* node) +{ + if (node->lru_nodes.next && node->lru_nodes.prev) { + llist_delete(&node->lru_nodes); + } + + llist_prepend(&zone->lead_node, &node->lru_nodes); +} + +struct lru_node* +lru_evict_one(struct lru_zone* zone) +{ + struct llist_header* tail = zone->lead_node.prev; + if (tail == &zone->lead_node) { + return; + } + + llist_delete(tail); + + return container_of(tail, struct lru_node, lru_nodes); +} + +void +lru_remove(struct lru_node* node) +{ + if (node->lru_nodes.next && node->lru_nodes.prev) { + llist_delete(&node->lru_nodes); + } +} \ No newline at end of file