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 = ~(uint64_t)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;
}
union wimlib_progress_info progress;
struct verify_blob_list_ctx ctx;
struct blob_descriptor *blob;
- struct read_blob_list_callbacks cbs = {
- .end_blob = end_verify_blob,
- .end_blob_ctx = &ctx,
+ struct read_blob_callbacks cbs = {
+ .begin_blob = verify_begin_blob,
+ .consume_chunk = verify_consume_chunk,
+ .ctx = &ctx,
};
/* Check parameters */