summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Nicolas Pitre <nico@fluxnic.net>2010-04-12 16:50:35 -0400
committerLibravatar Junio C Hamano <gitster@pobox.com>2010-04-12 15:30:58 -0700
commit7734d7f2f6e57973bce3d7b2af815ac737f4637c (patch)
treeb5a76d4b17cb50903f46ccf1a592f124a3245048
parentindex-pack: rationalize unpack_entry_data() (diff)
downloadtgif-7734d7f2f6e57973bce3d7b2af815ac737f4637c.tar.xz
index-pack: smarter memory usage when appending objects
In the same spirit as commit 9892bebafe, let's avoid allocating the full buffer for the deflated data in write_compressed() in order to write it. Let's deflate and write the data in chunks instead to reduce memory usage. Signed-off-by: Nicolas Pitre <nico@fluxnic.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin-index-pack.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/builtin-index-pack.c b/builtin-index-pack.c
index 4308abb60e..7f32084575 100644
--- a/builtin-index-pack.c
+++ b/builtin-index-pack.c
@@ -669,25 +669,25 @@ static void parse_pack_objects(unsigned char *sha1)
static int write_compressed(struct sha1file *f, void *in, unsigned int size)
{
z_stream stream;
- unsigned long maxsize;
- void *out;
+ int status;
+ unsigned char outbuf[4096];
memset(&stream, 0, sizeof(stream));
deflateInit(&stream, zlib_compression_level);
- maxsize = deflateBound(&stream, size);
- out = xmalloc(maxsize);
-
- /* Compress it */
stream.next_in = in;
stream.avail_in = size;
- stream.next_out = out;
- stream.avail_out = maxsize;
- while (deflate(&stream, Z_FINISH) == Z_OK);
- deflateEnd(&stream);
+ do {
+ stream.next_out = outbuf;
+ stream.avail_out = sizeof(outbuf);
+ status = deflate(&stream, Z_FINISH);
+ sha1write(f, outbuf, sizeof(outbuf) - stream.avail_out);
+ } while (status == Z_OK);
+
+ if (status != Z_STREAM_END)
+ die("unable to deflate appended object (%d)", status);
size = stream.total_out;
- sha1write(f, out, size);
- free(out);
+ deflateEnd(&stream);
return size;
}