-/*
- * This function is executed by the main thread when the resources are being
- * compressed in parallel. The main thread is in change of all reading of the
- * uncompressed data and writing of the compressed data. The compressor threads
- * *only* do compression from/to in-memory buffers.
- *
- * Each unit of work given to a compressor thread is up to MAX_CHUNKS_PER_MSG
- * chunks of compressed data to compress, represented in a `struct message'.
- * Each message is passed from the main thread to a worker thread through the
- * res_to_compress_queue, and it is passed back through the
- * compressed_res_queue.
- */
-static int main_writer_thread_proc(struct list_head *stream_list,
- FILE *out_fp,
- int out_ctype,
- struct shared_queue *res_to_compress_queue,
- struct shared_queue *compressed_res_queue,
- size_t queue_size,
- int write_flags,
- u64 total_size)
-{
- int ret;
-
- struct message msgs[queue_size];
- ZERO_ARRAY(msgs);
-
- // Initially, all the messages are available to use.
- LIST_HEAD(available_msgs);
- for (size_t i = 0; i < ARRAY_LEN(msgs); i++)
- list_add(&msgs[i].list, &available_msgs);
-
- // outstanding_resources is the list of resources that currently have
- // had chunks sent off for compression.
- //
- // The first stream in outstanding_resources is the stream that is
- // currently being written (cur_lte).
- //
- // The last stream in outstanding_resources is the stream that is
- // currently being read and chunks fed to the compressor threads
- // (next_lte).
- //
- // Depending on the number of threads and the sizes of the resource,
- // the outstanding streams list may contain streams between cur_lte and
- // next_lte that have all their chunks compressed or being compressed,
- // but haven't been written yet.
- //
- LIST_HEAD(outstanding_resources);
- struct list_head *next_resource = stream_list->next;
- struct lookup_table_entry *next_lte = container_of(next_resource,
- struct lookup_table_entry,
- staging_list);
- next_resource = next_resource->next;
- u64 next_chunk = 0;
- u64 next_num_chunks = wim_resource_chunks(next_lte);
- INIT_LIST_HEAD(&next_lte->msg_list);
- list_add_tail(&next_lte->staging_list, &outstanding_resources);
-
- // As in write_wim_resource(), each resource we read is checksummed.
- SHA_CTX next_sha_ctx;
- sha1_init(&next_sha_ctx);
- u8 next_hash[SHA1_HASH_SIZE];
-
- // Resources that don't need any chunks compressed are added to this
- // list and written directly by the main thread.
- LIST_HEAD(my_resources);
-
- struct lookup_table_entry *cur_lte = next_lte;
- struct chunk_table *cur_chunk_tab = NULL;
- struct lookup_table_entry *lte;
- struct message *msg;
+struct main_writer_thread_ctx {
+ struct list_head *stream_list;
+ struct wim_lookup_table *lookup_table;
+ FILE *out_fp;
+ int out_ctype;
+ struct shared_queue *res_to_compress_queue;
+ struct shared_queue *compressed_res_queue;
+ size_t num_messages;
+ int write_flags;
+ wimlib_progress_func_t progress_func;
+ union wimlib_progress_info *progress;
+
+ struct list_head available_msgs;
+ struct list_head outstanding_streams;
+ struct list_head serial_streams;
+ u64 next_chunk;
+ u64 next_num_chunks;
+ struct message *msgs;
+ struct message *next_msg;
+ size_t next_chunk_in_msg;
+ struct wim_lookup_table_entry *cur_lte;
+ struct chunk_table *cur_chunk_tab;
+ struct wim_lookup_table_entry *next_lte;
+ SHA_CTX sha_ctx;
+ u8 next_hash[20];
+};