Skip to content

Commit

Permalink
job: refactor progress to separate object
Browse files Browse the repository at this point in the history
We need it in separate to pass to the block-copy object in the next
commit.

Cc: [email protected]
Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]>
Reviewed-by: Andrey Shinkevich <[email protected]>
Reviewed-by: Max Reitz <[email protected]>
Message-Id: <[email protected]>
Signed-off-by: Max Reitz <[email protected]>
  • Loading branch information
Vladimir Sementsov-Ogievskiy authored and XanClic committed Mar 11, 2020
1 parent e726657 commit 01fe1ca
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 25 deletions.
16 changes: 8 additions & 8 deletions blockjob.c
Original file line number Diff line number Diff line change
Expand Up @@ -299,8 +299,8 @@ BlockJobInfo *block_job_query(BlockJob *job, Error **errp)
info->device = g_strdup(job->job.id);
info->busy = atomic_read(&job->job.busy);
info->paused = job->job.pause_count > 0;
info->offset = job->job.progress_current;
info->len = job->job.progress_total;
info->offset = job->job.progress.current;
info->len = job->job.progress.total;
info->speed = job->speed;
info->io_status = job->iostatus;
info->ready = job_is_ready(&job->job),
Expand Down Expand Up @@ -330,8 +330,8 @@ static void block_job_event_cancelled(Notifier *n, void *opaque)

qapi_event_send_block_job_cancelled(job_type(&job->job),
job->job.id,
job->job.progress_total,
job->job.progress_current,
job->job.progress.total,
job->job.progress.current,
job->speed);
}

Expand All @@ -350,8 +350,8 @@ static void block_job_event_completed(Notifier *n, void *opaque)

qapi_event_send_block_job_completed(job_type(&job->job),
job->job.id,
job->job.progress_total,
job->job.progress_current,
job->job.progress.total,
job->job.progress.current,
job->speed,
!!msg,
msg);
Expand Down Expand Up @@ -379,8 +379,8 @@ static void block_job_event_ready(Notifier *n, void *opaque)

qapi_event_send_block_job_ready(job_type(&job->job),
job->job.id,
job->job.progress_total,
job->job.progress_current,
job->job.progress.total,
job->job.progress.current,
job->speed);
}

Expand Down
11 changes: 2 additions & 9 deletions include/qemu/job.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

#include "qapi/qapi-types-job.h"
#include "qemu/queue.h"
#include "qemu/progress_meter.h"
#include "qemu/coroutine.h"
#include "block/aio.h"

Expand Down Expand Up @@ -117,15 +118,7 @@ typedef struct Job {
/** True if this job should automatically dismiss itself */
bool auto_dismiss;

/**
* Current progress. The unit is arbitrary as long as the ratio between
* progress_current and progress_total represents the estimated percentage
* of work already done.
*/
int64_t progress_current;

/** Estimated progress_current value at the completion of the job */
int64_t progress_total;
ProgressMeter progress;

/**
* Return code from @run and/or @prepare callback(s).
Expand Down
58 changes: 58 additions & 0 deletions include/qemu/progress_meter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*
* Helper functionality for some process progress tracking.
*
* Copyright (c) 2011 IBM Corp.
* Copyright (c) 2012, 2018 Red Hat, Inc.
* Copyright (c) 2020 Virtuozzo International GmbH
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/

#ifndef QEMU_PROGRESS_METER_H
#define QEMU_PROGRESS_METER_H

typedef struct ProgressMeter {
/**
* Current progress. The unit is arbitrary as long as the ratio between
* current and total represents the estimated percentage
* of work already done.
*/
uint64_t current;

/** Estimated current value at the completion of the process */
uint64_t total;
} ProgressMeter;

static inline void progress_work_done(ProgressMeter *pm, uint64_t done)
{
pm->current += done;
}

static inline void progress_set_remaining(ProgressMeter *pm, uint64_t remaining)
{
pm->total = pm->current + remaining;
}

static inline void progress_increase_remaining(ProgressMeter *pm,
uint64_t delta)
{
pm->total += delta;
}

#endif /* QEMU_PROGRESS_METER_H */
4 changes: 2 additions & 2 deletions job-qmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,8 @@ static JobInfo *job_query_single(Job *job, Error **errp)
.id = g_strdup(job->id),
.type = job_type(job),
.status = job->status,
.current_progress = job->progress_current,
.total_progress = job->progress_total,
.current_progress = job->progress.current,
.total_progress = job->progress.total,
.has_error = !!job->err,
.error = job->err ? \
g_strdup(error_get_pretty(job->err)) : NULL,
Expand Down
6 changes: 3 additions & 3 deletions job.c
Original file line number Diff line number Diff line change
Expand Up @@ -369,17 +369,17 @@ void job_unref(Job *job)

void job_progress_update(Job *job, uint64_t done)
{
job->progress_current += done;
progress_work_done(&job->progress, done);
}

void job_progress_set_remaining(Job *job, uint64_t remaining)
{
job->progress_total = job->progress_current + remaining;
progress_set_remaining(&job->progress, remaining);
}

void job_progress_increase_remaining(Job *job, uint64_t delta)
{
job->progress_total += delta;
progress_increase_remaining(&job->progress, delta);
}

void job_event_cancelled(Job *job)
Expand Down
6 changes: 3 additions & 3 deletions qemu-img.c
Original file line number Diff line number Diff line change
Expand Up @@ -884,9 +884,9 @@ static void run_block_job(BlockJob *job, Error **errp)
do {
float progress = 0.0f;
aio_poll(aio_context, true);
if (job->job.progress_total) {
progress = (float)job->job.progress_current /
job->job.progress_total * 100.f;
if (job->job.progress.total) {
progress = (float)job->job.progress.current /
job->job.progress.total * 100.f;
}
qemu_progress_print(progress, 0);
} while (!job_is_ready(&job->job) && !job_is_completed(&job->job));
Expand Down

0 comments on commit 01fe1ca

Please sign in to comment.