--- Compress-LZF/LZF.xs 2013/08/25 18:13:26 1.31 +++ Compress-LZF/LZF.xs 2015/06/27 19:52:44 1.32 @@ -2,6 +2,8 @@ #include "perl.h" #include "XSUB.h" +#include "perlmulticore.h" + #define LZF_STANDALONE 1 #define LZF_STATE_ARG 1 @@ -60,20 +62,20 @@ dst[skip++] = (( usize >> 6) | 0xc0); dst[skip++] = (( usize & 0x3f) | 0x80); } - else if (usize <= 0xffff) + else if (usize <= 0xffff) { dst[skip++] = (( usize >> 12) | 0xe0); dst[skip++] = (((usize >> 6) & 0x3f) | 0x80); dst[skip++] = (( usize & 0x3f) | 0x80); } - else if (usize <= 0x1fffff) + else if (usize <= 0x1fffff) { dst[skip++] = (( usize >> 18) | 0xf0); dst[skip++] = (((usize >> 12) & 0x3f) | 0x80); dst[skip++] = (((usize >> 6) & 0x3f) | 0x80); dst[skip++] = (( usize & 0x3f) | 0x80); } - else if (usize <= 0x3ffffff) + else if (usize <= 0x3ffffff) { dst[skip++] = (( usize >> 24) | 0xf8); dst[skip++] = (((usize >> 18) & 0x3f) | 0x80); @@ -81,7 +83,7 @@ dst[skip++] = (((usize >> 6) & 0x3f) | 0x80); dst[skip++] = (( usize & 0x3f) | 0x80); } - else if (usize <= 0x7fffffff) + else if (usize <= 0x7fffffff) { dst[skip++] = (( usize >> 30) | 0xfc); dst[skip++] = (((usize >> 24) & 0x3f) | 0x80); @@ -97,10 +99,12 @@ if (!state) croak ("Compress::LZF unable to allocate memory for compression state"); + if (usize > 1000) perlinterp_release (); /* 11 bytes is the smallest compressible string */ csize = usize < 11 ? 0 : (best ? lzf_compress_best (src, usize, dst + skip, usize - skip) : lzf_compress (src, usize, dst + skip, usize - skip, *state)); + if (usize > 1000) perlinterp_acquire (); Safefree (state); @@ -138,6 +142,7 @@ { void *dst; SV *ret; + int res; csize -= skip; @@ -193,12 +198,16 @@ if (!usize) croak ("compressed data corrupted (invalid length)"); - + ret = NEWSV (0, usize); SvPOK_only (ret); dst = SvPVX (ret); - if (lzf_decompress (src, csize, dst, usize) != usize) + if (usize > 2000) perlinterp_release (); + res = lzf_decompress (src, csize, dst, usize) != usize; + if (usize > 2000) perlinterp_acquire (); + + if (res) { SvREFCNT_dec (ret); croak ("compressed data corrupted (size mismatch)", csize, skip, usize); @@ -456,7 +465,7 @@ else SETs (sv_2mortal (newSVsv (TOPs))); - break; + break; default: croak ("Compress::LZF::sthaw(): invalid data, maybe you need a newer version of Compress::LZF?");