From 93e9bfe3232fbcb3531acf07a870ed404c526f27 Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Sun, 13 Mar 2011 18:26:46 +0000 Subject: Shunt the schedule function definitions to desktop/schedule.h. Shunt the hlcache/llcache to using schedule to get their cleanups run. svn path=/trunk/netsurf/; revision=12029 --- content/fetchers/curl.c | 1 + content/hlcache.c | 52 ++++++++++++++++++++++++++++++------------------- content/hlcache.h | 9 +++++++++ content/llcache.c | 25 +++--------------------- content/llcache.h | 11 ++++++++--- 5 files changed, 53 insertions(+), 45 deletions(-) (limited to 'content') diff --git a/content/fetchers/curl.c b/content/fetchers/curl.c index 895dc4256..8140aa64e 100644 --- a/content/fetchers/curl.c +++ b/content/fetchers/curl.c @@ -44,6 +44,7 @@ #include "content/urldb.h" #include "desktop/netsurf.h" #include "desktop/options.h" +#include "desktop/schedule.h" #include "utils/log.h" #include "utils/messages.h" #include "utils/url.h" diff --git a/content/hlcache.c b/content/hlcache.c index b31b0d4d8..08848e0aa 100644 --- a/content/hlcache.c +++ b/content/hlcache.c @@ -26,6 +26,7 @@ #include "content/content.h" #include "content/hlcache.h" +#include "desktop/schedule.h" #include "utils/http.h" #include "utils/log.h" #include "utils/messages.h" @@ -74,7 +75,8 @@ static hlcache_entry *hlcache_content_list; /** Ring of retrieval contexts */ static hlcache_retrieval_ctx *hlcache_retrieval_ctx_ring; -static void hlcache_clean(void); +static void hlcache_clean(void *ignored); + static nserror hlcache_llcache_callback(llcache_handle *handle, const llcache_event *event, void *pw); static bool hlcache_type_is_acceptable(llcache_handle *llcache, @@ -88,13 +90,31 @@ static void hlcache_content_callback(struct content *c, * Public API * ******************************************************************************/ +nserror +hlcache_initialise(llcache_query_callback cb, void *pw) +{ + nserror ret = llcache_initialise(cb, pw); + + if (ret != NSERROR_OK) + return ret; + + /* Schedule the cache cleanup for 5 seconds time */ + schedule(500, hlcache_clean, NULL); + + return NSERROR_OK; +} + + /* See hlcache.h for documentation */ void hlcache_finalise(void) { uint32_t num_contents, prev_contents; hlcache_entry *entry; hlcache_retrieval_ctx *ctx, *next; - + + /* Remove the hlcache_clean schedule */ + schedule_remove(hlcache_clean, NULL); + /* Obtain initial count of contents remaining */ for (num_contents = 0, entry = hlcache_content_list; entry != NULL; entry = entry->next) { @@ -107,7 +127,7 @@ void hlcache_finalise(void) do { prev_contents = num_contents; - hlcache_clean(); + hlcache_clean(NULL); for (num_contents = 0, entry = hlcache_content_list; entry != NULL; entry = entry->next) { @@ -123,7 +143,7 @@ void hlcache_finalise(void) LOG((" %p : %s (%d users)", entry, content_get_url(&entry_handle), content_count_users(entry->content))); } else { - LOG((" %p", entry)); + LOG((" %p", entry)); } } @@ -155,23 +175,9 @@ void hlcache_finalise(void) /* See hlcache.h for documentation */ nserror hlcache_poll(void) { - static uint32_t last_clean_time; - uint32_t now; llcache_poll(); - /* Only attempt to clean the cache every 5 seconds */ -#define HLCACHE_CLEAN_INTERVAL_CS (500) - now = wallclock(); - - if (now > last_clean_time + HLCACHE_CLEAN_INTERVAL_CS) { - /* Give the cache a clean */ - hlcache_clean(); - - last_clean_time = now; - } -#undef HLCACHE_CLEAN_INTERVAL_CS - return NSERROR_OK; } @@ -368,7 +374,7 @@ nserror hlcache_handle_replace_callback(hlcache_handle *handle, /** * Attempt to clean the cache */ -void hlcache_clean(void) +void hlcache_clean(void *ignored) { hlcache_entry *entry, *next; @@ -407,6 +413,12 @@ void hlcache_clean(void) /* Destroy entry */ free(entry); } + + /* Attempt to clean the llcache */ + llcache_clean(); + + /* Re-schedule ourselves for 5 seconds time */ + schedule(500, hlcache_clean, NULL); } /** @@ -447,7 +459,7 @@ nserror hlcache_llcache_callback(llcache_handle *handle, llcache_handle_abort(handle); llcache_handle_release(handle); - free((char *) ctx->child.charset); + free((char *) ctx->child.charset); free(ctx); return error; } diff --git a/content/hlcache.h b/content/hlcache.h index 5ed37203d..6738fea53 100644 --- a/content/hlcache.h +++ b/content/hlcache.h @@ -63,6 +63,15 @@ enum hlcache_retrieve_flag { HLCACHE_RETRIEVE_MAY_DOWNLOAD = (1 << 31) }; +/** + * Initialise the high-level cache, preparing the llcache also. + * + * \param cb Query handler for llcache + * \param pw Pointer to llcache query handler data + * \return NSERROR_OK on success, appropriate error otherwise. + */ +nserror hlcache_initialise(llcache_query_callback cb, void *pw); + /** * Finalise the high-level cache, destroying any remaining contents */ diff --git a/content/llcache.c b/content/llcache.c index 1deb8cae9..893c505fb 100644 --- a/content/llcache.c +++ b/content/llcache.c @@ -193,8 +193,6 @@ static nserror llcache_object_notify_users(llcache_object *object); static nserror llcache_object_snapshot(llcache_object *object, llcache_object **snapshot); -static nserror llcache_clean(void); - static nserror llcache_post_data_clone(const llcache_post_data *orig, llcache_post_data **clone); @@ -307,8 +305,6 @@ void llcache_finalise(void) /* See llcache.h for documentation */ nserror llcache_poll(void) { - static uint32_t last_clean_time; - uint32_t now; llcache_object *object; fetch_poll(); @@ -324,18 +320,6 @@ nserror llcache_poll(void) llcache_object_notify_users(object); } - /* Only attempt to clean the cache every 5 seconds */ -#define LLCACHE_CLEAN_INTERVAL_CS (500) - now = wallclock(); - - if (now > last_clean_time + LLCACHE_CLEAN_INTERVAL_CS) { - /* Attempt to clean the cache */ - llcache_clean(); - - last_clean_time = now; - } -#undef LLCACHE_CLEAN_INTERVAL_CS - return NSERROR_OK; } @@ -1611,10 +1595,8 @@ nserror llcache_object_snapshot(llcache_object *object, /** * Attempt to clean the cache - * - * \return NSERROR_OK. */ -nserror llcache_clean(void) +void llcache_clean(void) { llcache_object *object, *next; uint32_t llcache_size = 0; @@ -1697,7 +1679,6 @@ nserror llcache_clean(void) LOG(("Size: %u", llcache_size)); #endif - return NSERROR_OK; } /** @@ -2241,8 +2222,8 @@ nserror llcache_fetch_split_header(const char *data, size_t len, char **name, * \return NSERROR_OK on success, appropriate error otherwise * * \note This function also has the side-effect of updating - * the cache control data for the object if an interesting - * header is encountered + * the cache control data for the object if an interesting + * header is encountered */ nserror llcache_fetch_parse_header(llcache_object *object, const char *data, size_t len, char **name, char **value) diff --git a/content/llcache.h b/content/llcache.h index d7958b056..215e6cc1a 100644 --- a/content/llcache.h +++ b/content/llcache.h @@ -166,14 +166,19 @@ nserror llcache_initialise(llcache_query_callback cb, void *pw); void llcache_finalise(void); /** - * Cause the low-level cache to emit any pending notifications - * and attempt to clean the cache. No guarantee is made about - * what, if any, cache cleaning will occur. + * Cause the low-level cache to emit any pending notifications. * * \return NSERROR_OK on success, appropriate error otherwise. */ nserror llcache_poll(void); +/** + * Cause the low-level cache to attempt to perform cleanup. No + * guarantees are made as to whether or not cleanups will take + * place and what, if any, space savings will be made. + */ +void llcache_clean(void); + /** * Retrieve a handle for a low-level cache object * -- cgit v1.2.3