]> xenbits.xensource.com Git - libvirt.git/commitdiff
Change virDomainEventState to virObjectLockable
authorMartin Kletzander <mkletzan@redhat.com>
Tue, 11 Oct 2016 07:48:36 +0000 (09:48 +0200)
committerMartin Kletzander <mkletzan@redhat.com>
Wed, 12 Oct 2016 10:54:47 +0000 (12:54 +0200)
This way we get reference counting and we can get rid of locking
function.

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
17 files changed:
cfg.mk
src/bhyve/bhyve_driver.c
src/conf/object_event.c
src/conf/object_event.h
src/libvirt_private.syms
src/libxl/libxl_driver.c
src/lxc/lxc_driver.c
src/network/bridge_driver.c
src/node_device/node_device_udev.c
src/qemu/qemu_driver.c
src/remote/remote_driver.c
src/storage/storage_driver.c
src/test/test_driver.c
src/uml/uml_driver.c
src/vbox/vbox_common.c
src/vz/vz_driver.c
src/xen/xen_driver.c

diff --git a/cfg.mk b/cfg.mk
index 9f5949cb250a340e483a890c6e04be8b3dcc9856..cc17ec0cf0aa3e3373d61a2a9b2d79e0f53c735b 100644 (file)
--- a/cfg.mk
+++ b/cfg.mk
@@ -127,7 +127,6 @@ useless_free_options =                              \
   --name=virDomainDiskDefFree                  \
   --name=virDomainEventCallbackListFree                \
   --name=virObjectEventQueueFree               \
-  --name=virObjectEventStateFree               \
   --name=virDomainFSDefFree                    \
   --name=virDomainGraphicsDefFree              \
   --name=virDomainHostdevDefFree               \
index 49b9e1a60626e334005eaa98b63f910af7b5bec1..04be78b675f72bb6b05500e96534b117898c61be 100644 (file)
@@ -1198,7 +1198,7 @@ bhyveStateCleanup(void)
     virObjectUnref(bhyve_driver->xmlopt);
     virSysinfoDefFree(bhyve_driver->hostsysinfo);
     virObjectUnref(bhyve_driver->closeCallbacks);
-    virObjectEventStateFree(bhyve_driver->domainEventState);
+    virObjectUnref(bhyve_driver->domainEventState);
 
     virMutexDestroy(&bhyve_driver->lock);
     VIR_FREE(bhyve_driver);
index e5af4be68a7e9a7b4593cb80f44eae1df028d7f5..b859835b47a1e1b0151736b0a0bd48083d231a42 100644 (file)
@@ -32,6 +32,7 @@
 #include "datatypes.h"
 #include "viralloc.h"
 #include "virerror.h"
+#include "virobject.h"
 #include "virstring.h"
 
 #define VIR_FROM_THIS VIR_FROM_NONE
