]> granicus.if.org Git - xz/commitdiff
xz: Check for filter chain compatibility for --flush-timeout.
authorLasse Collin <lasse.collin@tukaani.org>
Wed, 18 Jun 2014 16:11:52 +0000 (19:11 +0300)
committerLasse Collin <lasse.collin@tukaani.org>
Wed, 18 Jun 2014 16:11:52 +0000 (19:11 +0300)
This avoids LZMA_PROG_ERROR from lzma_code() with filter chains
that don't support LZMA_SYNC_FLUSH.

src/xz/coder.c

index 9accecad0eb8b38d6726e2433297da0c4eea7688..947b47211a4a1ad80e6594e1a84fcee3fe215d1d 100644 (file)
@@ -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,