On Fri, Jul 10, 2020 at 8:06 PM Michal Privoznik <mprivozn(a)redhat.com> wrote:
On 7/10/20 9:11 AM, Prathamesh Chavan wrote:
> To remove dependecy of `qemuDomainJob` on job specific
> paramters, a `privateData` pointer is introduced.
> To handle it, structure of callback functions is
> also introduced.
>
> Signed-off-by: Prathamesh Chavan <pc44800(a)gmail.com>
> ---
> src/qemu/qemu_domain.c | 4 +-
> src/qemu/qemu_domain.h | 10 +++++
> src/qemu/qemu_domainjob.c | 74 ++++++++++++++++++++++----------
> src/qemu/qemu_domainjob.h | 32 ++++++++------
> src/qemu/qemu_driver.c | 3 +-
> src/qemu/qemu_migration.c | 28 ++++++++----
> src/qemu/qemu_migration_params.c | 9 ++--
> src/qemu/qemu_process.c | 15 +++++--
> 8 files changed, 119 insertions(+), 56 deletions(-)
Almost.
>
> +typedef void *(*qemuDomainObjPrivateJobAlloc)(void);
> +typedef void (*qemuDomainObjPrivateJobFree)(void *);
> +typedef int (*qemuDomainObjPrivateJobFormat)(virBufferPtr,
> + virDomainObjPtr);
> +typedef int (*qemuDomainObjPrivateJobParse)(virDomainObjPtr,
> + xmlXPathContextPtr);
> +
> +typedef struct _qemuDomainObjPrivateJobCallbacks qemuDomainObjPrivateJobCallbacks;
> +struct _qemuDomainObjPrivateJobCallbacks {
> + qemuDomainObjPrivateJobAlloc allocJobPrivate;
> + qemuDomainObjPrivateJobFree freeJobPrivate;
> + qemuDomainObjPrivateJobFormat formatJob;
> + qemuDomainObjPrivateJobParse parseJob;
> +};
> +
This looks correct.
> typedef struct _qemuDomainJobObj qemuDomainJobObj;
> typedef qemuDomainJobObj *qemuDomainJobObjPtr;
> struct _qemuDomainJobObj {
> @@ -182,14 +197,11 @@ struct _qemuDomainJobObj {
> qemuDomainJobInfoPtr current; /* async job progress data */
> qemuDomainJobInfoPtr completed; /* statistics data of a recently completed
job */
> bool abortJob; /* abort of the job requested */
> - bool spiceMigration; /* we asked for spice migration and we
> - * should wait for it to finish */
> - bool spiceMigrated; /* spice migration completed */
> char *error; /* job event completion error */
> - bool dumpCompleted; /* dump completed */
> -
> - qemuMigrationParamsPtr migParams;
> unsigned long apiFlags; /* flags passed to the API which started the async job
*/
> +
> + void *privateData; /* job specific collection of data */
> + qemuDomainObjPrivateJobCallbacks cb;
And so does this. But these callbacks should be passed to
qemuDomainObjInitJob() which will save them into the cb like this:
int
qemuDomainObjInitJob(qemuDomainJobObjPtr job,
qemuDomainObjPrivateJobCallbacks cb)
{
memset(job, 0, sizeof(*job));
if (virCondInit(&job->cond) < 0)
return -1;
if (virCondInit(&job->asyncCond) < 0) {
virCondDestroy(&job->cond);
return -1;
}
job->cb = cb;
if (!(job->privateData = job->cb.allocJobPrivate())) {
qemuDomainObjFreeJob(job);
return -1;
}
return 0;
}
In general, nothing outside qemu_domainjob.c should be calling these
callbacks. Therefore for instance when formatting private XML it should
looks something like this:
static int
qemuDomainObjPrivateXMLFormat(virBufferPtr buf,
virDomainObjPtr vm)
{
...
if (qemuDomainJobFormat(buf, priv->job, vm) < 0)
return -1;
...
}
This qemuDomainJobFormat() can look something like this:
int
qemuDomainObjJobFormat(virBufferPtr buf,
qemuDomainJobObjPtr job,
void *opaque)
{
g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
if (!qemuDomainTrackJob(job))
job = QEMU_JOB_NONE;
if (job == QEMU_JOB_NONE &&
jobObj->asyncJob == QEMU_ASYNC_JOB_NONE)
return 0;
virBufferAsprintf(&attrBuf, " type='%s' async='%s'",
qemuDomainJobTypeToString(job),
qemuDomainAsyncJobTypeToString(jobObj->asyncJob));
if (jobObj->phase) {
virBufferAsprintf(&attrBuf, " phase='%s'",
qemuDomainAsyncJobPhaseToString(jobObj->asyncJob,
jobObj->phase));
}
if (jobObj->asyncJob != QEMU_ASYNC_JOB_NONE)
virBufferAsprintf(&attrBuf, " flags='0x%lx'",
jobObj->apiFlags);
if (job->cb.formatJob(&childBuf, vm) < 0)
return -1;
virXMLFormatElement(buf, "job", &attrBuf, &childBuf);
return 0;
}
This looks very close to qemuDomainObjPrivateXMLFormatJob() and that is
exactly how we want it. Except all "private" data is now formatted using
callback (migParams for instance). Does this make more sense?
Yes, it does. I can see how this will be helpful when we'll be moving
the domainjob functions into a common file.
But I still think that, since the function outside domain job should
be allowed to access this callback function, even the function:
qemuDomainFormatJob() needs to be moved to qemu_domainjob from
qemu_domain.
So it makes this series have 4 patches:
1. Changing the params of qemuDomainObjPrivateXMLFormatJob and ParseJob.
2. Moving these functions to qemu_domainjob
3. Creating privateData and callback functions structure for qemuDomainJob
4. Creating privateData and callback functions structure for qemuDomainJobInfo
Thanks,
Prathamesh Chavan