aboutsummaryrefslogtreecommitdiff
path: root/src/liblzma/rangecoder
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2008-12-31 00:30:49 +0200
committerLasse Collin <lasse.collin@tukaani.org>2008-12-31 00:30:49 +0200
commit7ed9d943b31d3ee9c5fb2387e84a241ba33afe90 (patch)
tree5f9107c718aa996be6850b431ba319584064c9d7 /src/liblzma/rangecoder
parentUse 28 MiB as memory usage limit for encoding in test_compress.sh. (diff)
downloadxz-7ed9d943b31d3ee9c5fb2387e84a241ba33afe90.tar.xz
Remove lzma_init() and other init functions from liblzma API.
Half of developers were already forgetting to use these functions, which could have caused total breakage in some future liblzma version or even now if --enable-small was used. Now liblzma uses pthread_once() to do the initializations unless it has been built with --disable-threads which make these initializations thread-unsafe. When --enable-small isn't used, liblzma currently gets needlessly linked against libpthread (on systems that have it). While it is stupid for now, liblzma will need threads in future anyway, so this stupidity will be temporary only. When --enable-small is used, different code CRC32 and CRC64 is now used than without --enable-small. This made the resulting binary slightly smaller, but the main reason was to clean it up and to handle the lack of lzma_init_check(). The pkg-config file lzma.pc was renamed to liblzma.pc. I'm not sure if it works correctly and portably for static linking (Libs.private includes -pthread or other operating system specific flags). Hopefully someone complains if it is bad. lzma_rc_prices[] is now included as a precomputed array even with --enable-small. It's just 128 bytes now that it uses uint8_t instead of uint32_t. Smaller array seemed to be at least as fast as the more bloated uint32_t array on x86; hopefully it's not bad on other architectures.
Diffstat (limited to 'src/liblzma/rangecoder')
-rw-r--r--src/liblzma/rangecoder/Makefile.am8
-rw-r--r--src/liblzma/rangecoder/price.h16
-rw-r--r--src/liblzma/rangecoder/price_table.c2
-rw-r--r--src/liblzma/rangecoder/price_table_init.c55
-rw-r--r--src/liblzma/rangecoder/price_tablegen.c51
5 files changed, 49 insertions, 83 deletions
diff --git a/src/liblzma/rangecoder/Makefile.am b/src/liblzma/rangecoder/Makefile.am
index b2e62d4a..a202e34e 100644
--- a/src/liblzma/rangecoder/Makefile.am
+++ b/src/liblzma/rangecoder/Makefile.am
@@ -24,12 +24,8 @@ librangecoder_la_CPPFLAGS = \
if COND_ENCODER_LZMA1
librangecoder_la_SOURCES += \
range_encoder.h \
- price.h
-if COND_SMALL
-librangecoder_la_SOURCES += price_table_init.c
-else
-librangecoder_la_SOURCES += price_table.c
-endif
+ price.h \
+ price_table.c
endif
if COND_DECODER_LZMA1
diff --git a/src/liblzma/rangecoder/price.h b/src/liblzma/rangecoder/price.h
index 001f753d..e336885c 100644
--- a/src/liblzma/rangecoder/price.h
+++ b/src/liblzma/rangecoder/price.h
@@ -28,20 +28,8 @@
#define RC_INFINITY_PRICE (UINT32_C(1) << 30)
-#if !defined(LZMA_RANGE_ENCODER_H) || defined(HAVE_SMALL)
-/// Probability prices used by *_get_price() macros. This is initialized
-/// by lzma_rc_init() and is not modified later.
-extern uint32_t lzma_rc_prices[RC_PRICE_TABLE_SIZE];
-
-/// Initializes lzma_rc_prices[]. This needs to be called only once.
-extern void lzma_rc_init(void);
-
-#else
-// Not building a size optimized version, so we use a precomputed
-// constant table.
-extern const uint32_t lzma_rc_prices[RC_PRICE_TABLE_SIZE];
-
-#endif
+/// Lookup table for the inline functions defined in this file.
+extern const uint8_t lzma_rc_prices[RC_PRICE_TABLE_SIZE];
static inline uint32_t
diff --git a/src/liblzma/rangecoder/price_table.c b/src/liblzma/rangecoder/price_table.c
index 539206b1..ac64bf62 100644
--- a/src/liblzma/rangecoder/price_table.c
+++ b/src/liblzma/rangecoder/price_table.c
@@ -2,7 +2,7 @@
#include "range_encoder.h"
-const uint32_t lzma_rc_prices[RC_PRICE_TABLE_SIZE] = {
+const uint8_t lzma_rc_prices[RC_PRICE_TABLE_SIZE] = {
128, 103, 91, 84, 78, 73, 69, 66,
63, 61, 58, 56, 54, 52, 51, 49,
48, 46, 45, 44, 43, 42, 41, 40,
diff --git a/src/liblzma/rangecoder/price_table_init.c b/src/liblzma/rangecoder/price_table_init.c
deleted file mode 100644
index 9c7d799b..00000000
--- a/src/liblzma/rangecoder/price_table_init.c
+++ /dev/null
@@ -1,55 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-//
-/// \file price_table_init.c
-/// \brief Static initializations for the range encoder's prices array
-//
-// Copyright (C) 1999-2006 Igor Pavlov
-// Copyright (C) 2007 Lasse Collin
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#ifdef HAVE_CONFIG_H
-# include "range_encoder.h"
-#endif
-
-
-uint32_t lzma_rc_prices[RC_PRICE_TABLE_SIZE];
-
-
-extern void
-lzma_rc_init(void)
-{
- for (uint32_t i = (UINT32_C(1) << RC_MOVE_REDUCING_BITS) / 2;
- i < RC_BIT_MODEL_TOTAL;
- i += (UINT32_C(1) << RC_MOVE_REDUCING_BITS)) {
- const uint32_t cycles_bits = RC_BIT_PRICE_SHIFT_BITS;
- uint32_t w = i;
- uint32_t bit_count = 0;
-
- for (uint32_t j = 0; j < cycles_bits; ++j) {
- w *= w;
- bit_count <<= 1;
-
- while (w >= (UINT32_C(1) << 16)) {
- w >>= 1;
- ++bit_count;
- }
- }
-
- lzma_rc_prices[i >> RC_MOVE_REDUCING_BITS]
- = (RC_BIT_MODEL_TOTAL_BITS << cycles_bits)
- - 15 - bit_count;
- }
-
- return;
-}
diff --git a/src/liblzma/rangecoder/price_tablegen.c b/src/liblzma/rangecoder/price_tablegen.c
index 68513635..4895ac76 100644
--- a/src/liblzma/rangecoder/price_tablegen.c
+++ b/src/liblzma/rangecoder/price_tablegen.c
@@ -19,23 +19,51 @@
//
///////////////////////////////////////////////////////////////////////////////
-#include <stddef.h>
#include <inttypes.h>
#include <stdio.h>
#include "range_common.h"
#include "price.h"
-#include "price_table_init.c"
-int
-main(void)
+static uint32_t rc_prices[RC_PRICE_TABLE_SIZE];
+
+
+static void
+init_price_table(void)
{
- lzma_rc_init();
+ for (uint32_t i = (UINT32_C(1) << RC_MOVE_REDUCING_BITS) / 2;
+ i < RC_BIT_MODEL_TOTAL;
+ i += (UINT32_C(1) << RC_MOVE_REDUCING_BITS)) {
+ const uint32_t cycles_bits = RC_BIT_PRICE_SHIFT_BITS;
+ uint32_t w = i;
+ uint32_t bit_count = 0;
+
+ for (uint32_t j = 0; j < cycles_bits; ++j) {
+ w *= w;
+ bit_count <<= 1;
+
+ while (w >= (UINT32_C(1) << 16)) {
+ w >>= 1;
+ ++bit_count;
+ }
+ }
+
+ rc_prices[i >> RC_MOVE_REDUCING_BITS]
+ = (RC_BIT_MODEL_TOTAL_BITS << cycles_bits)
+ - 15 - bit_count;
+ }
+
+ return;
+}
+
+static void
+print_price_table(void)
+{
printf("/* This file has been automatically generated by "
"price_tablegen.c. */\n\n"
"#include \"range_encoder.h\"\n\n"
- "const uint32_t lzma_rc_prices["
+ "const uint8_t lzma_rc_prices["
"RC_PRICE_TABLE_SIZE] = {");
const size_t array_size = sizeof(lzma_rc_prices)
@@ -44,7 +72,7 @@ main(void)
if (i % 8 == 0)
printf("\n\t");
- printf("%4" PRIu32, lzma_rc_prices[i]);
+ printf("%4" PRIu32, rc_prices[i]);
if (i != array_size - 1)
printf(",");
@@ -52,5 +80,14 @@ main(void)
printf("\n};\n");
+ return;
+}
+
+
+int
+main(void)
+{
+ init_price_table();
+ print_price_table();
return 0;
}