#include "dentry.h"
#include "lookup_table.h"
#include "xml.h"
-#include "lzx.h"
-#include "xpress.h"
-
#ifdef ENABLE_MULTITHREADED_COMPRESSION
# include <pthread.h>
/*
* 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.
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;
}
/*
}
#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,
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;
}
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;
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)
int ret;
struct list_head stream_list;
off_t old_wim_end;
- bool found_modified_image;
DEBUG("Overwriting `%"TS"' in-place", w->filename);
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)