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://git.librecmc.org/?a=commitdiff_plain;h=6be453fc63da9f87455b5e579cb686f95fa92102;p=oweals%2Ftinc.git 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 d37f220..3d3d691 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; }