aboutsummaryrefslogtreecommitdiffstats
path: root/src/util
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2017-03-13 10:14:35 +1100
committerTimothy Arceri <[email protected]>2017-03-15 11:15:11 +1100
commitfc5ec64ba3bb0e337127443a85e2a3f23abba34b (patch)
tree679c9ab49fd31f4f445e88e7b52bea0472730fd0 /src/util
parente2c4435b078a1471b044219552873a54b1817bac (diff)
util/disk_cache: add helpers for creating/destroying disk cache put jobs
V2: Make a copy of the data so we don't have to worry about it being freed before we are done compressing/writing. Reviewed-by: Grazvydas Ignotas <[email protected]>
Diffstat (limited to 'src/util')
-rw-r--r--src/util/disk_cache.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
index 19b593b76d4..ae2861d656e 100644
--- a/src/util/disk_cache.c
+++ b/src/util/disk_cache.c
@@ -78,6 +78,20 @@ struct disk_cache {
uint64_t max_size;
};
+struct disk_cache_put_job {
+ struct util_queue_fence fence;
+
+ struct disk_cache *cache;
+
+ cache_key key;
+
+ /* Copy of cache data to be compressed and written. */
+ void *data;
+
+ /* Size of data to be compressed and written. */
+ size_t size;
+};
+
/* Create a directory named 'path' if it does not already exist.
*
* Returns: 0 if path already exists as a directory or if created.
@@ -735,6 +749,32 @@ deflate_and_write_to_disk(const void *in_data, size_t in_data_size, int dest,
return compressed_size;
}
+static struct disk_cache_put_job *
+create_put_job(struct disk_cache *cache, const cache_key key,
+ const void *data, size_t size)
+{
+ struct disk_cache_put_job *dc_job = (struct disk_cache_put_job *)
+ malloc(sizeof(struct disk_cache_put_job) + size);
+
+ if (dc_job) {
+ dc_job->cache = cache;
+ memcpy(dc_job->key, key, sizeof(cache_key));
+ dc_job->data = dc_job + 1;
+ memcpy(dc_job->data, data, size);
+ dc_job->size = size;
+ }
+
+ return dc_job;
+}
+
+static void
+destroy_put_job(void *job, int thread_index)
+{
+ if (job) {
+ free(job);
+ }
+}
+
struct cache_entry_file_data {
uint32_t crc32;
uint32_t uncompressed_size;