We will have to pass a mock-up of the driver when testing monitor events. --- src/qemu/qemu_capabilities.c | 5 ++- src/qemu/qemu_monitor.c | 24 +++++++---- src/qemu/qemu_monitor.h | 69 ++++++++++++++++++++---------- src/qemu/qemu_process.c | 99 +++++++++++++++++++++++++++----------------- tests/qemumonitortestutils.c | 9 ++-- 5 files changed, 130 insertions(+), 76 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 08406b8..718b8d3 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2352,7 +2352,8 @@ cleanup: static void virQEMUCapsMonitorNotify(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - virDomainObjPtr vm ATTRIBUTE_UNUSED) + virDomainObjPtr vm ATTRIBUTE_UNUSED, + void *opaque ATTRIBUTE_UNUSED) { } @@ -2544,7 +2545,7 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps, memset(&vm, 0, sizeof(vm)); vm.pid = pid; - if (!(mon = qemuMonitorOpen(&vm, &config, true, &callbacks))) { + if (!(mon = qemuMonitorOpen(&vm, &config, true, &callbacks, NULL))) { ret = 0; goto cleanup; } diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 2801c9c..ecec8e2 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -61,6 +61,7 @@ struct _qemuMonitor { virDomainObjPtr vm; qemuMonitorCallbacksPtr cb; + void *callbackOpaque; /* If there's a command being processed this will be * non-NULL */ @@ -248,7 +249,7 @@ static void qemuMonitorDispose(void *obj) VIR_DEBUG("mon=%p", mon); if (mon->cb && mon->cb->destroy) - (mon->cb->destroy)(mon, mon->vm); + (mon->cb->destroy)(mon, mon->vm, mon->callbackOpaque); virCondDestroy(&mon->notify); VIR_FREE(mon->buffer); virJSONValueFree(mon->options); @@ -668,7 +669,7 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque) { virObjectUnlock(mon); virObjectUnref(mon); VIR_DEBUG("Triggering EOF callback"); - (eofNotify)(mon, vm); + (eofNotify)(mon, vm, mon->callbackOpaque); } else if (error) { qemuMonitorErrorNotifyCallback errorNotify = mon->cb->errorNotify; virDomainObjPtr vm = mon->vm; @@ -678,7 +679,7 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque) { virObjectUnlock(mon); virObjectUnref(mon); VIR_DEBUG("Triggering error callback"); - (errorNotify)(mon, vm); + (errorNotify)(mon, vm, mon->callbackOpaque); } else { virObjectUnlock(mon); virObjectUnref(mon); @@ -691,7 +692,8 @@ qemuMonitorOpenInternal(virDomainObjPtr vm, int fd, bool hasSendFD, bool json, - qemuMonitorCallbacksPtr cb) + qemuMonitorCallbacksPtr cb, + void *opaque) { qemuMonitorPtr mon; @@ -725,6 +727,7 @@ qemuMonitorOpenInternal(virDomainObjPtr vm, if (json) mon->waitGreeting = true; mon->cb = cb; + mon->callbackOpaque = opaque; if (virSetCloseExec(mon->fd) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -778,7 +781,8 @@ qemuMonitorPtr qemuMonitorOpen(virDomainObjPtr vm, virDomainChrSourceDefPtr config, bool json, - qemuMonitorCallbacksPtr cb) + qemuMonitorCallbacksPtr cb, + void *opaque) { int fd; bool hasSendFD = false; @@ -803,7 +807,7 @@ qemuMonitorOpen(virDomainObjPtr vm, return NULL; } - ret = qemuMonitorOpenInternal(vm, fd, hasSendFD, json, cb); + ret = qemuMonitorOpenInternal(vm, fd, hasSendFD, json, cb, opaque); if (!ret) VIR_FORCE_CLOSE(fd); return ret; @@ -813,9 +817,10 @@ qemuMonitorOpen(virDomainObjPtr vm, qemuMonitorPtr qemuMonitorOpenFD(virDomainObjPtr vm, int sockfd, bool json, - qemuMonitorCallbacksPtr cb) + qemuMonitorCallbacksPtr cb, + void *opaque) { - return qemuMonitorOpenInternal(vm, sockfd, true, json, cb); + return qemuMonitorOpenInternal(vm, sockfd, true, json, cb, opaque); } @@ -1068,7 +1073,8 @@ cleanup: virObjectRef(mon); \ virObjectUnlock(mon); \ if ((mon)->cb && (mon)->cb->callback) \ - (ret) = ((mon)->cb->callback)(mon, __VA_ARGS__); \ + (ret) = (mon)->cb->callback(mon, __VA_ARGS__, \ + (mon)->callbackOpaque); \ virObjectLock(mon); \ virObjectUnref(mon); \ } while (0) diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 9e12788..5fe33db 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -69,11 +69,14 @@ struct _qemuMonitorMessage { typedef void (*qemuMonitorDestroyCallback)(qemuMonitorPtr mon, - virDomainObjPtr vm); + virDomainObjPtr vm, + void *opaque); typedef void (*qemuMonitorEofNotifyCallback)(qemuMonitorPtr mon, - virDomainObjPtr vm); + virDomainObjPtr vm, + void *opaque); typedef void (*qemuMonitorErrorNotifyCallback)(qemuMonitorPtr mon, - virDomainObjPtr vm); + virDomainObjPtr vm, + void *opaque); /* XXX we'd really like to avoid virConnectPtr here * It is required so the callback can find the active * secret driver. Need to change this to work like the @@ -84,28 +87,37 @@ typedef int (*qemuMonitorDiskSecretLookupCallback)(qemuMonitorPtr mon, virDomainObjPtr vm, const char *path, char **secret, - size_t *secretLen); + size_t *secretLen, + void *opaque); typedef int (*qemuMonitorDomainShutdownCallback)(qemuMonitorPtr mon, - virDomainObjPtr vm); + virDomainObjPtr vm, + void *opaque); typedef int (*qemuMonitorDomainResetCallback)(qemuMonitorPtr mon, - virDomainObjPtr vm); + virDomainObjPtr vm, + void *opaque); typedef int (*qemuMonitorDomainPowerdownCallback)(qemuMonitorPtr mon, - virDomainObjPtr vm); + virDomainObjPtr vm, + void *opaque); typedef int (*qemuMonitorDomainStopCallback)(qemuMonitorPtr mon, - virDomainObjPtr vm); + virDomainObjPtr vm, + void *opaque); typedef int (*qemuMonitorDomainResumeCallback)(qemuMonitorPtr mon, - virDomainObjPtr vm); + virDomainObjPtr vm, + void *opaque); typedef int (*qemuMonitorDomainRTCChangeCallback)(qemuMonitorPtr mon, virDomainObjPtr vm, - long long offset); + long long offset, + void *opaque); typedef int (*qemuMonitorDomainWatchdogCallback)(qemuMonitorPtr mon, virDomainObjPtr vm, - int action); + int action, + void *opaque); typedef int (*qemuMonitorDomainIOErrorCallback)(qemuMonitorPtr mon, virDomainObjPtr vm, const char *diskAlias, int action, - const char *reason); + const char *reason, + void *opaque); typedef int (*qemuMonitorDomainGraphicsCallback)(qemuMonitorPtr mon, virDomainObjPtr vm, int phase, @@ -117,30 +129,39 @@ typedef int (*qemuMonitorDomainGraphicsCallback)(qemuMonitorPtr mon, const char *remoteService, const char *authScheme, const char *x509dname, - const char *saslUsername); + const char *saslUsername, + void *opaque); typedef int (*qemuMonitorDomainBlockJobCallback)(qemuMonitorPtr mon, virDomainObjPtr vm, const char *diskAlias, int type, - int status); + int status, + void *opaque); typedef int (*qemuMonitorDomainTrayChangeCallback)(qemuMonitorPtr mon, virDomainObjPtr vm, const char *devAlias, - int reason); + int reason, + void *opaque); typedef int (*qemuMonitorDomainPMWakeupCallback)(qemuMonitorPtr mon, - virDomainObjPtr vm); + virDomainObjPtr vm, + void *opaque); typedef int (*qemuMonitorDomainPMSuspendCallback)(qemuMonitorPtr mon, - virDomainObjPtr vm); + virDomainObjPtr vm, + void *opaque); typedef int (*qemuMonitorDomainBalloonChangeCallback)(qemuMonitorPtr mon, virDomainObjPtr vm, - unsigned long long actual); + unsigned long long actual, + void *opaque); typedef int (*qemuMonitorDomainPMSuspendDiskCallback)(qemuMonitorPtr mon, - virDomainObjPtr vm); + virDomainObjPtr vm, + void *opaque); typedef int (*qemuMonitorDomainGuestPanicCallback)(qemuMonitorPtr mon, - virDomainObjPtr vm); + virDomainObjPtr vm, + void *opaque); typedef int (*qemuMonitorDomainDeviceDeletedCallback)(qemuMonitorPtr mon, virDomainObjPtr vm, - const char *devAlias); + const char *devAlias, + void *opaque); typedef struct _qemuMonitorCallbacks qemuMonitorCallbacks; typedef qemuMonitorCallbacks *qemuMonitorCallbacksPtr; @@ -174,12 +195,14 @@ char *qemuMonitorUnescapeArg(const char *in); qemuMonitorPtr qemuMonitorOpen(virDomainObjPtr vm, virDomainChrSourceDefPtr config, bool json, - qemuMonitorCallbacksPtr cb) + qemuMonitorCallbacksPtr cb, + void *opaque) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4); qemuMonitorPtr qemuMonitorOpenFD(virDomainObjPtr vm, int sockfd, bool json, - qemuMonitorCallbacksPtr cb) + qemuMonitorCallbacksPtr cb, + void *opaque) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(4); void qemuMonitorClose(qemuMonitorPtr mon); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 0dccac3..0d48f4f 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -280,9 +280,10 @@ cleanup: */ static void qemuProcessHandleMonitorEOF(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - virDomainObjPtr vm) + virDomainObjPtr vm, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virDomainEventPtr event = NULL; qemuDomainObjPrivatePtr priv; int eventReason = VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN; @@ -341,9 +342,10 @@ cleanup: */ static void qemuProcessHandleMonitorError(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - virDomainObjPtr vm) + virDomainObjPtr vm, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virDomainEventPtr event = NULL; VIR_DEBUG("Received error on %p '%s'", vm, vm->def->name); @@ -486,7 +488,8 @@ qemuProcessFindVolumeQcowPassphrase(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virDomainObjPtr vm, const char *path, char **secretRet, - size_t *secretLen) + size_t *secretLen, + void *opaque ATTRIBUTE_UNUSED) { virDomainDiskDefPtr disk; int ret = -1; @@ -507,9 +510,10 @@ cleanup: static int qemuProcessHandleReset(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - virDomainObjPtr vm) + virDomainObjPtr vm, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virDomainEventPtr event; qemuDomainObjPrivatePtr priv; @@ -637,9 +641,10 @@ qemuProcessShutdownOrReboot(virQEMUDriverPtr driver, static int qemuProcessHandleShutdown(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - virDomainObjPtr vm) + virDomainObjPtr vm, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; qemuDomainObjPrivatePtr priv; virDomainEventPtr event = NULL; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); @@ -691,9 +696,10 @@ unlock: static int qemuProcessHandleStop(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - virDomainObjPtr vm) + virDomainObjPtr vm, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virDomainEventPtr event = NULL; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); @@ -737,9 +743,10 @@ unlock: static int qemuProcessHandleResume(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - virDomainObjPtr vm) + virDomainObjPtr vm, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virDomainEventPtr event = NULL; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); @@ -790,9 +797,10 @@ unlock: static int qemuProcessHandleRTCChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virDomainObjPtr vm, - long long offset) + long long offset, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virDomainEventPtr event = NULL; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); @@ -830,9 +838,10 @@ qemuProcessHandleRTCChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, static int qemuProcessHandleWatchdog(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virDomainObjPtr vm, - int action) + int action, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virDomainEventPtr watchdogEvent = NULL; virDomainEventPtr lifecycleEvent = NULL; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); @@ -896,9 +905,10 @@ qemuProcessHandleIOError(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virDomainObjPtr vm, const char *diskAlias, int action, - const char *reason) + const char *reason, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virDomainEventPtr ioErrorEvent = NULL; virDomainEventPtr ioErrorEvent2 = NULL; virDomainEventPtr lifecycleEvent = NULL; @@ -956,9 +966,10 @@ qemuProcessHandleBlockJob(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virDomainObjPtr vm, const char *diskAlias, int type, - int status) + int status, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virDomainEventPtr event = NULL; const char *path; virDomainDiskDefPtr disk; @@ -1008,9 +1019,10 @@ qemuProcessHandleGraphics(qemuMonitorPtr mon ATTRIBUTE_UNUSED, const char *remoteService, const char *authScheme, const char *x509dname, - const char *saslUsername) + const char *saslUsername, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virDomainEventPtr event; virDomainEventGraphicsAddressPtr localAddr = NULL; virDomainEventGraphicsAddressPtr remoteAddr = NULL; @@ -1084,7 +1096,8 @@ error: static void qemuProcessHandleMonitorDestroy(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - virDomainObjPtr vm) + virDomainObjPtr vm, + void *opaque ATTRIBUTE_UNUSED) { virObjectUnref(vm); } @@ -1093,9 +1106,10 @@ static int qemuProcessHandleTrayChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virDomainObjPtr vm, const char *devAlias, - int reason) + int reason, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virDomainEventPtr event = NULL; virDomainDiskDefPtr disk; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); @@ -1128,9 +1142,10 @@ qemuProcessHandleTrayChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, static int qemuProcessHandlePMWakeup(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - virDomainObjPtr vm) + virDomainObjPtr vm, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virDomainEventPtr event = NULL; virDomainEventPtr lifecycleEvent = NULL; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); @@ -1168,9 +1183,10 @@ qemuProcessHandlePMWakeup(qemuMonitorPtr mon ATTRIBUTE_UNUSED, static int qemuProcessHandlePMSuspend(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - virDomainObjPtr vm) + virDomainObjPtr vm, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virDomainEventPtr event = NULL; virDomainEventPtr lifecycleEvent = NULL; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); @@ -1212,9 +1228,10 @@ qemuProcessHandlePMSuspend(qemuMonitorPtr mon ATTRIBUTE_UNUSED, static int qemuProcessHandleBalloonChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virDomainObjPtr vm, - unsigned long long actual) + unsigned long long actual, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virDomainEventPtr event = NULL; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); @@ -1238,9 +1255,10 @@ qemuProcessHandleBalloonChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, static int qemuProcessHandlePMSuspendDisk(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - virDomainObjPtr vm) + virDomainObjPtr vm, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virDomainEventPtr event = NULL; virDomainEventPtr lifecycleEvent = NULL; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); @@ -1283,9 +1301,10 @@ qemuProcessHandlePMSuspendDisk(qemuMonitorPtr mon ATTRIBUTE_UNUSED, static int qemuProcessHandleGuestPanic(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - virDomainObjPtr vm) + virDomainObjPtr vm, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; struct qemuProcessEvent *processEvent; virObjectLock(vm); @@ -1316,9 +1335,10 @@ cleanup: static int qemuProcessHandleDeviceDeleted(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virDomainObjPtr vm, - const char *devAlias) + const char *devAlias, + void *opaque) { - virQEMUDriverPtr driver = qemu_driver; + virQEMUDriverPtr driver = opaque; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virDomainDeviceDef dev; @@ -1391,7 +1411,8 @@ qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm) mon = qemuMonitorOpen(vm, priv->monConfig, priv->monJSON, - &monitorCallbacks); + &monitorCallbacks, + driver); virObjectLock(vm); priv->monStart = 0; diff --git a/tests/qemumonitortestutils.c b/tests/qemumonitortestutils.c index fb76156..93fb342 100644 --- a/tests/qemumonitortestutils.c +++ b/tests/qemumonitortestutils.c @@ -708,14 +708,16 @@ error: static void qemuMonitorTestEOFNotify(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - virDomainObjPtr vm ATTRIBUTE_UNUSED) + virDomainObjPtr vm ATTRIBUTE_UNUSED, + void *opaque ATTRIBUTE_UNUSED) { } static void qemuMonitorTestErrorNotify(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - virDomainObjPtr vm ATTRIBUTE_UNUSED) + virDomainObjPtr vm ATTRIBUTE_UNUSED, + void *opaque ATTRIBUTE_UNUSED) { } @@ -870,7 +872,8 @@ qemuMonitorTestNew(bool json, virDomainXMLOptionPtr xmlopt) if (!(test->mon = qemuMonitorOpen(test->vm, &src, json, - &qemuMonitorTestCallbacks))) + &qemuMonitorTestCallbacks, + NULL))) goto error; virObjectLock(test->mon); -- 1.8.3.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list