diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-01-31 17:19:59 +0100 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-01-31 17:19:59 +0100 |
| commit | f21ebeece53687b17d64fa444ceb3648439f5a8a (patch) | |
| tree | bcc41395fbe386a8ed0c8a88983974ae40f10068 | |
| parent | ba63d70e2d3a24670813dc33fca4450a25b281b6 (diff) | |
| download | busybox-w32-f21ebeece53687b17d64fa444ceb3648439f5a8a.tar.gz busybox-w32-f21ebeece53687b17d64fa444ceb3648439f5a8a.tar.bz2 busybox-w32-f21ebeece53687b17d64fa444ceb3648439f5a8a.zip | |
gzip: flush output buffer after stored blocks, they are not 32-bit aligned
function old new delta
flush_block 665 671 +6
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | archival/gzip.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/archival/gzip.c b/archival/gzip.c index 6083cde88..7df38c2bc 100644 --- a/archival/gzip.c +++ b/archival/gzip.c | |||
| @@ -486,19 +486,26 @@ static void put_16bit(ush w) | |||
| 486 | #define OPTIMIZED_PUT_32BIT (CONFIG_GZIP_FAST > 0 && BB_UNALIGNED_MEMACCESS_OK && BB_LITTLE_ENDIAN) | 486 | #define OPTIMIZED_PUT_32BIT (CONFIG_GZIP_FAST > 0 && BB_UNALIGNED_MEMACCESS_OK && BB_LITTLE_ENDIAN) |
| 487 | static void put_32bit(ulg n) | 487 | static void put_32bit(ulg n) |
| 488 | { | 488 | { |
| 489 | #if OPTIMIZED_PUT_32BIT | 489 | if (OPTIMIZED_PUT_32BIT) { |
| 490 | unsigned outcnt = G1.outcnt; | 490 | unsigned outcnt = G1.outcnt; |
| 491 | if (outcnt < OUTBUFSIZ-4) { | 491 | if (outcnt < OUTBUFSIZ-4) { |
| 492 | /* Common case */ | 492 | /* Common case */ |
| 493 | ulg *dst32 = (void*) &G1.outbuf[outcnt]; | 493 | ulg *dst32 = (void*) &G1.outbuf[outcnt]; |
| 494 | *dst32 = n; /* unaligned LSB 32-bit store */ | 494 | *dst32 = n; /* unaligned LSB 32-bit store */ |
| 495 | G1.outcnt = outcnt + 4; | 495 | //bb_error_msg("%p", dst32); // store alignment debugging |
| 496 | return; | 496 | G1.outcnt = outcnt + 4; |
| 497 | return; | ||
| 498 | } | ||
| 497 | } | 499 | } |
| 498 | #endif | ||
| 499 | put_16bit(n); | 500 | put_16bit(n); |
| 500 | put_16bit(n >> 16); | 501 | put_16bit(n >> 16); |
| 501 | } | 502 | } |
| 503 | static ALWAYS_INLINE void flush_outbuf_if_32bit_optimized(void) | ||
| 504 | { | ||
| 505 | /* If put_32bit() performs 32bit stores && it is used in send_bits() */ | ||
| 506 | if (OPTIMIZED_PUT_32BIT && BUF_SIZE > 16) | ||
| 507 | flush_outbuf(); | ||
| 508 | } | ||
| 502 | 509 | ||
| 503 | /* =========================================================================== | 510 | /* =========================================================================== |
| 504 | * Run a set of bytes through the crc shift register. If s is a NULL | 511 | * Run a set of bytes through the crc shift register. If s is a NULL |
| @@ -626,6 +633,8 @@ static void copy_block(char *buf, unsigned len, int header) | |||
| 626 | while (len--) { | 633 | while (len--) { |
| 627 | put_8bit(*buf++); | 634 | put_8bit(*buf++); |
| 628 | } | 635 | } |
| 636 | /* The above can 32-bit misalign outbuf */ | ||
| 637 | flush_outbuf_if_32bit_optimized(); | ||
| 629 | } | 638 | } |
| 630 | 639 | ||
| 631 | 640 | ||
| @@ -2110,12 +2119,8 @@ static void zip(void) | |||
| 2110 | 2119 | ||
| 2111 | put_16bit(deflate_flags | 0x300); /* extra flags. OS id = 3 (Unix) */ | 2120 | put_16bit(deflate_flags | 0x300); /* extra flags. OS id = 3 (Unix) */ |
| 2112 | 2121 | ||
| 2113 | #if OPTIMIZED_PUT_32BIT | 2122 | /* The above 32-bit misaligns outbuf (10 bytes are stored), flush it */ |
| 2114 | /* put_32bit() performs 32bit stores. If we use it in send_bits()... */ | 2123 | flush_outbuf_if_32bit_optimized(); |
| 2115 | if (BUF_SIZE > 16) | ||
| 2116 | /* then all stores are misaligned, unless we flush the buffer now */ | ||
| 2117 | flush_outbuf(); | ||
| 2118 | #endif | ||
| 2119 | 2124 | ||
| 2120 | deflate(); | 2125 | deflate(); |
| 2121 | 2126 | ||
