X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fwrite.c;h=d985aafee2494b43eca7791cd72e8dd8b6ce9188;hp=3fc9451d0effab99d127ee7fcec704c43ff4f69f;hb=4a3cea03c478c289d3b779fe8f8b2f3bb8fbd275;hpb=f8698b9c814a62a117982701b9551f699553b2a4 diff --git a/src/write.c b/src/write.c index 3fc9451d..d985aafe 100644 --- a/src/write.c +++ b/src/write.c @@ -738,6 +738,29 @@ compressor_thread_proc(void *arg) } #endif /* ENABLE_MULTITHREADED_COMPRESSION */ +static void +do_write_streams_progress(union wimlib_progress_info *progress, + wimlib_progress_func_t progress_func, + uint64_t size_added) +{ + progress->write_streams.completed_bytes += size_added; + progress->write_streams.completed_streams++; + if (progress_func && + progress->write_streams.completed_bytes >= progress->write_streams._private) + { + progress_func(WIMLIB_PROGRESS_MSG_WRITE_STREAMS, + progress); + if (progress->write_streams._private == progress->write_streams.total_bytes) { + progress->write_streams._private = ~0; + } else { + progress->write_streams._private = + min(progress->write_streams.total_bytes, + progress->write_streams.completed_bytes + + progress->write_streams.total_bytes / 100); + } + } +} + static int do_write_stream_list(struct list_head *my_resources, FILE *out_fp, @@ -758,13 +781,10 @@ do_write_stream_list(struct list_head *my_resources, if (ret != 0) return ret; list_del(<e->staging_list); - progress->write_streams.completed_bytes += - wim_resource_size(lte); - progress->write_streams.completed_streams++; - if (progress_func) { - progress_func(WIMLIB_PROGRESS_MSG_WRITE_STREAMS, - progress); - } + + do_write_streams_progress(progress, + progress_func, + wim_resource_size(lte)); } return 0; } @@ -1159,14 +1179,8 @@ main_writer_thread_proc(struct list_head *stream_list, WIM_RESHDR_FLAG_COMPRESSED; } - progress->write_streams.completed_bytes += - wim_resource_size(cur_lte); - progress->write_streams.completed_streams++; - - if (progress_func) { - progress_func(WIMLIB_PROGRESS_MSG_WRITE_STREAMS, - progress); - } + do_write_streams_progress(progress, progress_func, + wim_resource_size(cur_lte)); FREE(cur_chunk_tab); cur_chunk_tab = NULL; @@ -1395,6 +1409,7 @@ write_stream_list(struct list_head *stream_list, FILE *out_fp, progress.write_streams.completed_streams = 0; progress.write_streams.num_threads = num_threads; progress.write_streams.compression_type = out_ctype; + progress.write_streams._private = 0; #ifdef ENABLE_MULTITHREADED_COMPRESSION if (total_compression_bytes >= 1000000 && num_threads != 1) @@ -1946,9 +1961,7 @@ overwrite_wim_inplace(WIMStruct *w, int write_flags, found_modified_image = false; for (int i = 0; i < w->hdr.image_count; i++) { - if (!found_modified_image) - found_modified_image = w->image_metadata[i].modified; - if (found_modified_image) { + if (w->image_metadata[i].modified) { select_wim_image(w, i + 1); ret = write_metadata_resource(w); if (ret != 0)