]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: domain: Add helper infrastructure for new connection close callbacks
authorPeter Krempa <pkrempa@redhat.com>
Wed, 13 Jul 2022 12:02:18 +0000 (14:02 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 6 Jan 2023 14:27:53 +0000 (15:27 +0100)
The new connect close callbacks for domains will be represented by a
virObject associated with the domain object itself.

To simplify handling the pointer to the close callback data will be done
by an immutable pointer allocated directly when allocating the
corresponding virDomainObj struct.

This patch adds the 'closecallbacks' field to virDomainObj and a
corresponding callback to allocate it into virDomainXMLOption.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms

index 6c088ff2954f2b9bd009a1b2af7f7d3d912516d7..66189277fd3d8fc48d53037e38c93bce207657ad 100644 (file)
@@ -1722,6 +1722,14 @@ virDomainXMLOptionGetSaveCookie(virDomainXMLOption *xmlopt)
 }
 
 
+void
+virDomainXMLOptionSetCloseCallbackAlloc(virDomainXMLOption *xmlopt,
+                                        virDomainCloseCallbackDataAlloc cb)
+{
+    xmlopt->closecallbackAlloc = cb;
+}
+
+
 void
 virDomainXMLOptionSetMomentPostParse(virDomainXMLOption *xmlopt,
                                      virDomainMomentPostParseCallback cb)
@@ -3906,6 +3914,7 @@ static void virDomainObjDispose(void *obj)
     virDomainSnapshotObjListFree(dom->snapshots);
     virDomainCheckpointObjListFree(dom->checkpoints);
     virDomainJobObjFree(dom->job);
+    virObjectUnref(dom->closecallbacks);
 }
 
 virDomainObj *
@@ -3932,6 +3941,10 @@ virDomainObjNew(virDomainXMLOption *xmlopt)
         domain->privateDataFreeFunc = xmlopt->privateData.free;
     }
 
+    if (xmlopt->closecallbackAlloc) {
+        domain->closecallbacks = (xmlopt->closecallbackAlloc)();
+    }
+
     if (!(domain->snapshots = virDomainSnapshotObjListNew()))
         goto error;
 
index 1404c550533d2c2c221796ebc7555c19a2b985fe..33c4ff69ddbdd082196e199719ca400edb6685da 100644 (file)
@@ -3126,6 +3126,23 @@ struct _virDomainObj {
     void *privateData;
     void (*privateDataFreeFunc)(void *);
 
+    /* Connection close callbacks helper data
+     *
+     * Immutable pointer sharing lifetime of the virDomainObj. May be NULL, if
+     * the hypervisor driver doesn't use close callbacks.
+     *
+     * The closecallbacks helper data may be accessed without holding the
+     * virDomainObj lock to check whether a connection being closed has a
+     * registered close callback.
+     *
+     * Otherwise virDomainObj must be held and acquired before the lock on the
+     * closecallbacks data.
+     *
+     * The above rules ensure minimal lock contention when closing the
+     * connection while also allowing correct handling.
+    */
+    virObject *closecallbacks;
+
     int taint;
     size_t ndeprecations;
     char **deprecations;
@@ -3304,6 +3321,11 @@ struct _virDomainJobObjConfig {
     unsigned int maxQueuedJobs;
 };
 
+
+typedef virObject *(*virDomainCloseCallbackDataAlloc)(void);
+void virDomainXMLOptionSetCloseCallbackAlloc(virDomainXMLOption *xmlopt,
+                                             virDomainCloseCallbackDataAlloc cb);
+
 virDomainXMLOption *virDomainXMLOptionNew(virDomainDefParserConfig *config,
                                           virDomainXMLPrivateDataCallbacks *priv,
                                           virXMLNamespace *xmlns,
@@ -3352,6 +3374,9 @@ struct _virDomainXMLOption {
 
     /* virDomainJobObj callbacks, private data callbacks and defaults */
     virDomainJobObjConfig jobObjConfig;
+
+    /* closecallback allocation callback */
+    virDomainCloseCallbackDataAlloc closecallbackAlloc;
 };
 G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainXMLOption, virObjectUnref);
 
index 54a3859604c3741ce9445a13af447073fc77fd68..8f50f9fa1eb44806e9ed54baa8efce1c5b98adf3 100644 (file)
@@ -699,6 +699,7 @@ virDomainXenPassthroughModeTypeToString;
 virDomainXMLOptionGetNamespace;
 virDomainXMLOptionGetSaveCookie;
 virDomainXMLOptionNew;
+virDomainXMLOptionSetCloseCallbackAlloc;
 virDomainXMLOptionSetMomentPostParse;