[libvirt] [PATCH 12/14] Switch over to passing a callback table to QEMU monitor
Daniel Veillard
veillard at redhat.com
Thu Dec 3 15:08:41 UTC 2009
On Thu, Nov 26, 2009 at 06:27:30PM +0000, Daniel P. Berrange wrote:
> With addition of events there will be alot of callbacks.
> To avoid having to add many APIs to register callbacks,
> provide them all at once in a big table
>
> * src/qemu/qemu_driver.c: Pass in a callback table to QEMU
> monitor code
> * src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h Replace
> the EOF and disk secret callbacks with a callback table
> ---
> src/qemu/qemu_driver.c | 10 ++++++----
> src/qemu/qemu_monitor.c | 31 ++++++++++++++++++-------------
> src/qemu/qemu_monitor.h | 39 ++++++++++++++++++++-------------------
> 3 files changed, 44 insertions(+), 36 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index e3759bf..bf4557e 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -779,6 +779,11 @@ cleanup:
> return ret;
> }
>
> +static qemuMonitorCallbacks monitorCallbacks = {
> + .eofNotify = qemuHandleMonitorEOF,
> + .diskSecretLookup = findVolumeQcowPassphrase,
> +};
> +
> static int
> qemuConnectMonitor(virDomainObjPtr vm)
> {
> @@ -787,14 +792,11 @@ qemuConnectMonitor(virDomainObjPtr vm)
> if ((priv->mon = qemuMonitorOpen(vm,
> priv->monConfig,
> priv->monJSON,
> - qemuHandleMonitorEOF)) == NULL) {
> + &monitorCallbacks)) == NULL) {
> VIR_ERROR(_("Failed to connect monitor for %s\n"), vm->def->name);
> return -1;
> }
>
> - qemuMonitorRegisterDiskSecretLookup(priv->mon,
> - findVolumeQcowPassphrase);
> -
> return 0;
> }
>
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index 502b389..11025a7 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -53,8 +53,7 @@ struct _qemuMonitor {
>
> virDomainObjPtr vm;
>
> - qemuMonitorEOFNotify eofCB;
> - qemuMonitorDiskSecretLookup secretCB;
> + qemuMonitorCallbacksPtr cb;
>
> /* If there's a command being processed this will be
> * non-NULL */
> @@ -523,7 +522,7 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque) {
> virCondSignal(&mon->notify);
> qemuMonitorUnlock(mon);
> VIR_DEBUG("Triggering EOF callback error? %d", failed);
> - mon->eofCB(mon, mon->vm, failed);
> + mon->cb->eofNotify(mon, mon->vm, failed);
>
> qemuMonitorLock(mon);
> }
> @@ -542,10 +541,16 @@ qemuMonitorPtr
> qemuMonitorOpen(virDomainObjPtr vm,
> virDomainChrDefPtr config,
> int json,
> - qemuMonitorEOFNotify eofCB)
> + qemuMonitorCallbacksPtr cb)
> {
> qemuMonitorPtr mon;
>
> + if (!cb || !cb->eofNotify) {
> + qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> + _("EOF notify callback must be supplied"));
> + return NULL;
> + }
> +
> if (VIR_ALLOC(mon) < 0) {
> virReportOOMError(NULL);
> return NULL;
> @@ -567,8 +572,8 @@ qemuMonitorOpen(virDomainObjPtr vm,
> mon->fd = -1;
> mon->refs = 1;
> mon->vm = vm;
> - mon->eofCB = eofCB;
> mon->json = json;
> + mon->cb = cb;
> qemuMonitorLock(mon);
> virDomainObjRef(vm);
>
> @@ -655,13 +660,6 @@ int qemuMonitorClose(qemuMonitorPtr mon)
> }
>
>
> -void qemuMonitorRegisterDiskSecretLookup(qemuMonitorPtr mon,
> - qemuMonitorDiskSecretLookup secretCB)
> -{
> - mon->secretCB = secretCB;
> -}
> -
> -
> int qemuMonitorSend(qemuMonitorPtr mon,
> qemuMonitorMessagePtr msg)
> {
> @@ -697,10 +695,17 @@ int qemuMonitorGetDiskSecret(qemuMonitorPtr mon,
> char **secret,
> size_t *secretLen)
> {
> + int ret = -1;
> *secret = NULL;
> *secretLen = 0;
>
> - return mon->secretCB(mon, conn, mon->vm, path, secret, secretLen);
> + qemuMonitorRef(mon);
> + qemuMonitorUnlock(mon);
> + if (mon->cb && mon->cb->diskSecretLookup)
> + ret = mon->cb->diskSecretLookup(mon, conn, mon->vm, path, secret, secretLen);
> + qemuMonitorLock(mon);
> + qemuMonitorUnref(mon);
> + return ret;
> }
>
>
> diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
> index 0d9e315..7aa6ee5 100644
> --- a/src/qemu/qemu_monitor.h
> +++ b/src/qemu/qemu_monitor.h
> @@ -59,21 +59,25 @@ struct _qemuMonitorMessage {
> void *passwordOpaque;
> };
>
> -typedef void (*qemuMonitorEOFNotify)(qemuMonitorPtr mon,
> - virDomainObjPtr vm,
> - int withError);
> -
> -/* 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
> - * security drivers do, to avoid this
> - */
> -typedef int (*qemuMonitorDiskSecretLookup)(qemuMonitorPtr mon,
> - virConnectPtr conn,
> - virDomainObjPtr vm,
> - const char *path,
> - char **secret,
> - size_t *secretLen);
> +typedef struct _qemuMonitorCallbacks qemuMonitorCallbacks;
> +typedef qemuMonitorCallbacks *qemuMonitorCallbacksPtr;
> +struct _qemuMonitorCallbacks {
> + void (*eofNotify)(qemuMonitorPtr mon,
> + virDomainObjPtr vm,
> + int withError);
> + /* 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
> + * security drivers do, to avoid this
> + */
> + int (*diskSecretLookup)(qemuMonitorPtr mon,
> + virConnectPtr conn,
> + virDomainObjPtr vm,
> + const char *path,
> + char **secret,
> + size_t *secretLen);
> +};
> +
>
> char *qemuMonitorEscapeArg(const char *in);
> char *qemuMonitorEscapeShell(const char *in);
> @@ -81,7 +85,7 @@ char *qemuMonitorEscapeShell(const char *in);
> qemuMonitorPtr qemuMonitorOpen(virDomainObjPtr vm,
> virDomainChrDefPtr config,
> int json,
> - qemuMonitorEOFNotify eofCB);
> + qemuMonitorCallbacksPtr cb);
>
> int qemuMonitorClose(qemuMonitorPtr mon);
>
> @@ -91,9 +95,6 @@ void qemuMonitorUnlock(qemuMonitorPtr mon);
> int qemuMonitorRef(qemuMonitorPtr mon);
> int qemuMonitorUnref(qemuMonitorPtr mon);
>
> -void qemuMonitorRegisterDiskSecretLookup(qemuMonitorPtr mon,
> - qemuMonitorDiskSecretLookup secretCB);
> -
> /* This API is for use by the internal Text/JSON monitor impl code only */
> int qemuMonitorSend(qemuMonitorPtr mon,
> qemuMonitorMessagePtr msg);
ACK, too bad that patch is slightly dependant on the json changes,
it might be useful to apply independantly,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list