talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 6e7513fde3ec28dc5c03331002901a2415d04f65
parent d46d02c19a8c17b3feb49f5c423bccfd6b29d30e
Author: Andrej Kacian <ticho@claws-mail.org>
Date:   Tue, 13 Nov 2018 21:41:04 +0100

Use much less disk IO when working with .deleted files in RSSyl.

Diffstat:
Msrc/plugins/rssyl/rssyl.c | 6+++++-
Msrc/plugins/rssyl/rssyl_add_item.c | 2+-
Msrc/plugins/rssyl/rssyl_deleted.c | 63+++++++++++++++++++++++++++++++++------------------------------
Msrc/plugins/rssyl/rssyl_deleted.h | 7++++---
Msrc/plugins/rssyl/rssyl_parse_feed.c | 5+++--
Msrc/plugins/rssyl/rssyl_update_feed.c | 3+++
6 files changed, 49 insertions(+), 37 deletions(-)

diff --git a/src/plugins/rssyl/rssyl.c b/src/plugins/rssyl/rssyl.c @@ -831,6 +831,7 @@ static gint rssyl_remove_msg(Folder *folder, FolderItem *item, gint num) { gboolean need_scan = FALSE; gchar *file, *tmp; + RFolderItem *ritem = (RFolderItem *)item; g_return_val_if_fail(item != NULL, -1); @@ -849,7 +850,10 @@ static gint rssyl_remove_msg(Folder *folder, FolderItem *item, gint num) } g_free(tmp); - rssyl_deleted_add((RFolderItem *)item, file); + rssyl_deleted_update(ritem); + rssyl_deleted_add(ritem, file); + rssyl_deleted_store(ritem); + rssyl_deleted_free(ritem); if( g_unlink(file) < 0 ) { FILE_OP_ERROR(file, "unlink"); diff --git a/src/plugins/rssyl/rssyl_add_item.c b/src/plugins/rssyl/rssyl_add_item.c @@ -388,7 +388,7 @@ void rssyl_add_item(RFolderItem *ritem, FeedItem *feed_item) } /* Check against list of deleted items. */ - if (rssyl_deleted_check(ritem->deleted_items, feed_item)) { + if (rssyl_deleted_check(ritem, feed_item)) { debug_print("RSSyl: Item '%s' found among deleted items, NOT adding it.\n", feed_item_get_title(feed_item)); return; diff --git a/src/plugins/rssyl/rssyl_deleted.c b/src/plugins/rssyl/rssyl_deleted.c @@ -61,13 +61,15 @@ static void _free_deleted_item(gpointer d, gpointer user_data) g_free(ditem); } -void rssyl_deleted_free(GSList *deleted_items) +void rssyl_deleted_free(RFolderItem *ritem) { - if (deleted_items != NULL) { + cm_return_if_fail(ritem != NULL); + + if (ritem->deleted_items != NULL) { debug_print("RSSyl: releasing list of deleted items\n"); - g_slist_foreach(deleted_items, _free_deleted_item, NULL); - g_slist_free(deleted_items); - deleted_items = NULL; + g_slist_foreach(ritem->deleted_items, _free_deleted_item, NULL); + g_slist_free(ritem->deleted_items); + ritem->deleted_items = NULL; } } @@ -83,7 +85,7 @@ static gchar * _deleted_file_path(RFolderItem *ritem) } /***************************************************************/ -GSList *rssyl_deleted_update(RFolderItem *ritem) +void rssyl_deleted_update(RFolderItem *ritem) { gchar *deleted_file, *contents, **lines, **line; GError *error = NULL; @@ -91,16 +93,16 @@ GSList *rssyl_deleted_update(RFolderItem *ritem) RDeletedItem *ditem = NULL; GSList *deleted_items = NULL; - g_return_val_if_fail(ritem != NULL, NULL); + g_return_if_fail(ritem != NULL); deleted_file = _deleted_file_path(ritem); - debug_print("RSSyl: getting list of deleted items from '%s'\n", deleted_file); + debug_print("RSSyl: (DELETED) getting list of deleted items from '%s'\n", deleted_file); if (!g_file_test(deleted_file, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) { debug_print("RSSyl: '%s' doesn't exist, ignoring\n", deleted_file); g_free(deleted_file); - return NULL; + return; } g_file_get_contents(deleted_file, &contents, NULL, &error); @@ -115,7 +117,7 @@ GSList *rssyl_deleted_update(RFolderItem *ritem) } else { g_warning("Couldn't read '%s', ignoring", deleted_file); g_free(deleted_file); - return NULL; + return; } g_free(deleted_file); @@ -143,7 +145,9 @@ GSList *rssyl_deleted_update(RFolderItem *ritem) g_free(contents); debug_print("RSSyl: got %d deleted items\n", g_slist_length(deleted_items)); - return deleted_items; + + rssyl_deleted_free(ritem); + ritem->deleted_items = deleted_items; } static void _store_one_deleted_item(gpointer data, gpointer user_data) @@ -211,8 +215,11 @@ void rssyl_deleted_add(RFolderItem *ritem, gchar *path) { FeedItem *fitem = NULL; RDeletedItem *ditem = NULL; - GSList *deleted_items = rssyl_deleted_update(ritem); - gchar *deleted_file = NULL; + + cm_return_if_fail(ritem != NULL); + cm_return_if_fail(path != NULL); + + debug_print("RSSyl: (DELETED) add\n"); if (!(fitem = rssyl_parse_folder_item_file(path))) return; @@ -223,13 +230,7 @@ void rssyl_deleted_add(RFolderItem *ritem, gchar *path) CS_UTF_8, FALSE); ditem->date_published = feed_item_get_date_published(fitem); - deleted_items = g_slist_prepend(deleted_items, ditem); - - deleted_file = _deleted_file_path(ritem); - rssyl_deleted_store_internal(deleted_items, deleted_file); - g_free(deleted_file); - - rssyl_deleted_free(deleted_items); + ritem->deleted_items = g_slist_prepend(ritem->deleted_items, ditem); RFeedCtx *ctx = (RFeedCtx *)fitem->data; g_free(ctx->path); @@ -279,11 +280,19 @@ static gint _rssyl_deleted_check_func(gconstpointer a, gconstpointer b) } /* Returns TRUE if fitem is found among the deleted stuff. */ -gboolean rssyl_deleted_check(GSList *deleted_items, FeedItem *fitem) +gboolean rssyl_deleted_check(RFolderItem *ritem, FeedItem *fitem) { - if (g_slist_find_custom(deleted_items, (gconstpointer)fitem, - _rssyl_deleted_check_func) != NULL) + cm_return_val_if_fail(ritem != NULL, FALSE); + cm_return_val_if_fail(fitem != NULL, FALSE); + + debug_print("RSSyl: (DELETED) check\n"); + rssyl_deleted_update(ritem); + if (g_slist_find_custom(ritem->deleted_items, (gconstpointer)fitem, + _rssyl_deleted_check_func) != NULL) { + rssyl_deleted_free(ritem); return TRUE; + } + rssyl_deleted_free(ritem); return FALSE; } @@ -343,7 +352,7 @@ void rssyl_deleted_expire(RFolderItem *ritem, Feed *feed) g_return_if_fail(ritem != NULL); g_return_if_fail(feed != NULL); - ritem->deleted_items = rssyl_deleted_update(ritem); + debug_print("RSSyl: (DELETED) expire\n"); /* Iterate over all items in the list */ d = ritem->deleted_items; @@ -369,10 +378,4 @@ void rssyl_deleted_expire(RFolderItem *ritem, Feed *feed) g_free(ctx); } - - /* Write the new list to disk */ - rssyl_deleted_store(ritem); - - /* And clean up after myself */ - rssyl_deleted_free(ritem->deleted_items); } diff --git a/src/plugins/rssyl/rssyl_deleted.h b/src/plugins/rssyl/rssyl_deleted.h @@ -5,10 +5,11 @@ #include "rssyl.h" -GSList *rssyl_deleted_update(RFolderItem *ritem); -void *rssyl_deleted_free(GSList *deleted_items); +void rssyl_deleted_update(RFolderItem *ritem); +void rssyl_deleted_free(RFolderItem *ritem); void rssyl_deleted_add(RFolderItem *ritem, gchar *path); -gboolean rssyl_deleted_check(GSList *deleted_items, FeedItem *fitem); +void rssyl_deleted_store(RFolderItem *ritem); +gboolean rssyl_deleted_check(RFolderItem *ritem, FeedItem *fitem); void rssyl_deleted_expire(RFolderItem *ritem, Feed *feed); #endif /* __RSSYL_DELETED_H */ diff --git a/src/plugins/rssyl/rssyl_parse_feed.c b/src/plugins/rssyl/rssyl_parse_feed.c @@ -211,7 +211,7 @@ gboolean rssyl_parse_feed(RFolderItem *ritem, Feed *feed) /* Populate the ->deleted_items list so that we can check it when * adding each item. */ - ritem->deleted_items = rssyl_deleted_update(ritem); + rssyl_deleted_update(ritem); /* Parse each item in the feed, adding or updating existing items if * necessary */ @@ -223,7 +223,8 @@ gboolean rssyl_parse_feed(RFolderItem *ritem, Feed *feed) rssyl_expire_items(ritem, feed); } - rssyl_deleted_free(ritem->deleted_items); + /* Clean up ->deleted_items */ + rssyl_deleted_free(ritem); folder_item_scan(&ritem->item); folder_item_update_thaw(); diff --git a/src/plugins/rssyl/rssyl_update_feed.c b/src/plugins/rssyl/rssyl_update_feed.c @@ -291,7 +291,10 @@ gboolean rssyl_update_feed(RFolderItem *ritem, RSSylVerboseFlags verbose) /* Prune our deleted items list of items which are no longer in * upstream feed. */ + rssyl_deleted_update(ritem); rssyl_deleted_expire(ritem, ctx->feed); + rssyl_deleted_store(ritem); + rssyl_deleted_free(ritem); /* Clean up. */ success = ctx->success;