Use a local temporary buffer for decompression instead of a global.
authorQuim Rovira <quim@rovira.cat>
Sun, 14 Aug 2016 09:08:20 +0000 (11:08 +0200)
committerQuim Rovira <quim@rovira.cat>
Sun, 14 Aug 2016 09:08:20 +0000 (11:08 +0200)
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

index 9eb25e257b3a52c4a2546f6719421e29c244dd22..4378e97f64e3b9ba6645df99ef7ae73dbd6a05a3 100644 (file)
--- a/Brotli.xs
+++ b/Brotli.xs
@@ -9,7 +9,6 @@
 #include <common/dictionary.h>
 
 #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
 
This page took 0.010466 seconds and 4 git commands to generate.