Commit e21a1c98 authored by John Snow's avatar John Snow Committed by Max Reitz
Browse files

jobs: remove job_defer_to_main_loop



Now that the job infrastructure is handling the job_completed call for
all implemented jobs, we can remove the interface that allowed jobs to
schedule their own completion.

Signed-off-by: default avatarJohn Snow <jsnow@redhat.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
Message-id: 20180830015734.19765-10-jsnow@redhat.com
Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
parent 404ff28d
Loading
Loading
Loading
Loading
+0 −17
Original line number Diff line number Diff line
@@ -568,23 +568,6 @@ void job_finalize(Job *job, Error **errp);
 */
void job_dismiss(Job **job, Error **errp);

typedef void JobDeferToMainLoopFn(Job *job, void *opaque);

/**
 * @job: The job
 * @fn: The function to run in the main loop
 * @opaque: The opaque value that is passed to @fn
 *
 * This function must be called by the main job coroutine just before it
 * returns.  @fn is executed in the main loop with the job AioContext acquired.
 *
 * Block jobs must call bdrv_unref(), bdrv_close(), and anything that uses
 * bdrv_drain_all() in the main loop.
 *
 * The @job AioContext is held while @fn executes.
 */
void job_defer_to_main_loop(Job *job, JobDeferToMainLoopFn *fn, void *opaque);

/**
 * Synchronously finishes the given @job. If @finish is given, it is called to
 * trigger completion or cancellation of the job.
+2 −38
Original line number Diff line number Diff line
@@ -561,12 +561,8 @@ static void coroutine_fn job_co_entry(void *opaque)
    assert(job && job->driver && job->driver->run);
    job_pause_point(job);
    job->ret = job->driver->run(job, &job->err);
    if (!job->deferred_to_main_loop) {
    job->deferred_to_main_loop = true;
        aio_bh_schedule_oneshot(qemu_get_aio_context(),
                                job_exit,
                                job);
    }
    aio_bh_schedule_oneshot(qemu_get_aio_context(), job_exit, job);
}


@@ -969,38 +965,6 @@ void job_complete(Job *job, Error **errp)
    job->driver->complete(job, errp);
}


typedef struct {
    Job *job;
    JobDeferToMainLoopFn *fn;
    void *opaque;
} JobDeferToMainLoopData;

static void job_defer_to_main_loop_bh(void *opaque)
{
    JobDeferToMainLoopData *data = opaque;
    Job *job = data->job;
    AioContext *aio_context = job->aio_context;

    aio_context_acquire(aio_context);
    data->fn(data->job, data->opaque);
    aio_context_release(aio_context);

    g_free(data);
}

void job_defer_to_main_loop(Job *job, JobDeferToMainLoopFn *fn, void *opaque)
{
    JobDeferToMainLoopData *data = g_malloc(sizeof(*data));
    data->job = job;
    data->fn = fn;
    data->opaque = opaque;
    job->deferred_to_main_loop = true;

    aio_bh_schedule_oneshot(qemu_get_aio_context(),
                            job_defer_to_main_loop_bh, data);
}

int job_finish_sync(Job *job, void (*finish)(Job *, Error **errp), Error **errp)
{
    Error *local_err = NULL;