From 0cd45fc2bc5537de287a0bc005e2d67467a92148 Mon Sep 17 00:00:00 2001 From: Lasse Collin Date: Wed, 2 Oct 2013 20:05:23 +0300 Subject: [PATCH] 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. --- src/liblzma/common/stream_encoder_mt.c | 55 ++++++++++++++++++-------- 1 file 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;