diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2012-07-03 21:16:39 +0300 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2012-07-03 21:16:39 +0300 |
commit | 88ccf47205d7f3aa314d358c72ef214f10f68b43 (patch) | |
tree | 9dc89c76bfad5f94d68e1fc80c838602d4271323 /src/xz/coder.c | |
parent | xz: Update the man page about the new field in --robot -lvv. (diff) | |
download | xz-88ccf47205d7f3aa314d358c72ef214f10f68b43.tar.xz |
xz: Add incomplete support for --block-list.
It's broken with threads and when also --block-size is used.
Diffstat (limited to 'src/xz/coder.c')
-rw-r--r-- | src/xz/coder.c | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/src/xz/coder.c b/src/xz/coder.c index 2ed88cdb..a98be97f 100644 --- a/src/xz/coder.c +++ b/src/xz/coder.c @@ -26,6 +26,7 @@ enum format_type opt_format = FORMAT_AUTO; bool opt_auto_adjust = true; bool opt_single_stream = false; uint64_t opt_block_size = 0; +uint64_t *opt_block_list = NULL; /// Stream used to communicate with liblzma @@ -522,15 +523,36 @@ coder_normal(file_pair *pair) // Assume that something goes wrong. bool success = false; - // block_remaining indicates how many input bytes to encode until + // block_remaining indicates how many input bytes to encode before // finishing the current .xz Block. The Block size is set with - // --block-size=SIZE. It has an effect only when compressing - // to the .xz format. If block_remaining == UINT64_MAX, only - // a single block is created. + // --block-size=SIZE and --block-list. They have an effect only when + // compressing to the .xz format. If block_remaining == UINT64_MAX, + // only a single block is created. uint64_t block_remaining = UINT64_MAX; - if (hardware_threads_get() == 1 && opt_mode == MODE_COMPRESS - && opt_format == FORMAT_XZ && opt_block_size > 0) - block_remaining = opt_block_size; + + // Position in opt_block_list. Unused if --block-list wasn't used. + size_t list_pos = 0; + + // Handle --block-size for single-threaded mode and the first step + // of --block-list. + if (opt_mode == MODE_COMPRESS && opt_format == FORMAT_XZ) { + // --block-size doesn't do anything here in threaded mode, + // because the threaded encoder will take care of splitting + // to fixed-sized Blocks. + if (hardware_threads_get() == 1 && opt_block_size > 0) + block_remaining = opt_block_size; + + // If --block-list was used, start with the first size. + // + // FIXME: Currently this overrides --block-size but this isn't + // good. For threaded case, we want --block-size to specify + // how big Blocks the encoder needs to be prepared to create + // at maximum and --block-list will simultaneously cause new + // Blocks to be started at specified intervals. To keep things + // logical, the same should be done in single-threaded mode. + if (opt_block_list != NULL) + block_remaining = opt_block_list[list_pos]; + } strm.next_out = out_buf.u8; strm.avail_out = IO_BUFFER_SIZE; @@ -575,7 +597,17 @@ coder_normal(file_pair *pair) if (ret == LZMA_STREAM_END && action == LZMA_FULL_FLUSH) { // Start a new Block. action = LZMA_RUN; - block_remaining = opt_block_size; + + if (opt_block_list == NULL) { + block_remaining = opt_block_size; + } else { + // FIXME: Make it work together with + // --block-size. + if (opt_block_list[list_pos + 1] != 0) + ++list_pos; + + block_remaining = opt_block_list[list_pos]; + } } else if (ret != LZMA_OK) { // Determine if the return value indicates that we |