>From bf1f7ec8a2baacc497e188ac38b24e5b0387b143 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 18 Jun 2013 09:21:03 +0200 Subject: [PATCH 1/3] [draft] monitor job Signed-off-by: Gerd Hoffmann --- include/monitor/monitor.h | 10 +++++++ monitor.c | 66 +++++++++++++++++++++++++++++++++++++++++++++ qapi-schema.json | 10 +++++++ 3 files changed, 86 insertions(+) diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index 1a6cfcf..6f5ec7e 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -47,6 +47,7 @@ typedef enum MonitorEvent { QEVENT_BALLOON_CHANGE, QEVENT_SPICE_MIGRATE_COMPLETED, QEVENT_GUEST_PANICKED, + QEVENT_JOB_COMPLETED, /* Add to 'monitor_event_names' array in monitor.c when * defining new events here */ @@ -100,4 +101,13 @@ int monitor_fdset_dup_fd_add(int64_t fdset_id, int dup_fd); int monitor_fdset_dup_fd_remove(int dup_fd); int monitor_fdset_dup_fd_find(int dup_fd); +typedef struct monitor_job monitor_job; +typedef void (*monitor_job_func)(void *opaque, Error **errp); + +uint64_t monitor_job_new_id(void); +monitor_job *monitor_job_alloc(uint64_t id, monitor_job_func func, + void *opaque); +void monitor_job_queue(monitor_job *job); +void monitor_job_cancel(monitor_job *job); + #endif /* !MONITOR_H */ diff --git a/monitor.c b/monitor.c index 70ae8f5..9a25c1e 100644 --- a/monitor.c +++ b/monitor.c @@ -496,6 +496,7 @@ static const char *monitor_event_names[] = { [QEVENT_BALLOON_CHANGE] = "BALLOON_CHANGE", [QEVENT_SPICE_MIGRATE_COMPLETED] = "SPICE_MIGRATE_COMPLETED", [QEVENT_GUEST_PANICKED] = "GUEST_PANICKED", + [QEVENT_JOB_COMPLETED] = "JOB_COMPLETED", }; QEMU_BUILD_BUG_ON(ARRAY_SIZE(monitor_event_names) != QEVENT_MAX) @@ -4863,3 +4864,68 @@ QemuOptsList qemu_mon_opts = { { /* end of list */ } }, }; + +struct monitor_job { + uint64_t id; + monitor_job_func func; + void *opaque; + QEMUBH *bh; +}; + +static void monitor_job_event(monitor_job *job, const char *result, Error *err) +{ + QObject *data; + + data = qobject_from_jsonf("{ 'job-id': %" PRId64 ", 'result': %s }", + job->id, result); + if (error_is_set(&err)) { + /* TODO: add error details */ + } + monitor_protocol_event(QEVENT_JOB_COMPLETED, data); + qobject_decref(data); +} + +static void monitor_job_bh(void *opaque) +{ + monitor_job *job = opaque; + Error *local_err = NULL; + const char *result; + + job->func(job->opaque, &local_err); + result = error_is_set(&local_err) ? "success" : "failure"; + monitor_job_event(job, result, local_err); + qemu_bh_delete(job->bh); + g_free(job); +} + +uint64_t monitor_job_new_id(void) +{ + static uint64_t nextid = 1; + return nextid++; +} + +monitor_job *monitor_job_alloc(uint64_t id, monitor_job_func func, + void *opaque) +{ + monitor_job *job = g_new0(monitor_job, 1); + + job->id = id; + job->func = func; + job->opaque = opaque; + return job; +} + +void monitor_job_queue(monitor_job *job) +{ + job->bh = qemu_bh_new(monitor_job_bh, job); + qemu_bh_schedule(job->bh); +} + +void monitor_job_cancel(monitor_job *job) +{ + monitor_job_event(job, "canceled", NULL); + if (job->bh) { + qemu_bh_delete(job->bh); + } + g_free(job); +} diff --git a/qapi-schema.json b/qapi-schema.json index aced724..a449a43 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -2515,6 +2515,16 @@ 'str': 'str' } } ## +# @MonitorJob +# +# Monitor job id. +# +# Since 1.6 +## +{ 'type': 'MonitorJob', + 'data': { 'job-id': 'int' } } + +## # @NetdevUserOptions # # Use the user mode network stack which requires no administrator privilege to -- 1.7.9.7