diff options
author | Richard Purdie <rpurdie@rpsys.net> | 2006-06-22 17:47:34 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-22 18:05:58 -0400 |
commit | 4f3865fb57a04db7cca068fed1c15badc064a302 (patch) | |
tree | 4c923c72b6ac9b633c87cc73b55a75c7cfd0f044 /lib/zlib_inflate/inftrees.h | |
parent | 4f1bcaf094ccc512c23e10104c05a6f8e5b7a9e4 (diff) |
[PATCH] zlib_inflate: Upgrade library code to a recent version
Upgrade the zlib_inflate implementation in the kernel from a patched
version 1.1.3/4 to a patched 1.2.3.
The code in the kernel is about seven years old and I noticed that the
external zlib library's inflate performance was significantly faster (~50%)
than the code in the kernel on ARM (and faster again on x86_32).
For comparison the newer deflate code is 20% slower on ARM and 50% slower
on x86_32 but gives an approx 1% compression ratio improvement. I don't
consider this to be an improvement for kernel use so have no plans to
change the zlib_deflate code.
Various changes have been made to the zlib code in the kernel, the most
significant being the extra functions/flush option used by ppp_deflate.
This update reimplements the features PPP needs to ensure it continues to
work.
This code has been tested on ARM under both JFFS2 (with zlib compression
enabled) and ppp_deflate and on x86_32. JFFS2 sees an approx. 10% real
world file read speed improvement.
This patch also removes ZLIB_VERSION as it no longer has a correct value.
We don't need version checks anyway as the kernel's module handling will
take care of that for us. This removal is also more in keeping with the
zlib author's wishes (http://www.zlib.net/zlib_faq.html#faq24) and I've
added something to the zlib.h header to note its a modified version.
Signed-off-by: Richard Purdie <rpurdie@rpsys.net>
Acked-by: Joern Engel <joern@wh.fh-wedel.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'lib/zlib_inflate/inftrees.h')
-rw-r--r-- | lib/zlib_inflate/inftrees.h | 99 |
1 files changed, 45 insertions, 54 deletions
diff --git a/lib/zlib_inflate/inftrees.h b/lib/zlib_inflate/inftrees.h index e37705adc008..5f5219b1240e 100644 --- a/lib/zlib_inflate/inftrees.h +++ b/lib/zlib_inflate/inftrees.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* inftrees.h -- header to use inftrees.c | 1 | /* inftrees.h -- header to use inftrees.c |
2 | * Copyright (C) 1995-1998 Mark Adler | 2 | * Copyright (C) 1995-2005 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
6 | /* WARNING: this file should *not* be used by applications. It is | 6 | /* WARNING: this file should *not* be used by applications. It is |
@@ -8,57 +8,48 @@ | |||
8 | subject to change. Applications should only use zlib.h. | 8 | subject to change. Applications should only use zlib.h. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | /* Huffman code lookup table entry--this entry is four bytes for machines | 11 | /* Structure for decoding tables. Each entry provides either the |
12 | that have 16-bit pointers (e.g. PC's in the small or medium model). */ | 12 | information needed to do the operation requested by the code that |
13 | 13 | indexed that table entry, or it provides a pointer to another | |
14 | #ifndef _INFTREES_H | 14 | table that indexes more bits of the code. op indicates whether |
15 | #define _INFTREES_H | 15 | the entry is a pointer to another table, a literal, a length or |
16 | 16 | distance, an end-of-block, or an invalid code. For a table | |
17 | typedef struct inflate_huft_s inflate_huft; | 17 | pointer, the low four bits of op is the number of index bits of |
18 | 18 | that table. For a length or distance, the low four bits of op | |
19 | struct inflate_huft_s { | 19 | is the number of extra bits to get after the code. bits is |
20 | union { | 20 | the number of bits in this code or part of the code to drop off |
21 | struct { | 21 | of the bit buffer. val is the actual byte to output in the case |
22 | Byte Exop; /* number of extra bits or operation */ | 22 | of a literal, the base length or distance, or the offset from |
23 | Byte Bits; /* number of bits in this code or subcode */ | 23 | the current table to the next table. Each entry is four bytes. */ |
24 | } what; | 24 | typedef struct { |
25 | uInt pad; /* pad structure to a power of 2 (4 bytes for */ | 25 | unsigned char op; /* operation, extra bits, table bits */ |
26 | } word; /* 16-bit, 8 bytes for 32-bit int's) */ | 26 | unsigned char bits; /* bits in this part of the code */ |
27 | uInt base; /* literal, length base, distance base, | 27 | unsigned short val; /* offset in table or code value */ |
28 | or table offset */ | 28 | } code; |
29 | }; | 29 | |
30 | /* op values as set by inflate_table(): | ||
31 | 00000000 - literal | ||
32 | 0000tttt - table link, tttt != 0 is the number of table index bits | ||
33 | 0001eeee - length or distance, eeee is the number of extra bits | ||
34 | 01100000 - end of block | ||
35 | 01000000 - invalid code | ||
36 | */ | ||
30 | 37 | ||
31 | /* Maximum size of dynamic tree. The maximum found in a long but non- | 38 | /* Maximum size of dynamic tree. The maximum found in a long but non- |
32 | exhaustive search was 1004 huft structures (850 for length/literals | 39 | exhaustive search was 1444 code structures (852 for length/literals |
33 | and 154 for distances, the latter actually the result of an | 40 | and 592 for distances, the latter actually the result of an |
34 | exhaustive search). The actual maximum is not known, but the | 41 | exhaustive search). The true maximum is not known, but the value |
35 | value below is more than safe. */ | 42 | below is more than safe. */ |
36 | #define MANY 1440 | 43 | #define ENOUGH 2048 |
37 | 44 | #define MAXD 592 | |
38 | extern int zlib_inflate_trees_bits ( | 45 | |
39 | uInt *, /* 19 code lengths */ | 46 | /* Type of code to build for inftable() */ |
40 | uInt *, /* bits tree desired/actual depth */ | 47 | typedef enum { |
41 | inflate_huft **, /* bits tree result */ | 48 | CODES, |
42 | inflate_huft *, /* space for trees */ | 49 | LENS, |
43 | z_streamp); /* for messages */ | 50 | DISTS |
44 | 51 | } codetype; | |
45 | extern int zlib_inflate_trees_dynamic ( | 52 | |
46 | uInt, /* number of literal/length codes */ | 53 | extern int zlib_inflate_table (codetype type, unsigned short *lens, |
47 | uInt, /* number of distance codes */ | 54 | unsigned codes, code **table, |
48 | uInt *, /* that many (total) code lengths */ | 55 | unsigned *bits, unsigned short *work); |
49 | uInt *, /* literal desired/actual bit depth */ | ||
50 | uInt *, /* distance desired/actual bit depth */ | ||
51 | inflate_huft **, /* literal/length tree result */ | ||
52 | inflate_huft **, /* distance tree result */ | ||
53 | inflate_huft *, /* space for trees */ | ||
54 | z_streamp); /* for messages */ | ||
55 | |||
56 | extern int zlib_inflate_trees_fixed ( | ||
57 | uInt *, /* literal desired/actual bit depth */ | ||
58 | uInt *, /* distance desired/actual bit depth */ | ||
59 | inflate_huft **, /* literal/length tree result */ | ||
60 | inflate_huft **, /* distance tree result */ | ||
61 | inflate_huft *, /* space for trees */ | ||
62 | z_streamp); /* for memory allocation */ | ||
63 | |||
64 | #endif /* _INFTREES_H */ | ||