feat: lru eviction policy on page caches
[lunaix-os.git] / lunaix-os / includes / lunaix / ds / llist.h
index 79fa99173003797fe8dfa6f0a805576a4d506151..6129ca05a83bd015b20058c8c9ac1bd68276e69c 100644 (file)
@@ -41,13 +41,13 @@ llist_init_head(struct llist_header* head)
 static inline void
 llist_append(struct llist_header* head, struct llist_header* elem)
 {
-    __llist_add(elem, head, head->next);
+    __llist_add(elem, head->prev, head);
 }
 
 static inline void
 llist_prepend(struct llist_header* head, struct llist_header* elem)
 {
-    __llist_add(elem, head->prev, head);
+    __llist_add(elem, head, head->next);
 }
 
 static inline void
@@ -57,14 +57,14 @@ llist_delete(struct llist_header* elem)
     elem->next->prev = elem->prev;
 
     // make elem orphaned
-    // elem->prev = elem;
-    // elem->next = elem;
+    elem->prev = elem;
+    elem->next = elem;
 }
 
 static inline int
 llist_empty(struct llist_header* elem)
 {
-    return elem->next == elem;
+    return elem->next == elem && elem->prev == elem;
 }
 
 /**
@@ -87,4 +87,27 @@ llist_empty(struct llist_header* elem)
          &pos->member != (head);                                               \
          pos = n, n = list_entry(n->member.next, typeof(*n), member))
 
+struct hlist_node
+{
+    struct hlist_node *next, **pprev;
+};
+
+static inline void
+hlist_del(struct hlist_node* node)
+{
+    *node->pprev = node->next;
+    node->next = 0;
+    node->pprev = 0;
+}
+
+static inline void
+hlist_add(struct hlist_node** head, struct hlist_node* node)
+{
+    node->next = *head;
+    if (*head) {
+        (*head)->pprev = &node->next;
+    }
+    node->pprev = head;
+    *head = node;
+}
 #endif /* __LUNAIX_LLIST_H */