summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/llcache.c53
1 files changed, 34 insertions, 19 deletions
diff --git a/content/llcache.c b/content/llcache.c
index c786ad02d..e97beb97e 100644
--- a/content/llcache.c
+++ b/content/llcache.c
@@ -2301,11 +2301,16 @@ build_candidate_list(struct llcache_object ***lst_out, int *lst_len_out)
* \return NSERROR_OK on success or appropriate error code.
*/
static nserror
-write_backing_store(struct llcache_object *object, size_t *written_out)
+write_backing_store(struct llcache_object *object, size_t *written_out, unsigned long *elapsed)
{
nserror ret;
uint8_t *metadata;
size_t metadatasize;
+ struct timeval start_tv;
+ struct timeval end_tv;
+ struct timeval elapsed_tv;
+
+ gettimeofday(&start_tv, NULL);
/* put object data in backing store */
ret = guit->llcache->store(object->url,
@@ -2338,10 +2343,16 @@ write_backing_store(struct llcache_object *object, size_t *written_out)
guit->llcache->invalidate(object->url);
return ret;
}
+ gettimeofday(&end_tv, NULL);
+
+ timersub(&end_tv, &start_tv, &elapsed_tv);
+
object->store_state = LLCACHE_STATE_DISC;
*written_out = object->source_len + metadatasize;
+ *elapsed = (elapsed_tv.tv_sec * 1000) + (elapsed_tv.tv_usec / 1000);
+
return NSERROR_OK;
}
@@ -2358,30 +2369,34 @@ static void llcache_persist(void *p)
struct llcache_object **lst;
int lst_count;
int idx;
+ unsigned long total_elapsed = 0;
+ unsigned long elapsed;
ret = build_candidate_list(&lst, &lst_count);
- if (ret == NSERROR_OK) {
- /* obtained a candidate list, make each object
- * persistant in turn
- */
- for (idx = 0; idx < lst_count; idx++) {
- ret = write_backing_store(lst[idx], &size_written);
- if (ret != NSERROR_OK) {
- break;
- }
- total_written += size_written;
+ if (ret != NSERROR_OK) {
+ LOG(("Unable to construct candidate list for persisatnt writeout"));
+ return;
+ }
- if (total_written > llcache->bandwidth) {
- /* The bandwidth limit has been reached.
- * Writeout scheduled for the remaining objects
- */
- guit->browser->schedule(1000, llcache_persist, NULL);
- break;
- }
+ /* obtained a candidate list, make each object persistant in turn */
+ for (idx = 0; idx < lst_count; idx++) {
+ ret = write_backing_store(lst[idx], &size_written, &elapsed);
+ if (ret != NSERROR_OK) {
+ break;
}
+ total_written += size_written;
+ total_elapsed += elapsed;
- free(lst);
+ if (total_written > llcache->bandwidth) {
+ /* The bandwidth limit has been reached.
+ * Writeout scheduled for the remaining objects
+ */
+ guit->browser->schedule(1000, llcache_persist, NULL);
+ break;
+ }
}
+
+ free(lst);
}