From 13f6237b67964594b689930281cbb8ee903097d4 Mon Sep 17 00:00:00 2001 From: Dave Vasilevsky Date: Sat, 22 Dec 2012 19:02:50 -0500 Subject: [PATCH] Don't pre-allocate blocks while compressing --- write.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/write.c b/write.c index 9a337e2..71ffe64 100644 --- a/write.c +++ b/write.c @@ -42,6 +42,8 @@ static void read_thread(); static void encode_thread(size_t thnum); static void *block_create(); static void block_free(void *data); +static void block_alloc(io_block_t *ib); +static void block_dealloc(io_block_t *ib); static void add_file(off_t offset, const char *name); @@ -178,6 +180,7 @@ static ssize_t tar_read(struct archive *ar, void *ref, const void **bufp) { if (!gReadItem) { queue_pop(gPipelineStartQ, (void**)&gReadItem); gReadBlock = (io_block_t*)(gReadItem->data); + block_alloc(gReadBlock); gReadBlock->insize = 0; debug("reader: reading %zu", gReadItemCount); } @@ -238,12 +241,25 @@ static void block_free(void *data) { static void *block_create() { io_block_t *ib = malloc(sizeof(io_block_t)); - if (!(ib->input = malloc(gBlockInSize)) - || !(ib->output = malloc(gBlockOutSize))) - die("Can't allocate blocks"); + ib->input = ib->output = NULL; return ib; } +static void block_alloc(io_block_t *ib) { + if (!ib->input) + ib->input = malloc(gBlockInSize); + if (!ib->output) + ib->output = malloc(gBlockOutSize); + if (!ib->input || !ib->output) + die("Can't allocate blocks"); +} + +static void block_dealloc(io_block_t *ib) { + free(ib->input); + free(ib->output); + ib->input = ib->output = NULL; +} + #pragma mark ENCODING @@ -338,6 +354,7 @@ static void write_block(pipeline_item_t *pi) { ib->block.uncompressed_size) != LZMA_OK) die("Error adding to index"); + block_dealloc(ib); debug("writer: writing %zu complete", pi->seq); }