@@ -71,6 +72,7 @@ typedef struct _virObjectEventQueue virObjectEventQueue;
 typedef virObjectEventQueue *virObjectEventQueuePtr;
 
 struct _virObjectEventState {
+    virObjectLockable parent;
     /* The list of domain event callbacks */
     virObjectEventCallbackListPtr callbacks;
     /* The queue of object events */
@@ -79,22 +81,31 @@ struct _virObjectEventState {
     int timer;
     /* Flag if we're in process of dispatching */
     bool isDispatching;
-    virMutex lock;
 };
 
 static virClassPtr virObjectEventClass;
+static virClassPtr virObjectEventStateClass;
 
 static void virObjectEventDispose(void *obj);
+static void virObjectEventStateDispose(void *obj);
 
 static int
 virObjectEventOnceInit(void)
 {
+    if (!(virObjectEventStateClass =
+          virClassNew(virClassForObjectLockable(),
+                      "virObjectEventState",
+                      sizeof(virObjectEventState),
+                      virObjectEventStateDispose)))
+        return -1;
+
     if (!(virObjectEventClass =
           virClassNew(virClassForObject(),
                       "virObjectEvent",
                       sizeof(virObjectEvent),
                       virObjectEventDispose)))
         return -1;
+
     return 0;
 }
 
@@ -504,51 +515,23 @@ virObjectEventQueueNew(void)
 
 
 /**
- * virObjectEventStateLock:
- * @state: the event state object
- *
- * Lock event state before calling functions from object_event_private.h.
- */
-static void
-virObjectEventStateLock(virObjectEventStatePtr state)
-{
-    virMutexLock(&state->lock);
-}
-
-
-/**
- * virObjectEventStateUnlock:
- * @state: the event state object
- *
- * Unlock event state after calling functions from object_event_private.h.
- */
-static void
-virObjectEventStateUnlock(virObjectEventStatePtr state)
-{
-    virMutexUnlock(&state->lock);
-}
-
-
-/**
- * virObjectEventStateFree:
+ * virObjectEventStateDispose:
  * @list: virObjectEventStatePtr to free
  *
  * Free a virObjectEventStatePtr and its members, and unregister the timer.
  */
-void
-virObjectEventStateFree(virObjectEventStatePtr state)
+static void
+virObjectEventStateDispose(void *obj)
 {
-    if (!state)
-        return;
+    virObjectEventStatePtr state = obj;
+
+    VIR_DEBUG("obj=%p", state);
 
     virObjectEventCallbackListFree(state->callbacks);
     virObjectEventQueueFree(state->queue);
 
     if (state->timer != -1)
         virEventRemoveTimeout(state->timer);
-
-    virMutexDestroy(&state->lock);
-    VIR_FREE(state);
 }
 
 
@@ -583,15 +566,11 @@ virObjectEventStateNew(void)
 {
     virObjectEventStatePtr state = NULL;
 
-    if (VIR_ALLOC(state) < 0)
-        goto error;
+    if (virObjectEventInitialize() < 0)
+        return NULL;
 
-    if (virMutexInit(&state->lock) < 0) {
-        virReportSystemError(errno, "%s",
-                             _("unable to initialize state mutex"));
-        VIR_FREE(state);
-        goto error;
-    }
+    if (!(state = virObjectLockableNew(virObjectEventStateClass)))
+        return NULL;
 
     if (VIR_ALLOC(state->callbacks) < 0)
         goto error;
@@ -604,7 +583,7 @@ virObjectEventStateNew(void)
     return state;
 
  error:
-    virObjectEventStateFree(state);
+    virObjectUnref(state);
     return NULL;
 }
 
@@ -727,9 +706,9 @@ virObjectEventStateDispatchCallbacks(virObjectEventStatePtr state,
             continue;
 
         /* Drop the lock whle dispatching, for sake of re-entrancy */
-        virObjectEventStateUnlock(state);
+        virObjectUnlock(state);
         event->dispatch(cb->conn, event, cb->cb, cb->opaque);
-        virObjectEventStateLock(state);
+        virObjectLock(state);
     }
 }
 
@@ -773,7 +752,7 @@ virObjectEventStateQueueRemote(virObjectEventStatePtr state,
         return;
     }
 
