Add LRU lists for tracking inodes that are dirty/accessed.
[bluesky.git] / bluesky / util.c
index 7f977a6..bd5ddd3 100644 (file)
@@ -108,5 +108,69 @@ void bluesky_string_resize(BlueSkyRCStr *string, gsize len)
     if (string->len == len)
         return;
 
+    g_warn_if_fail(string->refcount == 1);
+
     string->data = g_realloc(string->data, len);
+    string->len = len;
+}
+
+/* Cache LRU list management functions.  These manage the doubly-linked list of
+ * inodes sorted by accessed/modified time.  The FS lock should be held while
+ * calling these.
+ *
+ * _remove will unlink an inode from the linked list.
+ *
+ * _prepend and _append insert an inode at the head or tail of the linked list,
+ * and return a pointer to the linked list element (which should be stored in
+ * the inode); the inode should not already be in the list.
+ *
+ * _head and _tail simply return the first or last item inode in the list. */
+void bluesky_list_unlink(GList *head, GList *item)
+{
+    if (item == NULL)
+        return;
+
+    if (head->prev == item)
+        head->prev = item->prev;
+    head->next = g_list_delete_link(head->next, item);
+}
+
+GList *bluesky_list_prepend(GList *head, BlueSkyInode *inode)
+{
+    head->next = g_list_prepend(head->next, inode);
+    if (head->prev == NULL)
+        head->prev = g_list_last(head->next);
+    return head->next;
+}
+
+GList *bluesky_list_append(GList *head, BlueSkyInode *inode)
+{
+    if (head->next == NULL)
+        return bluesky_list_prepend(head, inode);
+
+    g_assert(head->prev != NULL && head->prev->next == NULL);
+
+    GList *link = g_list_alloc();
+    link->data = inode;
+    link->next = NULL;
+    link->prev = head->prev;
+    head->prev->next = link;
+    head->prev = link;
+    return link;
+}
+
+BlueSkyInode *bluesky_list_head(GList *head)
+{
+    if (head->next == NULL)
+        return NULL;
+    else
+        return (BlueSkyInode *)head->next->data;
+}
+
+BlueSkyInode *bluesky_list_tail(GList *head)
+{
+    if (head->prev == NULL)
+        return NULL;
+    else
+        return (BlueSkyInode *)head->prev->data;
 }