]> wimlib.net Git - wimlib/blobdiff - src/write.c
WIM capture: Share inodes immediately
[wimlib] / src / write.c
index 3fc9451d0effab99d127ee7fcec704c43ff4f69f..e5dbbdf95c600f377a67f8af4bc96b70f61dc711 100644 (file)
@@ -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 <pthread.h>
@@ -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(&lte->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)