mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00
jobs: use job locks also in the unit tests
Add missing job synchronization in the unit tests, with explicit locks. We are deliberately using _locked functions wrapped by a guard instead of a normal call because the normal call will be removed in future, as the only usage is limited to the tests. In other words, if a function like job_pause() is/will be only used in tests to avoid: WITH_JOB_LOCK_GUARD(){ job_pause_locked(); } then it is not worth keeping job_pause(), and just use the guard. Note: at this stage, job_{lock/unlock} and job lock guard macros are *nop*. Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20220926093214.506243-10-eesposit@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
9624112441
commit
191e7af394
4 changed files with 140 additions and 83 deletions
|
@ -943,61 +943,83 @@ static void test_blockjob_common_drain_node(enum drain_type drain_type,
|
|||
}
|
||||
}
|
||||
|
||||
g_assert_cmpint(job->job.pause_count, ==, 0);
|
||||
g_assert_false(job->job.paused);
|
||||
g_assert_true(tjob->running);
|
||||
g_assert_true(job->job.busy); /* We're in qemu_co_sleep_ns() */
|
||||
WITH_JOB_LOCK_GUARD() {
|
||||
g_assert_cmpint(job->job.pause_count, ==, 0);
|
||||
g_assert_false(job->job.paused);
|
||||
g_assert_true(tjob->running);
|
||||
g_assert_true(job->job.busy); /* We're in qemu_co_sleep_ns() */
|
||||
}
|
||||
|
||||
do_drain_begin_unlocked(drain_type, drain_bs);
|
||||
|
||||
if (drain_type == BDRV_DRAIN_ALL) {
|
||||
/* bdrv_drain_all() drains both src and target */
|
||||
g_assert_cmpint(job->job.pause_count, ==, 2);
|
||||
} else {
|
||||
g_assert_cmpint(job->job.pause_count, ==, 1);
|
||||
WITH_JOB_LOCK_GUARD() {
|
||||
if (drain_type == BDRV_DRAIN_ALL) {
|
||||
/* bdrv_drain_all() drains both src and target */
|
||||
g_assert_cmpint(job->job.pause_count, ==, 2);
|
||||
} else {
|
||||
g_assert_cmpint(job->job.pause_count, ==, 1);
|
||||
}
|
||||
g_assert_true(job->job.paused);
|
||||
g_assert_false(job->job.busy); /* The job is paused */
|
||||
}
|
||||
g_assert_true(job->job.paused);
|
||||
g_assert_false(job->job.busy); /* The job is paused */
|
||||
|
||||
do_drain_end_unlocked(drain_type, drain_bs);
|
||||
|
||||
if (use_iothread) {
|
||||
/* paused is reset in the I/O thread, wait for it */
|
||||
/*
|
||||
* Here we are waiting for the paused status to change,
|
||||
* so don't bother protecting the read every time.
|
||||
*
|
||||
* paused is reset in the I/O thread, wait for it
|
||||
*/
|
||||
while (job->job.paused) {
|
||||
aio_poll(qemu_get_aio_context(), false);
|
||||
}
|
||||
}
|
||||
|
||||
g_assert_cmpint(job->job.pause_count, ==, 0);
|
||||
g_assert_false(job->job.paused);
|
||||
g_assert_true(job->job.busy); /* We're in qemu_co_sleep_ns() */
|
||||
WITH_JOB_LOCK_GUARD() {
|
||||
g_assert_cmpint(job->job.pause_count, ==, 0);
|
||||
g_assert_false(job->job.paused);
|
||||
g_assert_true(job->job.busy); /* We're in qemu_co_sleep_ns() */
|
||||
}
|
||||
|
||||
do_drain_begin_unlocked(drain_type, target);
|
||||
|
||||
if (drain_type == BDRV_DRAIN_ALL) {
|
||||
/* bdrv_drain_all() drains both src and target */
|
||||
g_assert_cmpint(job->job.pause_count, ==, 2);
|
||||
} else {
|
||||
g_assert_cmpint(job->job.pause_count, ==, 1);
|
||||
WITH_JOB_LOCK_GUARD() {
|
||||
if (drain_type == BDRV_DRAIN_ALL) {
|
||||
/* bdrv_drain_all() drains both src and target */
|
||||
g_assert_cmpint(job->job.pause_count, ==, 2);
|
||||
} else {
|
||||
g_assert_cmpint(job->job.pause_count, ==, 1);
|
||||
}
|
||||
g_assert_true(job->job.paused);
|
||||
g_assert_false(job->job.busy); /* The job is paused */
|
||||
}
|
||||
g_assert_true(job->job.paused);
|
||||
g_assert_false(job->job.busy); /* The job is paused */
|
||||
|
||||
do_drain_end_unlocked(drain_type, target);
|
||||
|
||||
if (use_iothread) {
|
||||
/* paused is reset in the I/O thread, wait for it */
|
||||
/*
|
||||
* Here we are waiting for the paused status to change,
|
||||
* so don't bother protecting the read every time.
|
||||
*
|
||||
* paused is reset in the I/O thread, wait for it
|
||||
*/
|
||||
while (job->job.paused) {
|
||||
aio_poll(qemu_get_aio_context(), false);
|
||||
}
|
||||
}
|
||||
|
||||
g_assert_cmpint(job->job.pause_count, ==, 0);
|
||||
g_assert_false(job->job.paused);
|
||||
g_assert_true(job->job.busy); /* We're in qemu_co_sleep_ns() */
|
||||
WITH_JOB_LOCK_GUARD() {
|
||||
g_assert_cmpint(job->job.pause_count, ==, 0);
|
||||
g_assert_false(job->job.paused);
|
||||
g_assert_true(job->job.busy); /* We're in qemu_co_sleep_ns() */
|
||||
}
|
||||
|
||||
aio_context_acquire(ctx);
|
||||
ret = job_complete_sync(&job->job, &error_abort);
|
||||
WITH_JOB_LOCK_GUARD() {
|
||||
ret = job_complete_sync_locked(&job->job, &error_abort);
|
||||
}
|
||||
g_assert_cmpint(ret, ==, (result == TEST_JOB_SUCCESS ? 0 : -EIO));
|
||||
|
||||
if (use_iothread) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue