From 261eae0ae1af69612e6952c0dc35f1aed7670192 Mon Sep 17 00:00:00 2001 From: Quim Rovira Date: Sun, 14 Aug 2016 11:08:20 +0200 Subject: [PATCH] Use a local temporary buffer for decompression instead of a global. Allocating the temporary buffer on each call to decompress might be slightly less efficient, but that would mostly impact streaming decompression with very small blocks. Not even sure this change is really worth doing.. it could use some benchmarking to see if it really makes sense. --- Brotli.xs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Brotli.xs b/Brotli.xs index 9eb25e2..4378e97 100644 --- a/Brotli.xs +++ b/Brotli.xs @@ -9,7 +9,6 @@ #include #define BUFFER_SIZE 1048576 -static uint8_t buffer[BUFFER_SIZE]; /* It's almost 2016, is anyone still using ithreads? */ MODULE = IO::Compress::Brotli PACKAGE = IO::Uncompress::Brotli PROTOTYPES: ENABLE @@ -50,11 +49,12 @@ SV* BrotliDecoderDecompressStream(state, in) SV* state SV* in PREINIT: - uint8_t *next_in, *next_out; + uint8_t *next_in, *next_out, *buffer; size_t available_in, available_out; BrotliDecoderResult result; CODE: next_in = (uint8_t*) SvPV(in, available_in); + Newx(buffer, BUFFER_SIZE, uint8_t); RETVAL = newSVpv("", 0); result = BROTLI_RESULT_NEEDS_MORE_OUTPUT; while(result == BROTLI_RESULT_NEEDS_MORE_OUTPUT) { @@ -67,10 +67,12 @@ SV* BrotliDecoderDecompressStream(state, in) &next_out, NULL ); if(!result){ - croak("Error in BrotliDecoderDecompressStream"); + Safefree(buffer); + croak("Error in BrotliDecoderDecompressStream"); } sv_catpvn(RETVAL, (const char*)buffer, BUFFER_SIZE-available_out); } + Safefree(buffer); OUTPUT: RETVAL -- 2.30.2