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: John Snow <jsnow@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-id: 20180830015734.19765-10-jsnow@redhat.com Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
404ff28d6a
commit
e21a1c9831
@ -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.
|
||||
|
40
job.c
40
job.c
@ -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);
|
||||
}
|
||||
job->deferred_to_main_loop = true;
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user