]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Switch over to passing a callback table to QEMU monitor
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 15 Oct 2009 17:56:52 +0000 (18:56 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 8 Dec 2009 13:46:55 +0000 (13:46 +0000)
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
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h

index 005647e871b5f55ae76f87bbdb66a55cccf852cf..7dfd1e692cf1f172e32a357dd163924d279c9b25 100644 (file)
@@ -794,6 +794,11 @@ cleanup:
     return ret;
 }
 
+static qemuMonitorCallbacks monitorCallbacks = {
+    .eofNotify = qemuHandleMonitorEOF,
+    .diskSecretLookup = findVolumeQcowPassphrase,
+};
+
 static int
 qemuConnectMonitor(virDomainObjPtr vm)
 {
@@ -806,14 +811,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;
 }
 
index 1d771feacdc73d0e5a83bf763c51cd7b60eb4029..b8e827160375bf69c13582072e49e3242eb6a6bd 100644 (file)
@@ -51,8 +51,7 @@ struct _qemuMonitor {
 
     virDomainObjPtr vm;
 
-    qemuMonitorEOFNotify eofCB;
-    qemuMonitorDiskSecretLookup secretCB;
+    qemuMonitorCallbacksPtr cb;
 
     /* If there's a command being processed this will be
      * non-NULL */
@@ -517,14 +516,15 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque) {
      * but is this safe ?  I think it is, because the callback
      * will try to acquire the virDomainObjPtr mutex next */
     if (failed || quit) {
-        qemuMonitorEOFNotify eofCB = mon->eofCB;
+        void (*eofNotify)(qemuMonitorPtr, virDomainObjPtr, int)
+            = mon->cb->eofNotify;
         virDomainObjPtr vm = mon->vm;
         /* Make sure anyone waiting wakes up now */
         virCondSignal(&mon->notify);
         if (qemuMonitorUnref(mon) > 0)
             qemuMonitorUnlock(mon);
         VIR_DEBUG("Triggering EOF callback error? %d", failed);
-        (eofCB)(mon, vm, failed);
+        (eofNotify)(mon, vm, failed);
     } else {
         if (qemuMonitorUnref(mon) > 0)
             qemuMonitorUnlock(mon);
@@ -536,10 +536,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;
@@ -561,8 +567,8 @@ qemuMonitorOpen(virDomainObjPtr vm,
     mon->fd = -1;
     mon->refs = 1;
     mon->vm = vm;
-    mon->eofCB = eofCB;
     mon->json = json;
+    mon->cb = cb;
     qemuMonitorLock(mon);
 
     switch (config->type) {
@@ -648,13 +654,6 @@ int qemuMonitorClose(qemuMonitorPtr mon)
 }
 
 
-void qemuMonitorRegisterDiskSecretLookup(qemuMonitorPtr mon,
-                                         qemuMonitorDiskSecretLookup secretCB)
-{
-    mon->secretCB = secretCB;
-}
-
-
 int qemuMonitorSend(qemuMonitorPtr mon,
                     qemuMonitorMessagePtr msg)
 {
@@ -690,10 +689,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;
 }
 
 
index 0d9e315608c759077fa29bdbc8295ad82baf433e..7aa6ee58c0ba6c9a1624793139efdffd090dc1fa 100644 (file)
@@ -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);