mirror of https://git.tukaani.org/xz.git
xz: Remember the filter chains and the largest Block in parse_block_list()
(cherry picked from commit 81d350dab8
)
This commit is contained in:
parent
d4e33e7392
commit
bfea691361
|
@ -92,6 +92,12 @@ parse_block_list(const char *str_const)
|
||||||
free(opt_block_list);
|
free(opt_block_list);
|
||||||
opt_block_list = xmalloc((count + 1) * sizeof(block_list_entry));
|
opt_block_list = xmalloc((count + 1) * sizeof(block_list_entry));
|
||||||
|
|
||||||
|
// Clear the bitmask of filter chains in use.
|
||||||
|
block_list_chain_mask = 0;
|
||||||
|
|
||||||
|
// Reset the largest Block size found in --block-list.
|
||||||
|
block_list_largest = 0;
|
||||||
|
|
||||||
for (size_t i = 0; i < count; ++i) {
|
for (size_t i = 0; i < count; ++i) {
|
||||||
// Locate the next comma and replace it with \0.
|
// Locate the next comma and replace it with \0.
|
||||||
char *p = strchr(str, ',');
|
char *p = strchr(str, ',');
|
||||||
|
@ -128,7 +134,11 @@ parse_block_list(const char *str_const)
|
||||||
|
|
||||||
const uint32_t filter_num = (uint32_t)(str[0] - '0');
|
const uint32_t filter_num = (uint32_t)(str[0] - '0');
|
||||||
opt_block_list[i].filters_index = filter_num;
|
opt_block_list[i].filters_index = filter_num;
|
||||||
|
block_list_chain_mask |= 1U << filter_num;
|
||||||
str += 2;
|
str += 2;
|
||||||
|
} else {
|
||||||
|
// This Block uses the default filter chain.
|
||||||
|
block_list_chain_mask |= 1U << 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (str[0] == '\0') {
|
if (str[0] == '\0') {
|
||||||
|
@ -152,6 +162,14 @@ parse_block_list(const char *str_const)
|
||||||
|
|
||||||
opt_block_list[i].size = UINT64_MAX;
|
opt_block_list[i].size = UINT64_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remember the largest Block size in the list.
|
||||||
|
//
|
||||||
|
// NOTE: Do this after handling the special value 0
|
||||||
|
// because when 0 is used, we don't want to reduce
|
||||||
|
// the Block size of the multithreaded encoder.
|
||||||
|
if (block_list_largest < opt_block_list[i].size)
|
||||||
|
block_list_largest = opt_block_list[i].size;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Be standards compliant: p + 1 is undefined behavior
|
// Be standards compliant: p + 1 is undefined behavior
|
||||||
|
|
|
@ -27,6 +27,8 @@ bool opt_auto_adjust = true;
|
||||||
bool opt_single_stream = false;
|
bool opt_single_stream = false;
|
||||||
uint64_t opt_block_size = 0;
|
uint64_t opt_block_size = 0;
|
||||||
block_list_entry *opt_block_list = NULL;
|
block_list_entry *opt_block_list = NULL;
|
||||||
|
uint64_t block_list_largest;
|
||||||
|
uint32_t block_list_chain_mask;
|
||||||
|
|
||||||
/// Stream used to communicate with liblzma
|
/// Stream used to communicate with liblzma
|
||||||
static lzma_stream strm = LZMA_STREAM_INIT;
|
static lzma_stream strm = LZMA_STREAM_INIT;
|
||||||
|
|
|
@ -65,6 +65,19 @@ extern uint64_t opt_block_size;
|
||||||
/// List of block size and filter chain pointer pairs.
|
/// List of block size and filter chain pointer pairs.
|
||||||
extern block_list_entry *opt_block_list;
|
extern block_list_entry *opt_block_list;
|
||||||
|
|
||||||
|
/// Size of the largest Block that was specified in --block-list.
|
||||||
|
/// This is used to limit the block_size option of multithreaded encoder.
|
||||||
|
/// It's waste of memory to specify a too large block_size and reducing
|
||||||
|
/// it might even allow using more threads in some cases.
|
||||||
|
///
|
||||||
|
/// NOTE: If the last entry in --block-list is the special value of 0
|
||||||
|
/// (which gets converted to UINT64_MAX), it counts here as UINT64_MAX too.
|
||||||
|
/// This way the multithreaded encoder's Block size won't be reduced.
|
||||||
|
extern uint64_t block_list_largest;
|
||||||
|
|
||||||
|
/// Bitmask indicating which filter chains we specified in --block-list.
|
||||||
|
extern uint32_t block_list_chain_mask;
|
||||||
|
|
||||||
/// Set the integrity check type used when compressing
|
/// Set the integrity check type used when compressing
|
||||||
extern void coder_set_check(lzma_check check);
|
extern void coder_set_check(lzma_check check);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue