OSDN Git Service
(root)
/
qmiga
/
qemu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
target/hppa: Update to SeaBIOS-hppa from version 10 to 12
[qmiga/qemu.git]
/
job-qmp.c
diff --git
a/job-qmp.c
b/job-qmp.c
index
fbfed25
..
9e26fa8
100644
(file)
--- a/
job-qmp.c
+++ b/
job-qmp.c
@@
-27,126
+27,136
@@
#include "qemu/job.h"
#include "qapi/qapi-commands-job.h"
#include "qapi/error.h"
#include "qemu/job.h"
#include "qapi/qapi-commands-job.h"
#include "qapi/error.h"
-#include "trace-root.h"
+#include "trace
/trace
-root.h"
-/* Get a job using its ID and acquire its AioContext */
-static Job *find_job(const char *id, AioContext **aio_context, Error **errp)
+/*
+ * Get a job using its ID. Called with job_mutex held.
+ */
+static Job *find_job_locked(const char *id, Error **errp)
{
Job *job;
{
Job *job;
- *aio_context = NULL;
-
- job = job_get(id);
+ job = job_get_locked(id);
if (!job) {
error_setg(errp, "Job not found");
return NULL;
}
if (!job) {
error_setg(errp, "Job not found");
return NULL;
}
- *aio_context = job->aio_context;
- aio_context_acquire(*aio_context);
-
return job;
}
void qmp_job_cancel(const char *id, Error **errp)
{
return job;
}
void qmp_job_cancel(const char *id, Error **errp)
{
- AioContext *aio_context;
- Job *job = find_job(id, &aio_context, errp);
+ Job *job;
+
+ JOB_LOCK_GUARD();
+ job = find_job_locked(id, errp);
if (!job) {
return;
}
trace_qmp_job_cancel(job);
if (!job) {
return;
}
trace_qmp_job_cancel(job);
- job_user_cancel(job, true, errp);
- aio_context_release(aio_context);
+ job_user_cancel_locked(job, true, errp);
}
void qmp_job_pause(const char *id, Error **errp)
{
}
void qmp_job_pause(const char *id, Error **errp)
{
- AioContext *aio_context;
- Job *job = find_job(id, &aio_context, errp);
+ Job *job;
+
+ JOB_LOCK_GUARD();
+ job = find_job_locked(id, errp);
if (!job) {
return;
}
trace_qmp_job_pause(job);
if (!job) {
return;
}
trace_qmp_job_pause(job);
- job_user_pause(job, errp);
- aio_context_release(aio_context);
+ job_user_pause_locked(job, errp);
}
void qmp_job_resume(const char *id, Error **errp)
{
}
void qmp_job_resume(const char *id, Error **errp)
{
- AioContext *aio_context;
- Job *job = find_job(id, &aio_context, errp);
+ Job *job;
+
+ JOB_LOCK_GUARD();
+ job = find_job_locked(id, errp);
if (!job) {
return;
}
trace_qmp_job_resume(job);
if (!job) {
return;
}
trace_qmp_job_resume(job);
- job_user_resume(job, errp);
- aio_context_release(aio_context);
+ job_user_resume_locked(job, errp);
}
void qmp_job_complete(const char *id, Error **errp)
{
}
void qmp_job_complete(const char *id, Error **errp)
{
- AioContext *aio_context;
- Job *job = find_job(id, &aio_context, errp);
+ Job *job;
+
+ JOB_LOCK_GUARD();
+ job = find_job_locked(id, errp);
if (!job) {
return;
}
trace_qmp_job_complete(job);
if (!job) {
return;
}
trace_qmp_job_complete(job);
- job_complete(job, errp);
- aio_context_release(aio_context);
+ job_complete_locked(job, errp);
}
void qmp_job_finalize(const char *id, Error **errp)
{
}
void qmp_job_finalize(const char *id, Error **errp)
{
- AioContext *aio_context;
- Job *job = find_job(id, &aio_context, errp);
+ Job *job;
+
+ JOB_LOCK_GUARD();
+ job = find_job_locked(id, errp);
if (!job) {
return;
}
trace_qmp_job_finalize(job);
if (!job) {
return;
}
trace_qmp_job_finalize(job);
- job_finalize(job, errp);
- aio_context_release(aio_context);
+ job_ref_locked(job);
+ job_finalize_locked(job, errp);
+
+ job_unref_locked(job);
}
void qmp_job_dismiss(const char *id, Error **errp)
{
}
void qmp_job_dismiss(const char *id, Error **errp)
{
- AioContext *aio_context;
- Job *job = find_job(id, &aio_context, errp);
+ Job *job;
+
+ JOB_LOCK_GUARD();
+ job = find_job_locked(id, errp);
if (!job) {
return;
}
trace_qmp_job_dismiss(job);
if (!job) {
return;
}
trace_qmp_job_dismiss(job);
- job_dismiss(&job, errp);
- aio_context_release(aio_context);
+ job_dismiss_locked(&job, errp);
}
}
-static JobInfo *job_query_single(Job *job, Error **errp)
+/* Called with job_mutex held. */
+static JobInfo *job_query_single_locked(Job *job, Error **errp)
{
JobInfo *info;
{
JobInfo *info;
+ uint64_t progress_current;
+ uint64_t progress_total;
assert(!job_is_internal(job));
assert(!job_is_internal(job));
+ progress_get_snapshot(&job->progress, &progress_current,
+ &progress_total);
info = g_new(JobInfo, 1);
*info = (JobInfo) {
.id = g_strdup(job->id),
.type = job_type(job),
.status = job->status,
info = g_new(JobInfo, 1);
*info = (JobInfo) {
.id = g_strdup(job->id),
.type = job_type(job),
.status = job->status,
- .current_progress = job->progress_current,
- .total_progress = job->progress_total,
- .has_error = !!job->err,
- .error = job->err ? \
+ .current_progress = progress_current,
+ .total_progress = progress_total,
+ .error = job->err ?
g_strdup(error_get_pretty(job->err)) : NULL,
};
g_strdup(error_get_pretty(job->err)) : NULL,
};
@@
-155,28
+165,23
@@
static JobInfo *job_query_single(Job *job, Error **errp)
JobInfoList *qmp_query_jobs(Error **errp)
{
JobInfoList *qmp_query_jobs(Error **errp)
{
- JobInfoList *head = NULL, **
p_next
= &head;
+ JobInfoList *head = NULL, **
tail
= &head;
Job *job;
Job *job;
- for (job = job_next(NULL); job; job = job_next(job)) {
- JobInfoList *elem;
- AioContext *aio_context;
+ JOB_LOCK_GUARD();
+
+ for (job = job_next_locked(NULL); job; job = job_next_locked(job)) {
+ JobInfo *value;
if (job_is_internal(job)) {
continue;
}
if (job_is_internal(job)) {
continue;
}
- elem = g_new0(JobInfoList, 1);
- aio_context = job->aio_context;
- aio_context_acquire(aio_context);
- elem->value = job_query_single(job, errp);
- aio_context_release(aio_context);
- if (!elem->value) {
- g_free(elem);
+ value = job_query_single_locked(job, errp);
+ if (!value) {
qapi_free_JobInfoList(head);
return NULL;
}
qapi_free_JobInfoList(head);
return NULL;
}
- *p_next = elem;
- p_next = &elem->next;
+ QAPI_LIST_APPEND(tail, value);
}
return head;
}
return head;