From 4c532e2a9f1a40e1c1a6ed44a50025cfbfab6e4f Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Tue, 24 Jun 2014 20:46:03 -0500 Subject: [PATCH] Use completed_streams and total_streams in extract progress --- include/wimlib.h | 7 ++++--- include/wimlib/apply.h | 1 + src/extract.c | 9 ++++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/include/wimlib.h b/include/wimlib.h index f56e72cf..9c043c1b 100644 --- a/include/wimlib.h +++ b/include/wimlib.h @@ -895,10 +895,11 @@ union wimlib_progress_info { * potentially multiple streams per file (named data streams). * A "stream" may be the default contents of a file, a named * data stream, or a reparse data buffer. */ - uint64_t num_streams; + uint64_t total_streams; - /** Reserved. */ - const wimlib_tchar *reserved_2; + /** Number of (not necessarily unique) streams that have been + * extracted so far. */ + uint64_t completed_streams; /** Currently only used for * ::WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN. */ diff --git a/include/wimlib/apply.h b/include/wimlib/apply.h index 9f5f86bd..2f3b1cb9 100644 --- a/include/wimlib/apply.h +++ b/include/wimlib/apply.h @@ -67,6 +67,7 @@ struct apply_ctx { struct list_head stream_list; const struct read_stream_list_callbacks *saved_cbs; struct wim_lookup_table_entry *cur_stream; + u64 cur_stream_offset; struct filedes tmpfile_fd; tchar *tmpfile_name; }; diff --git a/src/extract.c b/src/extract.c index bbd0a5ed..0663edd7 100644 --- a/src/extract.c +++ b/src/extract.c @@ -311,6 +311,7 @@ begin_extract_stream_wrapper(struct wim_lookup_table_entry *lte, void *_ctx) struct apply_ctx *ctx = _ctx; ctx->cur_stream = lte; + ctx->cur_stream_offset = 0; if (unlikely(lte->out_refcnt > MAX_OPEN_STREAMS)) return create_temporary_file(&ctx->tmpfile_fd, &ctx->tmpfile_name); @@ -325,9 +326,13 @@ extract_chunk_wrapper(const void *chunk, size_t size, void *_ctx) union wimlib_progress_info *progress = &ctx->progress; int ret; + ctx->cur_stream_offset += size; + if (likely(ctx->supported_features.hard_links)) { progress->extract.completed_bytes += (u64)size * ctx->cur_stream->out_refcnt; + if (ctx->cur_stream_offset == ctx->cur_stream->size) + progress->extract.completed_streams += ctx->cur_stream->out_refcnt; } else { const struct stream_owner *owners = stream_owners(ctx->cur_stream); for (u32 i = 0; i < ctx->cur_stream->out_refcnt; i++) { @@ -339,6 +344,8 @@ extract_chunk_wrapper(const void *chunk, size_t size, void *_ctx) d_extraction_alias_node) { progress->extract.completed_bytes += size; + if (ctx->cur_stream_offset == ctx->cur_stream->size) + progress->extract.completed_streams++; } } } @@ -961,7 +968,7 @@ ref_stream(struct wim_lookup_table_entry *lte, u32 stream_idx, return 0; ctx->progress.extract.total_bytes += lte->size; - ctx->progress.extract.num_streams++; + ctx->progress.extract.total_streams++; if (inode->i_visited) return 0; -- 2.43.0