X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fwrite.c;h=e5dbbdf95c600f377a67f8af4bc96b70f61dc711;hp=3fc9451d0effab99d127ee7fcec704c43ff4f69f;hb=c6a1140e085f633273fcf47a6462bd9382ce118a;hpb=f8698b9c814a62a117982701b9551f699553b2a4 diff --git a/src/write.c b/src/write.c index 3fc9451d..e5dbbdf9 100644 --- a/src/write.c +++ b/src/write.c @@ -42,9 +42,6 @@ #include "dentry.h" #include "lookup_table.h" #include "xml.h" -#include "lzx.h" -#include "xpress.h" - #ifdef ENABLE_MULTITHREADED_COMPRESSION # include @@ -152,8 +149,9 @@ out: /* * compress_func_t- Pointer to a function to compresses a chunk - * of a WIM resource. This may be either xpress_compress() - * (xpress-compress.c) or lzx_compress() (lzx-compress.c). + * of a WIM resource. This may be either + * wimlib_xpress_compress() (xpress-compress.c) or + * wimlib_lzx_compress() (lzx-compress.c). * * @chunk: Uncompressed data of the chunk. * @chunk_size: Size of the uncompressed chunk, in bytes. @@ -179,9 +177,9 @@ compress_func_t get_compress_func(int out_ctype) { if (out_ctype == WIMLIB_COMPRESSION_TYPE_LZX) - return lzx_compress; + return wimlib_lzx_compress; else - return xpress_compress; + return wimlib_xpress_compress; } /* @@ -738,6 +736,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 +779,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 +1177,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 +1407,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) @@ -1873,7 +1886,6 @@ overwrite_wim_inplace(WIMStruct *w, int write_flags, int ret; struct list_head stream_list; off_t old_wim_end; - bool found_modified_image; DEBUG("Overwriting `%"TS"' in-place", w->filename); @@ -1944,11 +1956,8 @@ overwrite_wim_inplace(WIMStruct *w, int write_flags, DEBUG("No new streams were added"); } - 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)