-    virObjectEventStateLock(state);
+    virObjectLock(state);
 
     event->remoteID = remoteID;
     if (virObjectEventQueuePush(state->queue, event) < 0) {
@@ -783,7 +762,7 @@ virObjectEventStateQueueRemote(virObjectEventStatePtr state,
 
     if (state->queue->count == 1)
         virEventUpdateTimeout(state->timer, 0);
-    virObjectEventStateUnlock(state);
+    virObjectUnlock(state);
 }
 
 
@@ -809,7 +788,7 @@ virObjectEventStateFlush(virObjectEventStatePtr state)
 {
     virObjectEventQueue tempQueue;
 
-    virObjectEventStateLock(state);
+    virObjectLock(state);
     state->isDispatching = true;
 
     /* Copy the queue, so we're reentrant safe when dispatchFunc drops the
@@ -829,7 +808,7 @@ virObjectEventStateFlush(virObjectEventStatePtr state)
     virObjectEventCallbackListPurgeMarked(state->callbacks);
 
     state->isDispatching = false;
-    virObjectEventStateUnlock(state);
+    virObjectUnlock(state);
 }
 
 
@@ -884,7 +863,7 @@ virObjectEventStateRegisterID(virConnectPtr conn,
 {
     int ret = -1;
 
-    virObjectEventStateLock(state);
+    virObjectLock(state);
 
     if ((state->callbacks->count == 0) &&
         (state->timer == -1) &&
@@ -911,7 +890,7 @@ virObjectEventStateRegisterID(virConnectPtr conn,
     }
 
  cleanup:
-    virObjectEventStateUnlock(state);
+    virObjectUnlock(state);
     return ret;
 }
 
@@ -934,7 +913,7 @@ virObjectEventStateDeregisterID(virConnectPtr conn,
 {
     int ret;
 
-    virObjectEventStateLock(state);
+    virObjectLock(state);
     if (state->isDispatching)
         ret = virObjectEventCallbackListMarkDeleteID(conn,
                                                      state->callbacks,
@@ -950,7 +929,7 @@ virObjectEventStateDeregisterID(virConnectPtr conn,
         virObjectEventQueueClear(state->queue);
     }
 
-    virObjectEventStateUnlock(state);
+    virObjectUnlock(state);
     return ret;
 }
 
@@ -978,11 +957,11 @@ virObjectEventStateCallbackID(virConnectPtr conn,
 {
     int ret = -1;
 
-    virObjectEventStateLock(state);
+    virObjectLock(state);
     ret = virObjectEventCallbackLookup(conn, state->callbacks, NULL,
                                        klass, eventID, callback, true,
                                        remoteID);
-    virObjectEventStateUnlock(state);
+    virObjectUnlock(state);
 
     if (ret < 0)
         virReportError(VIR_ERR_INVALID_ARG,
@@ -1016,7 +995,7 @@ virObjectEventStateEventID(virConnectPtr conn,
     size_t i;
     virObjectEventCallbackListPtr cbList = state->callbacks;
 
-    virObjectEventStateLock(state);
+    virObjectLock(state);
     for (i = 0; i < cbList->count; i++) {
         virObjectEventCallbackPtr cb = cbList->callbacks[i];
 
@@ -1030,7 +1009,7 @@ virObjectEventStateEventID(virConnectPtr conn,
             break;
         }
     }
-    virObjectEventStateUnlock(state);
+    virObjectUnlock(state);
 
     if (ret < 0)
         virReportError(VIR_ERR_INVALID_ARG,
@@ -1060,7 +1039,7 @@ virObjectEventStateSetRemote(virConnectPtr conn,
 {
     size_t i;
 
-    virObjectEventStateLock(state);
+    virObjectLock(state);
     for (i = 0; i < state->callbacks->count; i++) {
         virObjectEventCallbackPtr cb = state->callbacks->callbacks[i];
 
@@ -1072,5 +1051,5 @@ virObjectEventStateSetRemote(virConnectPtr conn,
             break;
         }
     }
-    virObjectEventStateUnlock(state);
+    virObjectUnlock(state);
 }
index b0201ddd5a1269f4639d651cfc05d8bb1ca39358..7a9995e122e7089cf47fcda8631ea4e6e4d1cf3c 100644 (file)
@@ -40,7 +40,6 @@ typedef struct _virObjectEventState virObjectEventState;
 typedef virObjectEventState *virObjectEventStatePtr;
 
 
-void virObjectEventStateFree(virObjectEventStatePtr state);
 virObjectEventStatePtr
 virObjectEventStateNew(void);
 
index 11a90b18740577f16040e9ae7f8e60513996fe83..55b6a2402bf69566ca477bf373e335edd04b2532 100644 (file)
@@ -819,7 +819,6 @@ virNWFilterVarValueGetSimple;
 # conf/object_event.h
 virObjectEventStateDeregisterID;
 virObjectEventStateEventID;
-virObjectEventStateFree;
 virObjectEventStateNew;
 virObjectEventStateQueue;
 
index b66cb1f7ef35f3c2f735cd9103b911ab5f480af9..89afbbd454a127193ed4217ea32a88a047e6269b 100644 (file)
@@ -479,7 +479,7 @@ libxlStateCleanup(void)
     virObjectUnref(libxl_driver->migrationPorts);
     virLockManagerPluginUnref(libxl_driver->lockManager);
 
-    virObjectEventStateFree(libxl_driver->domainEventState);
+    virObjectUnref(libxl_driver->domainEventState);
     virSysinfoDefFree(libxl_driver->hostsysinfo);
 
     virMutexDestroy(&libxl_driver->lock);
index a9e664cfb5388c33bd4ea003b9e47ddf6cad1a46..cf30a6638b6f5626123aac872cbf210afc420150 100644 (file)
@@ -1781,7 +1781,7 @@ static int lxcStateCleanup(void)
 
     virNWFilterUnRegisterCallbackDriver(&lxcCallbackDriver);
     virObjectUnref(lxc_driver->domains);
-    virObjectEventStateFree(lxc_driver->domainEventState);
+    virObjectUnref(lxc_driver->domainEventState);
 
     virObjectUnref(lxc_driver->closeCallbacks);
 
index 72687dc227a53f4b6dd2f8132277e1f356f09800..b2af482725416d84e9881feae9ae65b16b1b56ab 100644 (file)
@@ -777,7 +777,7 @@ networkStateCleanup(void)
     if (!network_driver)
         return -1;
 
-    virObjectEventStateFree(network_driver->networkEventState);
+    virObjectUnref(network_driver->networkEventState);
 
     /* free inactive networks */
     virObjectUnref(network_driver->networks);
index 520269fbe94c5b12a3f60969c4329cfce3c8db3e..4b813127cb138f7fb4a52f636b8ab0988d6d77ed 100644 (file)
@@ -1269,7 +1269,7 @@ static int nodeStateCleanup(void)
 
     nodeDeviceLock();
 
-    virObjectEventStateFree(driver->nodeDeviceEventState);
+    virObjectUnref(driver->nodeDeviceEventState);
 
     priv = driver->privateData;
 
index e6f845de6a8e42ff4f3cd08fe32e0b81f6be2eb1..8789c9d004aa128e237457328db2596db4bdfd2f 100644 (file)
@@ -1094,7 +1094,7 @@ qemuStateCleanup(void)
     ebtablesContextFree(qemu_driver->ebtables);
 
     /* Free domain callback list */
-    virObjectEventStateFree(qemu_driver->domainEventState);
+    virObjectUnref(qemu_driver->domainEventState);
 
     virLockManagerPluginUnref(qemu_driver->lockManager);
 
index f6c6940095acbc445362b8b1bf88554033206f78..a3cd7cd632233d21d54e7efb39e2918eb282a7f0 100644 (file)
@@ -1343,7 +1343,7 @@ doRemoteClose(virConnectPtr conn, struct private_data *priv)
     /* See comment for remoteType. */
     VIR_FREE(priv->type);
 
-    virObjectEventStateFree(priv->eventState);
+    virObjectUnref(priv->eventState);
     priv->eventState = NULL;
 
     return ret;
index 6f1e3727d6e880b5288163cee2b1575063f8db4c..4f990f4c482708dbd392c6c83071c174537caa18 100644 (file)
@@ -347,7 +347,7 @@ storageStateCleanup(void)
 
     storageDriverLock();
 
-    virObjectEventStateFree(driver->storageEventState);
+    virObjectUnref(driver->storageEventState);
 
     /* free inactive pools */
     virStoragePoolObjListFree(&driver->pools);
index a382d89a310a2faf1cdf65987f106d203417b7a4..dd28dc28b21965168c2e3b8a7faf6ad2e89a67bf 100644 (file)
@@ -153,7 +153,7 @@ testDriverFree(testDriverPtr driver)
     virObjectUnref(driver->networks);
     virInterfaceObjListFree(&driver->ifaces);
     virStoragePoolObjListFree(&driver->pools);
-    virObjectEventStateFree(driver->eventState);
+    virObjectUnref(driver->eventState);
     virMutexUnlock(&driver->lock);
     virMutexDestroy(&driver->lock);
 
index 95acb22096935bc9ffd826a482f45662b0351d1d..768ce529521962dc87c80b1dab07f641f39bcc29 100644 (file)
@@ -685,7 +685,7 @@ umlStateCleanup(void)
 
     virObjectUnref(uml_driver->domains);
 
-    virObjectEventStateFree(uml_driver->domainEventState);
+    virObjectUnref(uml_driver->domainEventState);
 
     VIR_FREE(uml_driver->logDir);
     VIR_FREE(uml_driver->configDir);
index 1472639a0daf5fb7cde0bbeb6b90bfb1e92760b1..ab1a4c46f1968953aefa9a29940b4e463cf5e804 100644 (file)
@@ -387,7 +387,7 @@ static void vboxUninitialize(vboxGlobalData *data)
     virObjectUnref(data->caps);
     virObjectUnref(data->xmlopt);
     if (gVBoxAPI.domainEventCallbacks)
-        virObjectEventStateFree(data->domainEvents);
+        virObjectUnref(data->domainEvents);
     VIR_FREE(data);
 }
 
index c8841e47a002147967c2650713545b6461138db5..b7c37bb964edc69e72ca7c24b631282d4cabc161 100644 (file)
@@ -171,7 +171,7 @@ static void vzDriverDispose(void * obj)
     virObjectUnref(driver->domains);
     virObjectUnref(driver->caps);
     virObjectUnref(driver->xmlopt);
-    virObjectEventStateFree(driver->domainEventState);
+    virObjectUnref(driver->domainEventState);
     virSysinfoDefFree(driver->hostsysinfo);
 }
 
index 8b41974eb4a1629908c3b5157186987ff26d99c0..165f37c20db961d24d9fd1e90a053dbdc3c75e65 100644 (file)
@@ -571,7 +571,7 @@ xenUnifiedConnectClose(virConnectPtr conn)
 
     virObjectUnref(priv->caps);
     virObjectUnref(priv->xmlopt);
-    virObjectEventStateFree(priv->domainEvents);
+    virObjectUnref(priv->domainEvents);
 
 #if WITH_XEN_INOTIFY
     if (priv->opened[XEN_UNIFIED_INOTIFY_OFFSET])