diff --git a/src/xz/coder.c b/src/xz/coder.c index 9accecad..947b4721 100644 --- a/src/xz/coder.c +++ b/src/xz/coder.c @@ -195,15 +195,27 @@ coder_set_compression_settings(void) // Print the selected filter chain. message_filters_show(V_DEBUG, filters); - // Disable encoder threads when --flush-timeout is used because - // the threaded encoder doesn't support LZMA_SYNC_FLUSH. - // FIXME: When LZMA_SYNC_FLUSH is supported, this should be changed. - if (opt_mode == MODE_COMPRESS && opt_flush_timeout != 0 - && hardware_threads_get() > 1) { - message(V_WARNING, _("Switching to single-threaded mode " - "due to --flush-timeout=%" PRIu64), - opt_flush_timeout); - hardware_threads_set(1); + // The --flush-timeout option requires LZMA_SYNC_FLUSH support + // from the filter chain. Currently threaded encoder doesn't support + // LZMA_SYNC_FLUSH so single-threaded mode must be used. + if (opt_mode == MODE_COMPRESS && opt_flush_timeout != 0) { + for (size_t i = 0; i < filters_count; ++i) { + switch (filters[i].id) { + case LZMA_FILTER_LZMA2: + case LZMA_FILTER_DELTA: + break; + + default: + message_fatal(_("The filter chain is " + "incompatible with --flush-timeout")); + } + } + + if (hardware_threads_get() > 1) { + message(V_WARNING, _("Switching to single-threaded " + "mode due to --flush-timeout")); + hardware_threads_set(1); + } } // Get the memory usage. Note that if --format=raw was used,