/** * Attempt to clean the cache */ static void hlcache_clean(void *ignored) { hlcache_entry *entry, *next; for (entry = hlcache->content_list; entry != NULL; entry = next) { next = entry->next; if (entry->content == NULL) continue; if (content__get_status(entry->content) == CONTENT_STATUS_LOADING) continue; if (content_count_users(entry->content) != 0) continue; /** \todo This is over-zealous: all unused contents * will be immediately destroyed. Ideally, we want to * purge all unused contents that are using stale * source data, and enough fresh contents such that * the cache fits in the configured cache size limit. */ /* Remove entry from cache */ if (entry->prev == NULL) hlcache->content_list = entry->next; else entry->prev->next = entry->next; if (entry->next != NULL) entry->next->prev = entry->prev; /* Destroy content */ content_destroy(entry->content); /* Destroy entry */ free(entry); } /* Attempt to clean the llcache */ llcache_clean(); /* Re-schedule ourselves */ guit->browser->schedule(hlcache->params.bg_clean_time, hlcache_clean, NULL); }
/* exported interface documented in content/content.h */ content_status content_get_status(hlcache_handle *h) { return content__get_status(hlcache_handle_get_content(h)); }