X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fverify.c;h=e11561efcf790021799ea9f4193924f38f5f4146;hp=1ca5be46d57a9c3c41696e4291e2765f5346f9b1;hb=3d71e838902b0b6f5321484ca965c1cd888fb91e;hpb=c48e2f84645abe34faec4994605d7a7b3b451672 diff --git a/src/verify.c b/src/verify.c index 1ca5be46..e11561ef 100644 --- a/src/verify.c +++ b/src/verify.c @@ -44,51 +44,44 @@ struct verify_blob_list_ctx { void *progctx; union wimlib_progress_info *progress; u64 next_progress; + u64 cur_blob_offset; + u64 cur_blob_size; }; static int -end_verify_blob(struct blob_descriptor *blob, int status, void *_ctx) +verify_begin_blob(struct blob_descriptor *blob, void *_ctx) { struct verify_blob_list_ctx *ctx = _ctx; - union wimlib_progress_info *progress = ctx->progress; - if (status) - return status; + ctx->cur_blob_offset = 0; + ctx->cur_blob_size = blob->size; + return 0; +} - progress->verify_streams.completed_streams++; - progress->verify_streams.completed_bytes += blob->size; +static int +verify_consume_chunk(const void *chunk, size_t size, void *_ctx) +{ + struct verify_blob_list_ctx *ctx = _ctx; + union wimlib_progress_info *progress = ctx->progress; - /* Handle rate-limiting of progress messages */ + ctx->cur_blob_offset += size; + if (ctx->cur_blob_offset == ctx->cur_blob_size) + progress->verify_streams.completed_streams++; - if (progress->verify_streams.completed_bytes < ctx->next_progress) - return 0; + progress->verify_streams.completed_bytes += size; - /* Time for another progress message. */ + if (progress->verify_streams.completed_bytes >= ctx->next_progress) { - status = call_progress(ctx->progfunc, WIMLIB_PROGRESS_MSG_VERIFY_STREAMS, - progress, ctx->progctx); - if (status) - return status; + int ret = call_progress(ctx->progfunc, + WIMLIB_PROGRESS_MSG_VERIFY_STREAMS, + progress, ctx->progctx); + if (ret) + return ret; - if (ctx->next_progress == progress->verify_streams.total_bytes) { - ctx->next_progress = ~(u64)0; - return 0; + set_next_progress(progress->verify_streams.completed_bytes, + progress->verify_streams.total_bytes, + &ctx->next_progress); } - - /* Send new message as soon as another 1/128 of the total has - * been verified. (Arbitrary number.) */ - ctx->next_progress = progress->verify_streams.completed_bytes + - progress->verify_streams.total_bytes / 128; - - /* ... Unless that would be more than 5000000 bytes, in which case send - * the next after the next 5000000 bytes. (Another arbitrary number.) */ - if (progress->verify_streams.completed_bytes + 5000000 < ctx->next_progress) - ctx->next_progress = progress->verify_streams.completed_bytes + 5000000; - - /* ... But always send a message as soon as we're completely - * done. */ - if (progress->verify_streams.total_bytes < ctx->next_progress) - ctx->next_progress = progress->verify_streams.total_bytes; return 0; } @@ -117,7 +110,8 @@ wimlib_verify_wim(WIMStruct *wim, int verify_flags) struct verify_blob_list_ctx ctx; struct blob_descriptor *blob; struct read_blob_callbacks cbs = { - .end_blob = end_verify_blob, + .begin_blob = verify_begin_blob, + .consume_chunk = verify_consume_chunk, .ctx = &ctx, };