X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fcompress_parallel.c;h=e624819be77bb432a6c685ece3e2e039537c56b7;hp=f339298abf51715e0cb52f43b4a266a1064b62eb;hb=4dd45340f9fe3a533e0f1a9d6b79f8118e45ca2a;hpb=f675c45459508d058aeda4869e2928be4b7ffd99 diff --git a/src/compress_parallel.c b/src/compress_parallel.c index f339298a..e624819b 100644 --- a/src/compress_parallel.c +++ b/src/compress_parallel.c @@ -82,7 +82,7 @@ struct parallel_chunk_compressor { struct message_queue chunks_to_compress_queue; struct message_queue compressed_chunks_queue; struct compressor_thread_data *thread_data; - unsigned num_threads; + unsigned num_thread_data; unsigned num_started_threads; struct message *msgs; @@ -136,7 +136,7 @@ get_avail_memory(void) default_size: WARNING("Failed to determine available memory; assuming 1 GiB"); - return 1U << 30; + return 1ULL << 30; } static int @@ -309,7 +309,7 @@ parallel_chunk_compressor_destroy(struct chunk_compressor *_ctx) message_queue_destroy(&ctx->compressed_chunks_queue); if (ctx->thread_data != NULL) - for (i = 0; i < ctx->num_threads; i++) + for (i = 0; i < ctx->num_thread_data; i++) wimlib_free_compressor(ctx->thread_data[i].compressor); FREE(ctx->thread_data); @@ -332,7 +332,7 @@ submit_compression_msg(struct parallel_chunk_compressor *ctx) static bool parallel_chunk_compressor_submit_chunk(struct chunk_compressor *_ctx, - const void *chunk, size_t size) + const void *chunk, u32 size) { struct parallel_chunk_compressor *ctx = (struct parallel_chunk_compressor *)_ctx; struct message *msg; @@ -451,7 +451,7 @@ new_parallel_chunk_compressor(int out_ctype, u32 out_chunk_size, + 1000000 + num_threads * wimlib_get_compressor_needed_memory(out_ctype, out_chunk_size, - NULL); + 0); if (approx_mem_required <= max_memory) break; @@ -484,12 +484,11 @@ new_parallel_chunk_compressor(int out_ctype, u32 out_chunk_size, ctx->base.out_ctype = out_ctype; ctx->base.out_chunk_size = out_chunk_size; - ctx->base.num_threads = num_threads; ctx->base.destroy = parallel_chunk_compressor_destroy; ctx->base.submit_chunk = parallel_chunk_compressor_submit_chunk; ctx->base.get_chunk = parallel_chunk_compressor_get_chunk; - ctx->num_threads = num_threads; + ctx->num_thread_data = num_threads; ret = message_queue_init(&ctx->chunks_to_compress_queue); if (ret) @@ -511,8 +510,8 @@ new_parallel_chunk_compressor(int out_ctype, u32 out_chunk_size, dat->chunks_to_compress_queue = &ctx->chunks_to_compress_queue; dat->compressed_chunks_queue = &ctx->compressed_chunks_queue; - ret = wimlib_create_compressor(out_ctype, out_chunk_size, - NULL, &dat->compressor); + ret = wimlib_create_compressor(out_ctype, out_chunk_size, 0, + &dat->compressor); if (ret) goto err; } @@ -529,16 +528,20 @@ new_parallel_chunk_compressor(int out_ctype, u32 out_chunk_size, &ctx->thread_data[ctx->num_started_threads]); if (ret) { errno = ret; - ret = WIMLIB_ERR_NOMEM; WARNING_WITH_ERRNO("Failed to create compressor thread %u of %u", ctx->num_started_threads + 1, num_threads); + ret = WIMLIB_ERR_NOMEM; + if (ctx->num_started_threads >= 2) + break; goto err; } } + ctx->base.num_threads = ctx->num_started_threads; + ret = WIMLIB_ERR_NOMEM; - ctx->num_messages = num_threads * msgs_per_thread; + ctx->num_messages = ctx->num_started_threads * msgs_per_thread; ctx->msgs = allocate_messages(ctx->num_messages, chunks_per_msg, out_chunk_size); if (ctx->msgs == NULL)