From: Guus Sliepen Date: Sun, 18 Feb 2018 14:38:12 +0000 (+0100) Subject: Reduce memory allocations due to zlib's uncompress(). X-Git-Tag: release-1.1pre16~24 X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=commitdiff_plain;h=6be453fc63da9f87455b5e579cb686f95fa92102 Reduce memory allocations due to zlib's uncompress(). Everytime uncompress() is called, zlib allocates some buffer on the heap and frees it again. When compression is enabled, this is the biggest source of memory allocations in tinc. Instead of using this function, use inflate(), which can store its state in a z_stream variable, which avoids (re)allocating memory for every packet received. This issue was found thanks to heaptrack. --- diff --git a/src/net_packet.c b/src/net_packet.c index d37f2202..3d3d6913 100644 --- a/src/net_packet.c +++ b/src/net_packet.c @@ -23,6 +23,7 @@ #include "system.h" #ifdef HAVE_ZLIB +#define ZLIB_CONST #include #endif @@ -249,9 +250,22 @@ static length_t uncompress_packet(uint8_t *dest, const uint8_t *source, length_t #ifdef HAVE_ZLIB else { unsigned long destlen = MAXSIZE; + static z_stream stream; - if(uncompress(dest, &destlen, source, len) == Z_OK) { - return destlen; + if(stream.next_in) { + inflateReset(&stream); + } else { + inflateInit(&stream); + } + + stream.next_in = source; + stream.avail_in = len; + stream.next_out = dest; + stream.avail_out = destlen; + stream.total_out = 0; + + if(inflate(&stream, Z_FINISH) == Z_STREAM_END) { + return stream.total_out; } else { return -1; }