summaryrefslogtreecommitdiff
path: root/content/fs_backing_store.c
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2014-11-23 00:35:11 +0000
committerVincent Sanders <vince@kyllikki.org>2014-11-23 00:35:11 +0000
commit08c7ef6bed99a233aaf14c8e571f165075a55b90 (patch)
treef4ef6fdfa1307ecba9e68b005afeb691f7e0a62b /content/fs_backing_store.c
parent8b810ee4a100e805774246aa651e14385c377421 (diff)
downloadnetsurf-08c7ef6bed99a233aaf14c8e571f165075a55b90.tar.gz
netsurf-08c7ef6bed99a233aaf14c8e571f165075a55b90.tar.bz2
Do not use anonymous union as it is not portable
unnamed unions are not portable to old compilers. When reloading data ensure the heap allocation status is discarded.
Diffstat (limited to 'content/fs_backing_store.c')
-rw-r--r--content/fs_backing_store.c50
1 files changed, 37 insertions, 13 deletions
diff --git a/content/fs_backing_store.c b/content/fs_backing_store.c
index d743139ca..1c103e7e1 100644
--- a/content/fs_backing_store.c
+++ b/content/fs_backing_store.c
@@ -132,7 +132,7 @@ struct store_entry_element {
struct {
uint16_t block; /**< small object data block */
} small;
- };
+ } u;
uint8_t flags; /* extension flags */
};
@@ -765,8 +765,8 @@ set_store_entry(struct store_state *state,
/* store the data in the element */
elem->flags |= ENTRY_ELEM_FLAG_HEAP;
- elem->heap.data = data;
- elem->heap.ref = 1;
+ elem->u.heap.data = data;
+ elem->u.heap.ref = 1;
/* account for size of entry element */
state->total_alloc -= elem->size;
@@ -870,13 +870,36 @@ build_entrymap(struct store_state *state)
/* account for the storage space */
state->total_alloc += state->entries[eloop].elem[ENTRY_ELEM_DATA].size;
state->total_alloc += state->entries[eloop].elem[ENTRY_ELEM_META].size;
+ /* ensure entry does not have any allocation state */
+ state->entries[eloop].elem[ENTRY_ELEM_DATA].flags &= ~(ENTRY_ELEM_FLAG_HEAP | ENTRY_ELEM_FLAG_MMAP);
+ state->entries[eloop].elem[ENTRY_ELEM_META].flags &= ~(ENTRY_ELEM_FLAG_HEAP | ENTRY_ELEM_FLAG_MMAP);
}
return NSERROR_OK;
}
+/**
+ * Unlink entries file
+ *
+ * @param state The backing store state.
+ * @return NSERROR_OK on sucess or error code on faliure.
+ */
+static nserror
+unlink_entries(struct store_state *state)
+{
+ char *fname = NULL;
+ nserror ret;
+
+ ret = netsurf_mkpath(&fname, NULL, 2, state->path, ENTRIES_FNAME);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+ unlink(fname);
+ free(fname);
+ return NSERROR_OK;
+}
/**
* Read description entries into memory.
@@ -1148,6 +1171,7 @@ initialise(const struct llcache_store_parameters *parameters)
LOG(("read control failed %s", messages_get_errorcode(ret)));
ret = write_control(newstate);
if (ret == NSERROR_OK) {
+ unlink_entries(newstate);
write_cache_tag(newstate);
}
}
@@ -1283,10 +1307,10 @@ store(nsurl *url,
static nserror entry_release_alloc(struct store_entry_element *elem)
{
if ((elem->flags & ENTRY_ELEM_FLAG_HEAP) != 0) {
- elem->heap.ref--;
- if (elem->heap.ref == 0) {
- LOG(("freeing %p", elem->heap.data));
- free(elem->heap.data);
+ elem->u.heap.ref--;
+ if (elem->u.heap.ref == 0) {
+ LOG(("freeing %p", elem->u.heap.data));
+ free(elem->u.heap.data);
elem->flags &= ~ENTRY_ELEM_FLAG_HEAP;
}
}
@@ -1355,10 +1379,10 @@ fetch(nsurl *url,
/* a heap allocation already exists. Return
* that allocation and bump our ref count.
*/
- data = elem->heap.data;
- elem->heap.ref++;
+ data = elem->u.heap.data;
+ elem->u.heap.ref++;
datalen = elem->size;
- LOG(("Using existing heap allocation %p", elem->heap.data));
+ LOG(("Using existing heap allocation %p", elem->u.heap.data));
} else {
datalen = elem->size;
data = malloc(elem->size);
@@ -1369,9 +1393,9 @@ fetch(nsurl *url,
/* store allocated buffer so track ownership */
elem->flags |= ENTRY_ELEM_FLAG_HEAP;
- elem->heap.data = data;
- elem->heap.ref = 1;
- LOG(("Creating new heap allocation %p", elem->heap.data));
+ elem->u.heap.data = data;
+ elem->u.heap.ref = 1;
+ LOG(("Creating new heap allocation %p", elem->u.heap.data));
}
} else if (datalen == 0) {
/* caller provided a buffer but no length bad parameter */