X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Futil.c;h=bd5ddd36e483d55f8ead4237606a36a6bf5c9652;hb=e26a903ddf80011e3b72a780d7392a8333c996af;hp=54c3c36170719a5f93ae9688acbde88e0e86be5f;hpb=e53d372f2e2d81a4a0958425bd7cb41e3e6f4a57;p=bluesky.git diff --git a/bluesky/util.c b/bluesky/util.c index 54c3c36..bd5ddd3 100644 --- a/bluesky/util.c +++ b/bluesky/util.c @@ -52,7 +52,7 @@ BlueSkyRCStr *bluesky_string_new(gpointer data, gsize len) } /* Create a new BlueSkyRCStr from a GString. The GString is destroyed. */ -BlueSkyRCStr *bluesky_string_new_from_string(GString *s) +BlueSkyRCStr *bluesky_string_new_from_gstring(GString *s) { gsize len = s->len; return bluesky_string_new(g_string_free(s, FALSE), len); @@ -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; }