Simplify merging/unmerging of lookup tables when handling split WIMs
authorEric Biggers <ebiggers3@gmail.com>
Tue, 14 May 2013 03:54:38 +0000 (22:54 -0500)
committerEric Biggers <ebiggers3@gmail.com>
Tue, 14 May 2013 03:54:38 +0000 (22:54 -0500)
src/export_image.c
src/extract_image.c
src/join.c
src/mount_image.c
src/wimlib_internal.h

index c5c85d5f77f401070693ed42f8016c6e0b37b162..a948ab79a528b69a0ff926398434b3f05d888370 100644 (file)
@@ -103,7 +103,6 @@ wimlib_export_image(WIMStruct *src_wim,
                    wimlib_progress_func_t progress_func)
 {
        int ret;
-       struct wim_lookup_table *joined_tab, *src_wim_tab_save;
        struct wim_image_metadata *src_imd;
        struct list_head lte_list_head;
        struct wim_inode *inode;
@@ -193,15 +192,8 @@ wimlib_export_image(WIMStruct *src_wim,
        if (ret)
                return ret;
 
-       if (num_additional_swms) {
-               ret = new_joined_lookup_table(src_wim, additional_swms,
-                                             num_additional_swms,
-                                             &joined_tab);
-               if (ret)
-                       return ret;
-               src_wim_tab_save = src_wim->lookup_table;
-               src_wim->lookup_table = joined_tab;
-       }
+       if (num_additional_swms)
+               merge_lookup_tables(src_wim, additional_swms, num_additional_swms);
 
        ret = select_wim_image(src_wim, src_image);
        if (ret) {
@@ -269,9 +261,7 @@ out_free_ltes:
                        free_lookup_table_entry(lte);
        }
 out:
-       if (num_additional_swms) {
-               free_lookup_table(src_wim->lookup_table);
-               src_wim->lookup_table = src_wim_tab_save;
-       }
+       if (num_additional_swms)
+               unmerge_lookup_table(src_wim);
        return ret;
 }
index fd7453aab9d8d6f34d2e98dcf85ab70dfc80774f..fad438f52b27eeb62347e8dcfcb4642c1f8e8e06 100644 (file)
@@ -746,7 +746,6 @@ wimlib_extract_files(WIMStruct *wim,
 {
        int ret;
        struct wimlib_extract_command *cmds_copy;
-       struct wim_lookup_table *wim_tab_save, *joined_tab;
        int all_flags = 0;
 
        default_extract_flags &= WIMLIB_EXTRACT_MASK_PUBLIC;
@@ -758,15 +757,8 @@ wimlib_extract_files(WIMStruct *wim,
        if (num_cmds == 0)
                goto out;
 
-       if (num_additional_swms) {
-               ret = new_joined_lookup_table(wim, additional_swms,
-                                             num_additional_swms,
-                                             &joined_tab);
-               if (ret)
-                       goto out;
-               wim_tab_save = wim->lookup_table;
-               wim->lookup_table = joined_tab;
-       }
+       if (num_additional_swms)
+               merge_lookup_tables(wim, additional_swms, num_additional_swms);
 
        cmds_copy = CALLOC(num_cmds, sizeof(cmds[0]));
        if (!cmds_copy) {
@@ -810,10 +802,8 @@ out_free_cmds_copy:
        }
        FREE(cmds_copy);
 out_restore_lookup_table:
-       if (num_additional_swms) {
-               free_lookup_table(wim->lookup_table);
-               wim->lookup_table = wim_tab_save;
-       }
+       if (num_additional_swms)
+               unmerge_lookup_table(wim);
 out:
        return ret;
 }
@@ -937,7 +927,6 @@ wimlib_extract_image(WIMStruct *wim,
                     unsigned num_additional_swms,
                     wimlib_progress_func_t progress_func)
 {
-       struct wim_lookup_table *joined_tab, *wim_tab_save;
        int ret;
 
        extract_flags &= WIMLIB_EXTRACT_MASK_PUBLIC;
@@ -946,14 +935,8 @@ wimlib_extract_image(WIMStruct *wim,
        if (ret)
                return ret;
 
-       if (num_additional_swms) {
-               ret = new_joined_lookup_table(wim, additional_swms,
-                                             num_additional_swms, &joined_tab);
-               if (ret)
-                       return ret;
-               wim_tab_save = wim->lookup_table;
-               wim->lookup_table = joined_tab;
-       }
+       if (num_additional_swms)
+               merge_lookup_tables(wim, additional_swms, num_additional_swms);
 
        if (image == WIMLIB_ALL_IMAGES) {
                ret = extract_all_images(wim, target,
@@ -971,9 +954,7 @@ wimlib_extract_image(WIMStruct *wim,
                                       lte_free_extracted_file,
                                       NULL);
        }
-       if (num_additional_swms) {
-               free_lookup_table(wim->lookup_table);
-               wim->lookup_table = wim_tab_save;
-       }
+       if (num_additional_swms)
+               unmerge_lookup_table(wim);
        return ret;
 }
index b6bf6ebd78d22d598d3e6e536cab2dbe706f7386..9977942cc80bab94b69a2d0c6e682e74738a3bcd 100644 (file)
 #include <stdlib.h>
 
 static int
-move_lte_to_table(struct wim_lookup_table_entry *lte, void *other_tab)
+move_lte_to_table(struct wim_lookup_table_entry *lte, void *combined_table)
 {
        hlist_del(&lte->hash_list);
-       lookup_table_insert((struct wim_lookup_table*)other_tab, lte);
+       lookup_table_insert((struct wim_lookup_table*)combined_table, lte);
        return 0;
 }
 
-static int
-lookup_table_join(struct wim_lookup_table *table,
-                 struct wim_lookup_table *new)
+static void
+lookup_table_join(struct wim_lookup_table *combined_table,
+                 struct wim_lookup_table *part_table)
 {
-       for_lookup_table_entry(new, move_lte_to_table, table);
-       new->num_entries = 0;
-       return 0;
+       for_lookup_table_entry(part_table, move_lte_to_table, combined_table);
+       part_table->num_entries = 0;
 }
 
 /*
- * new_joined_lookup_table: - Join lookup tables from the parts of a split WIM.
+ * merge_lookup_tables() - Merge lookup tables from the parts of a split WIM.
  *
  * @w specifies the first part, while @additional_swms and @num_additional_swms
  * specify an array of pointers to the WIMStruct's for additional split WIM parts.
  *
- * The lookup table entries are *moved* to the new table.
- *
- * On success, 0 is returned on a pointer to the joined lookup table is returned
- * in @table_ret.
- *
  * The reason we join the lookup tables is so we only have to search one lookup
  * table to find the location of a resource in the entire WIM.
  */
-int
-new_joined_lookup_table(WIMStruct *w,
-                       WIMStruct **additional_swms,
-                       unsigned num_additional_swms,
-                       struct wim_lookup_table **table_ret)
+void
+merge_lookup_tables(WIMStruct *w,
+                   WIMStruct **additional_swms,
+                   unsigned num_additional_swms)
 {
-       struct wim_lookup_table *table;
-       int ret;
-       unsigned i;
-
-       table = new_lookup_table(9001);
-       if (!table)
-               return WIMLIB_ERR_NOMEM;
-
-       if (w)
-               lookup_table_join(table, w->lookup_table);
+       for (unsigned i = 0; i < num_additional_swms; i++)
+               lookup_table_join(w->lookup_table, additional_swms[i]->lookup_table);
+}
 
-       for (i = 0; i < num_additional_swms; i++) {
-               ret = lookup_table_join(table, additional_swms[i]->lookup_table);
-               if (ret != 0)
-                       goto out_free_table;
+static int
+move_lte_to_orig_table(struct wim_lookup_table_entry *lte, void *_wim)
+{
+       WIMStruct *wim = _wim;
+       if (lte->wim != wim) {
+               move_lte_to_table(lte, lte->wim->lookup_table);
+               wim->lookup_table->num_entries--;
        }
-       *table_ret = table;
        return 0;
-out_free_table:
-       free_lookup_table(table);
-       return ret;
+}
+
+/* Undo merge_lookup_tables(), given the first WIM part that contains the merged
+ * lookup table. */
+void
+unmerge_lookup_table(WIMStruct *wim)
+{
+       for_lookup_table_entry(wim->lookup_table, move_lte_to_orig_table, wim);
 }
 
 
index 4c0c93e50126553f449f98806c6ca67951427e60..f816db1ea7ee1e6816e50ca3f0e53455ff41d82d 100644 (file)
@@ -2364,7 +2364,6 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir,
        char *argv[16];
        int ret;
        char *dir_copy;
-       struct wim_lookup_table *joined_tab, *wim_tab_save;
        struct wim_image_metadata *imd;
        struct wimfs_context ctx;
        struct wim_inode *inode;
@@ -2387,15 +2386,8 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir,
                goto out;
        }
 
-       if (num_additional_swms) {
-               ret = new_joined_lookup_table(wim, additional_swms,
-                                             num_additional_swms,
-                                             &joined_tab);
-               if (ret)
-                       goto out;
-               wim_tab_save = wim->lookup_table;
-               wim->lookup_table = joined_tab;
-       }
+       if (num_additional_swms)
+               merge_lookup_tables(wim, additional_swms, num_additional_swms);
 
        if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) {
                ret = wim_run_full_verifications(wim);
@@ -2560,10 +2552,8 @@ out_unlock:
 out_free_message_queue_names:
        free_message_queue_names(&ctx);
 out_restore_lookup_table:
-       if (num_additional_swms) {
-               free_lookup_table(wim->lookup_table);
-               wim->lookup_table = wim_tab_save;
-       }
+       if (num_additional_swms)
+               unmerge_lookup_table(wim);
 out:
        return ret;
 }
index a54e644cfddee8e8f5bb4759821fb09986534fcc..08a176cf277d7855428292ef93cce17a1001fd5d 100644 (file)
@@ -535,10 +535,12 @@ check_wim_integrity(WIMStruct *w, wimlib_progress_func_t progress_func);
 
 /* join.c */
 
-extern int
-new_joined_lookup_table(WIMStruct *w, WIMStruct **additional_swms,
-                       unsigned num_additional_swms,
-                       struct wim_lookup_table **table_ret);
+extern void
+merge_lookup_tables(WIMStruct *w,
+                   WIMStruct **additional_swms, unsigned num_additional_swms);
+
+extern void
+unmerge_lookup_table(WIMStruct *wim);
 
 /* metadata_resource.c */