aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2013-10-02 20:05:23 +0300
committerLasse Collin <lasse.collin@tukaani.org>2013-10-02 20:05:23 +0300
commit0cd45fc2bc5537de287a0bc005e2d67467a92148 (patch)
tree022cc5609a62b5b0ce1738e69fcf69dd530c3bfd /src
parentliblzma: Add LZMA_FULL_BARRIER support to single-threaded encoder. (diff)
downloadxz-0cd45fc2bc5537de287a0bc005e2d67467a92148.tar.xz
liblzma: Support LZMA_FULL_FLUSH and _BARRIER in threaded encoder.
Now --block-list=SIZES works with in the threaded mode too, although the performance is still bad due to the use of LZMA_FULL_FLUSH instead of the new LZMA_FULL_BARRIER.
Diffstat (limited to 'src')
-rw-r--r--src/liblzma/common/stream_encoder_mt.c55
1 files changed, 39 insertions, 16 deletions
diff --git a/src/liblzma/common/stream_encoder_mt.c b/src/liblzma/common/stream_encoder_mt.c
index 23167d00..335110b3 100644
--- a/src/liblzma/common/stream_encoder_mt.c
+++ b/src/liblzma/common/stream_encoder_mt.c
@@ -726,13 +726,6 @@ stream_encode_mt(lzma_coder *coder, const lzma_allocator *allocator,
return ret;
}
- // Check if the last Block was finished.
- if (action == LZMA_FINISH
- && *in_pos == in_size
- && lzma_outq_is_empty(
- &coder->outq))
- break;
-
// Try to give uncompressed data to a worker thread.
ret = stream_encode_in(coder, allocator,
in, in_pos, in_size, action);
@@ -741,14 +734,44 @@ stream_encode_mt(lzma_coder *coder, const lzma_allocator *allocator,
return ret;
}
- // Return if
- // - we have used all the input and expect to
- // get more input; or
- // - the output buffer has been filled.
+ // See if we should wait or return.
//
- // TODO: Support flushing.
- if ((*in_pos == in_size && action != LZMA_FINISH)
- || *out_pos == out_size)
+ // TODO: LZMA_SYNC_FLUSH and LZMA_SYNC_BARRIER.
+ if (*in_pos == in_size) {
+ // LZMA_RUN: More data is probably coming
+ // so return to let the caller fill the
+ // input buffer.
+ if (action == LZMA_RUN)
+ return LZMA_OK;
+
+ // LZMA_FULL_BARRIER: The same as with
+ // LZMA_RUN but tell the caller that the
+ // barrier was completed.
+ if (action == LZMA_FULL_BARRIER)
+ return LZMA_STREAM_END;
+
+ // Finishing or flushing isn't completed until
+ // all input data has been encoded and copied
+ // to the output buffer.
+ if (lzma_outq_is_empty(&coder->outq)) {
+ // LZMA_FINISH: Continue to encode
+ // the Index field.
+ if (action == LZMA_FINISH)
+ break;
+
+ // LZMA_FULL_FLUSH: Return to tell
+ // the caller that flushing was
+ // completed.
+ if (action == LZMA_FULL_FLUSH)
+ return LZMA_STREAM_END;
+ }
+ }
+
+ // Return if there is no output space left.
+ // This check must be done after testing the input
+ // buffer, because we might want to use a different
+ // return code.
+ if (*out_pos == out_size)
return LZMA_OK;
// Neither in nor out has been used completely.
@@ -1045,8 +1068,8 @@ lzma_stream_encoder_mt(lzma_stream *strm, const lzma_mt *options)
strm->internal->supported_actions[LZMA_RUN] = true;
// strm->internal->supported_actions[LZMA_SYNC_FLUSH] = true;
-// strm->internal->supported_actions[LZMA_FULL_FLUSH] = true;
-// strm->internal->supported_actions[LZMA_FULL_BARRIER] = true;
+ strm->internal->supported_actions[LZMA_FULL_FLUSH] = true;
+ strm->internal->supported_actions[LZMA_FULL_BARRIER] = true;
strm->internal->supported_actions[LZMA_FINISH] = true;
return LZMA_OK;