From: Nicolas Pitre Date: Mon, 12 Apr 2010 20:50:35 +0000 (-0400) Subject: index-pack: smarter memory usage when appending objects X-Git-Tag: v1.7.2-rc0~120^2 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=7734d7f2f6e57973bce3d7b2af815ac737f4637c;p=git.git 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 Signed-off-by: Junio C Hamano --- diff --git a/builtin-index-pack.c b/builtin-index-pack.c index 4308abb60..7f3208457 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; }