diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2012-12-14 20:13:32 +0200 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2012-12-14 20:13:32 +0200 |
commit | e7b424d267a34803db8d92a3515528be2ed45abd (patch) | |
tree | 80da65be9f9c6b5488de6c1c24127738fad4bd3a /src/xz/message.c | |
parent | liblzma: Fix mythread_sync for nested locking. (diff) | |
download | xz-e7b424d267a34803db8d92a3515528be2ed45abd.tar.xz |
Make the progress indicator smooth in threaded mode.
This adds lzma_get_progress() to liblzma and takes advantage
of it in xz.
lzma_get_progress() collects progress information from
the thread-specific structures so that fairly accurate
progress information is available to applications. Adding
a new function seemed to be a better way than making the
information directly available in lzma_stream (like total_in
and total_out are) because collecting the information requires
locking mutexes. It's waste of time to do it more often than
the up to date information is actually needed by an application.
Diffstat (limited to '')
-rw-r--r-- | src/xz/message.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/xz/message.c b/src/xz/message.c index bc16aedb..abdf0568 100644 --- a/src/xz/message.c +++ b/src/xz/message.c @@ -526,20 +526,26 @@ progress_elapsed(void) } -/// Get information about position in the stream. This is currently simple, -/// but it will become more complicated once we have multithreading support. +/// Get how much uncompressed and compressed data has been processed. static void progress_pos(uint64_t *in_pos, uint64_t *compressed_pos, uint64_t *uncompressed_pos) { - *in_pos = progress_strm->total_in; + uint64_t out_pos; + lzma_get_progress(progress_strm, in_pos, &out_pos); + + // It cannot have processed more input than it has been given. + assert(*in_pos <= progress_strm->total_in); + + // It cannot have produced more output than it claims to have ready. + assert(out_pos >= progress_strm->total_out); if (opt_mode == MODE_COMPRESS) { - *compressed_pos = progress_strm->total_out; - *uncompressed_pos = progress_strm->total_in; + *compressed_pos = out_pos; + *uncompressed_pos = *in_pos; } else { - *compressed_pos = progress_strm->total_in; - *uncompressed_pos = progress_strm->total_out; + *compressed_pos = *in_pos; + *uncompressed_pos = out_pos; } return; |