[libvirt] [PATCH 13/13] Turn virNetClient* into virObject instances

Daniel P. Berrange berrange at redhat.com
Tue Jul 31 16:58:33 UTC 2012


From: "Daniel P. Berrange" <berrange at redhat.com>

Make all the virNetClient* objects use virObject APIs for
reference counting

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 src/libvirt_probes.d          |    4 +-
 src/lxc/lxc_monitor.c         |    4 +-
 src/remote/remote_driver.c    |   20 ++++-----
 src/rpc/gendispatch.pl        |    4 +-
 src/rpc/virnetclient.c        |   96 +++++++++++++++++------------------------
 src/rpc/virnetclient.h        |    4 +-
 src/rpc/virnetclientprogram.c |   43 +++++++++---------
 src/rpc/virnetclientprogram.h |    5 +--
 src/rpc/virnetclientstream.c  |   65 +++++++++++++---------------
 src/rpc/virnetclientstream.h  |    5 +--
 10 files changed, 110 insertions(+), 140 deletions(-)

diff --git a/src/libvirt_probes.d b/src/libvirt_probes.d
index 27f4e9a..9343fa4 100644
--- a/src/libvirt_probes.d
+++ b/src/libvirt_probes.d
@@ -40,9 +40,7 @@ provider libvirt {
 
 	# file: src/rpc/virnetclient.c
 	# prefix: rpc
-	probe rpc_client_new(void *client, int refs, void *sock);
-	probe rpc_client_ref(void *client, int refs);
-	probe rpc_client_free(void *client, int refs);
+	probe rpc_client_new(void *client, void *sock);
 
 	probe rpc_client_msg_tx_queue(void *client, int len, int prog, int vers, int proc, int type, int status, int serial);
 	probe rpc_client_msg_rx(void *client, int len, int prog, int vers, int proc, int type, int status, int serial);
diff --git a/src/lxc/lxc_monitor.c b/src/lxc/lxc_monitor.c
index a2a2599..a81d0f7 100644
--- a/src/lxc/lxc_monitor.c
+++ b/src/lxc/lxc_monitor.c
@@ -170,7 +170,7 @@ static void virLXCMonitorFree(virLXCMonitorPtr mon)
     if (mon->cb && mon->cb->destroy)
         (mon->cb->destroy)(mon, mon->vm);
     virMutexDestroy(&mon->lock);
-    virNetClientProgramFree(mon->program);
+    virObjectUnref(mon->program);
     VIR_FREE(mon);
 }
 
@@ -199,7 +199,7 @@ void virLXCMonitorClose(virLXCMonitorPtr mon)
 {
     if (mon->client) {
         virNetClientClose(mon->client);
-        virNetClientFree(mon->client);
+        virObjectUnref(mon->client);
         mon->client = NULL;
     }
 }
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index bfea919..88a1573 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -792,10 +792,10 @@ doRemoteOpen (virConnectPtr conn,
     virReportOOMError();
 
  failed:
-    virNetClientProgramFree(priv->remoteProgram);
-    virNetClientProgramFree(priv->qemuProgram);
+    virObjectUnref(priv->remoteProgram);
+    virObjectUnref(priv->qemuProgram);
     virNetClientClose(priv->client);
-    virNetClientFree(priv->client);
+    virObjectUnref(priv->client);
     priv->client = NULL;
 
     VIR_FREE(priv->hostname);
@@ -946,10 +946,10 @@ doRemoteClose (virConnectPtr conn, struct private_data *priv)
     virObjectUnref(priv->tls);
     priv->tls = NULL;
     virNetClientClose(priv->client);
-    virNetClientFree(priv->client);
+    virObjectUnref(priv->client);
     priv->client = NULL;
-    virNetClientProgramFree(priv->remoteProgram);
-    virNetClientProgramFree(priv->qemuProgram);
+    virObjectUnref(priv->remoteProgram);
+    virObjectUnref(priv->qemuProgram);
     priv->remoteProgram = priv->qemuProgram = NULL;
 
     /* Free hostname copy */
@@ -4183,7 +4183,7 @@ remoteStreamFinish(virStreamPtr st)
 
 cleanup:
     virNetClientRemoveStream(priv->client, privst);
-    virNetClientStreamFree(privst);
+    virObjectUnref(privst);
     st->privateData = NULL;
     st->driver = NULL;
 
@@ -4218,7 +4218,7 @@ remoteStreamAbort(virStreamPtr st)
 
 cleanup:
     virNetClientRemoveStream(priv->client, privst);
-    virNetClientStreamFree(privst);
+    virObjectUnref(privst);
     st->privateData = NULL;
     st->driver = NULL;
 
@@ -4519,7 +4519,7 @@ remoteDomainMigratePrepareTunnel3(virConnectPtr dconn,
         goto done;
 
     if (virNetClientAddStream(priv->client, netst) < 0) {
-        virNetClientStreamFree(netst);
+        virObjectUnref(netst);
         goto done;
     }
 
@@ -4537,7 +4537,7 @@ remoteDomainMigratePrepareTunnel3(virConnectPtr dconn,
              (xdrproc_t) xdr_remote_domain_migrate_prepare_tunnel3_args, (char *) &args,
              (xdrproc_t) xdr_remote_domain_migrate_prepare_tunnel3_ret, (char *) &ret) == -1) {
         virNetClientRemoveStream(priv->client, netst);
-        virNetClientStreamFree(netst);
+        virObjectUnref(netst);
         goto done;
     }
 
diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl
index 3a66445..12023e9 100755
--- a/src/rpc/gendispatch.pl
+++ b/src/rpc/gendispatch.pl
@@ -1450,7 +1450,7 @@ elsif ($opt_k) {
             print "        goto done;\n";
             print "\n";
             print "    if (virNetClientAddStream(priv->client, netst) < 0) {\n";
-            print "        virNetClientStreamFree(netst);\n";
+            print "        virObjectUnref(netst);\n";
             print "        goto done;\n";
             print "    }";
             print "\n";
@@ -1526,7 +1526,7 @@ elsif ($opt_k) {
 
         if ($call->{streamflag} ne "none") {
             print "        virNetClientRemoveStream(priv->client, netst);\n";
-            print "        virNetClientStreamFree(netst);\n";
+            print "        virObjectUnref(netst);\n";
             print "        st->driver = NULL;\n";
             print "        st->privateData = NULL;\n";
         }
diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c
index 808c502..27278a2 100644
--- a/src/rpc/virnetclient.c
+++ b/src/rpc/virnetclient.c
@@ -63,7 +63,7 @@ struct _virNetClientCall {
 
 
 struct _virNetClient {
-    int refs;
+    virObject object;
 
     virMutex lock;
 
@@ -109,6 +109,21 @@ struct _virNetClient {
 };
 
 
+static virClassPtr virNetClientClass;
+static void virNetClientDispose(void *obj);
+
+static int virNetClientOnceInit(void)
+{
+    if (!(virNetClientClass = virClassNew("virNetClient",
+                                          sizeof(virNetClient),
+                                          virNetClientDispose)))
+        return -1;
+
+    return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virNetClient)
+
 static void virNetClientIOEventLoopPassTheBuck(virNetClientPtr client,
                                                virNetClientCallPtr thiscall);
 static int virNetClientQueueNonBlocking(virNetClientPtr client,
@@ -237,13 +252,6 @@ static bool virNetClientCallMatchPredicate(virNetClientCallPtr head,
 }
 
 
-static void virNetClientEventFree(void *opaque)
-{
-    virNetClientPtr client = opaque;
-
-    virNetClientFree(client);
-}
-
 bool
 virNetClientKeepAliveIsSupported(virNetClientPtr client)
 {
@@ -303,19 +311,22 @@ static virNetClientPtr virNetClientNew(virNetSocketPtr sock,
     int wakeupFD[2] = { -1, -1 };
     virKeepAlivePtr ka = NULL;
 
+    if (virNetClientInitialize() < 0)
+        return NULL;
+
     if (pipe2(wakeupFD, O_CLOEXEC) < 0) {
         virReportSystemError(errno, "%s",
                              _("unable to make pipe"));
         goto error;
     }
 
-    if (VIR_ALLOC(client) < 0)
-        goto no_memory;
-
-    client->refs = 1;
+    if (!(client = virObjectNew(virNetClientClass)))
+        goto error;
 
-    if (virMutexInit(&client->lock) < 0)
+    if (virMutexInit(&client->lock) < 0) {
+        VIR_FREE(client);
         goto error;
+    }
 
     client->sock = sock;
     client->wakeupReadFD = wakeupFD[0];
@@ -327,13 +338,13 @@ static virNetClientPtr virNetClientNew(virNetSocketPtr sock,
         goto no_memory;
 
     /* Set up a callback to listen on the socket data */
-    client->refs++;
+    virObjectRef(client);
     if (virNetSocketAddIOCallback(client->sock,
                                   VIR_EVENT_HANDLE_READABLE,
                                   virNetClientIncomingEvent,
                                   client,
-                                  virNetClientEventFree) < 0) {
-        client->refs--;
+                                  (virFreeCallback)virObjectUnref) < 0) {
+        virObjectUnref(client);
         VIR_DEBUG("Failed to add event watch, disabling events and support for"
                   " keepalive messages");
     } else {
@@ -342,16 +353,16 @@ static virNetClientPtr virNetClientNew(virNetSocketPtr sock,
         if (!(ka = virKeepAliveNew(-1, 0, client,
                                    virNetClientKeepAliveSendCB,
                                    virNetClientKeepAliveDeadCB,
-                                   virNetClientEventFree)))
+                                   (virFreeCallback)virObjectUnref)))
             goto error;
         /* keepalive object has a reference to client */
-        client->refs++;
+        virObjectRef(client);
     }
 
     client->keepalive = ka;
     PROBE(RPC_CLIENT_NEW,
-          "client=%p refs=%d sock=%p",
-          client, client->refs, client->sock);
+          "client=%p sock=%p",
+          client, client->sock);
     return client;
 
 no_memory:
@@ -363,7 +374,7 @@ error:
         virKeepAliveStop(ka);
         virObjectUnref(ka);
     }
-    virNetClientFree(client);
+    virObjectUnref(client);
     return NULL;
 }
 
@@ -422,17 +433,6 @@ virNetClientPtr virNetClientNewExternal(const char **cmdargv)
 }
 
 
-void virNetClientRef(virNetClientPtr client)
-{
-    virNetClientLock(client);
-    client->refs++;
-    PROBE(RPC_CLIENT_REF,
-          "client=%p refs=%d",
-          client, client->refs);
-    virNetClientUnlock(client);
-}
-
-
 int virNetClientGetFD(virNetClientPtr client)
 {
     int fd;
@@ -463,28 +463,16 @@ bool virNetClientHasPassFD(virNetClientPtr client)
 }
 
 
-void virNetClientFree(virNetClientPtr client)
+void virNetClientDispose(void *obj)
 {
+    virNetClientPtr client = obj;
     int i;
 
-    if (!client)
-        return;
-
-    virNetClientLock(client);
-    PROBE(RPC_CLIENT_FREE,
-          "client=%p refs=%d",
-          client, client->refs);
-    client->refs--;
-    if (client->refs > 0) {
-        virNetClientUnlock(client);
-        return;
-    }
-
     if (client->closeFf)
         client->closeFf(client->closeOpaque);
 
     for (i = 0 ; i < client->nprograms ; i++)
-        virNetClientProgramFree(client->programs[i]);
+        virObjectUnref(client->programs[i]);
     VIR_FREE(client->programs);
 
     VIR_FORCE_CLOSE(client->wakeupSendFD);
@@ -501,8 +489,6 @@ void virNetClientFree(virNetClientPtr client)
 #endif
     virNetClientUnlock(client);
     virMutexDestroy(&client->lock);
-
-    VIR_FREE(client);
 }
 
 
@@ -543,7 +529,7 @@ virNetClientCloseLocked(virNetClientPtr client)
         virNetClientCloseFunc closeCb = client->closeCb;
         void *closeOpaque = client->closeOpaque;
         int closeReason = client->closeReason;
-        client->refs++;
+        virObjectRef(client);
         virNetClientUnlock(client);
 
         if (ka) {
@@ -554,7 +540,7 @@ virNetClientCloseLocked(virNetClientPtr client)
             closeCb(client, closeReason, closeOpaque);
 
         virNetClientLock(client);
-        client->refs--;
+        virObjectUnref(client);
     }
 }
 
@@ -751,8 +737,7 @@ int virNetClientAddProgram(virNetClientPtr client,
     if (VIR_EXPAND_N(client->programs, client->nprograms, 1) < 0)
         goto no_memory;
 
-    client->programs[client->nprograms-1] = prog;
-    virNetClientProgramRef(prog);
+    client->programs[client->nprograms-1] = virObjectRef(prog);
 
     virNetClientUnlock(client);
     return 0;
@@ -772,8 +757,7 @@ int virNetClientAddStream(virNetClientPtr client,
     if (VIR_EXPAND_N(client->streams, client->nstreams, 1) < 0)
         goto no_memory;
 
-    client->streams[client->nstreams-1] = st;
-    virNetClientStreamRef(st);
+    client->streams[client->nstreams-1] = virObjectRef(st);
 
     virNetClientUnlock(client);
     return 0;
@@ -807,7 +791,7 @@ void virNetClientRemoveStream(virNetClientPtr client,
         VIR_FREE(client->streams);
         client->nstreams = 0;
     }
-    virNetClientStreamFree(st);
+    virObjectUnref(st);
 
 cleanup:
     virNetClientUnlock(client);
diff --git a/src/rpc/virnetclient.h b/src/rpc/virnetclient.h
index c939475..d6b9b3c 100644
--- a/src/rpc/virnetclient.h
+++ b/src/rpc/virnetclient.h
@@ -30,6 +30,7 @@
 # endif
 # include "virnetclientprogram.h"
 # include "virnetclientstream.h"
+# include "virobject.h"
 
 
 virNetClientPtr virNetClientNewUNIX(const char *path,
@@ -60,8 +61,6 @@ void virNetClientSetCloseCallback(virNetClientPtr client,
                                   void *opaque,
                                   virFreeCallback ff);
 
-void virNetClientRef(virNetClientPtr client);
-
 int virNetClientGetFD(virNetClientPtr client);
 int virNetClientDupFD(virNetClientPtr client, bool cloexec);
 
@@ -105,7 +104,6 @@ const char *virNetClientRemoteAddrString(virNetClientPtr client);
 
 int virNetClientGetTLSKeySize(virNetClientPtr client);
 
-void virNetClientFree(virNetClientPtr client);
 void virNetClientClose(virNetClientPtr client);
 
 bool virNetClientKeepAliveIsSupported(virNetClientPtr client);
diff --git a/src/rpc/virnetclientprogram.c b/src/rpc/virnetclientprogram.c
index c7d2409..320b7d4 100644
--- a/src/rpc/virnetclientprogram.c
+++ b/src/rpc/virnetclientprogram.c
@@ -33,11 +33,12 @@
 #include "logging.h"
 #include "util.h"
 #include "virfile.h"
+#include "threads.h"
 
 #define VIR_FROM_THIS VIR_FROM_RPC
 
 struct _virNetClientProgram {
-    int refs;
+    virObject object;
 
     unsigned program;
     unsigned version;
@@ -46,6 +47,22 @@ struct _virNetClientProgram {
     void *eventOpaque;
 };
 
+static virClassPtr virNetClientProgramClass;
+static void virNetClientProgramDispose(void *obj);
+
+static int virNetClientProgramOnceInit(void)
+{
+    if (!(virNetClientProgramClass = virClassNew("virNetClientProgram",
+                                                 sizeof(virNetClientProgram),
+                                                 virNetClientProgramDispose)))
+        return -1;
+
+    return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virNetClientProgram)
+
+
 virNetClientProgramPtr virNetClientProgramNew(unsigned program,
                                               unsigned version,
                                               virNetClientProgramEventPtr events,
@@ -54,12 +71,12 @@ virNetClientProgramPtr virNetClientProgramNew(unsigned program,
 {
     virNetClientProgramPtr prog;
 
-    if (VIR_ALLOC(prog) < 0) {
-        virReportOOMError();
+    if (virNetClientProgramInitialize() < 0)
+        return NULL;
+
+    if (!(prog = virObjectNew(virNetClientProgramClass)))
         return NULL;
-    }
 
-    prog->refs = 1;
     prog->program = program;
     prog->version = version;
     prog->events = events;
@@ -70,22 +87,8 @@ virNetClientProgramPtr virNetClientProgramNew(unsigned program,
 }
 
 
-void virNetClientProgramRef(virNetClientProgramPtr prog)
+void virNetClientProgramDispose(void *obj ATTRIBUTE_UNUSED)
 {
-    prog->refs++;
-}
-
-
-void virNetClientProgramFree(virNetClientProgramPtr prog)
-{
-    if (!prog)
-        return;
-
-    prog->refs--;
-    if (prog->refs > 0)
-        return;
-
-    VIR_FREE(prog);
 }
 
 
diff --git a/src/rpc/virnetclientprogram.h b/src/rpc/virnetclientprogram.h
index f799f2e..9e92a3c 100644
--- a/src/rpc/virnetclientprogram.h
+++ b/src/rpc/virnetclientprogram.h
@@ -27,6 +27,7 @@
 # include <rpc/xdr.h>
 
 # include "virnetmessage.h"
+# include "virobject.h"
 
 typedef struct _virNetClient virNetClient;
 typedef virNetClient *virNetClientPtr;
@@ -62,10 +63,6 @@ virNetClientProgramPtr virNetClientProgramNew(unsigned program,
 unsigned virNetClientProgramGetProgram(virNetClientProgramPtr prog);
 unsigned virNetClientProgramGetVersion(virNetClientProgramPtr prog);
 
-void virNetClientProgramRef(virNetClientProgramPtr prog);
-
-void virNetClientProgramFree(virNetClientProgramPtr prog);
-
 int virNetClientProgramMatches(virNetClientProgramPtr prog,
                                virNetMessagePtr msg);
 
diff --git a/src/rpc/virnetclientstream.c b/src/rpc/virnetclientstream.c
index 8580e39..0714cfc 100644
--- a/src/rpc/virnetclientstream.c
+++ b/src/rpc/virnetclientstream.c
@@ -33,12 +33,13 @@
 #define VIR_FROM_THIS VIR_FROM_RPC
 
 struct _virNetClientStream {
+    virObject object;
+
     virMutex lock;
 
     virNetClientProgramPtr prog;
     int proc;
     unsigned serial;
-    int refs;
 
     virError err;
 
@@ -63,6 +64,22 @@ struct _virNetClientStream {
 };
 
 
+static virClassPtr virNetClientStreamClass;
+static void virNetClientStreamDispose(void *obj);
+
+static int virNetClientStreamOnceInit(void)
+{
+    if (!(virNetClientStreamClass = virClassNew("virNetClientStream",
+                                                sizeof(virNetClientStream),
+                                                virNetClientStreamDispose)))
+        return -1;
+
+    return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virNetClientStream)
+
+
 static void
 virNetClientStreamEventTimerUpdate(virNetClientStreamPtr st)
 {
@@ -119,26 +136,18 @@ virNetClientStreamEventTimer(int timer ATTRIBUTE_UNUSED, void *opaque)
 }
 
 
-static void
-virNetClientStreamEventTimerFree(void *opaque)
-{
-    virNetClientStreamPtr st = opaque;
-    virNetClientStreamFree(st);
-}
-
-
 virNetClientStreamPtr virNetClientStreamNew(virNetClientProgramPtr prog,
                                             int proc,
                                             unsigned serial)
 {
     virNetClientStreamPtr st;
 
-    if (VIR_ALLOC(st) < 0) {
-        virReportOOMError();
+    if (virNetClientStreamInitialize() < 0)
+        return NULL;
+
+    if (!(st = virObjectNew(virNetClientStreamClass)))
         return NULL;
-    }
 
-    st->refs = 1;
     st->prog = prog;
     st->proc = proc;
     st->serial = serial;
@@ -150,35 +159,19 @@ virNetClientStreamPtr virNetClientStreamNew(virNetClientProgramPtr prog,
         return NULL;
     }
 
-    virNetClientProgramRef(prog);
+    virObjectRef(prog);
 
     return st;
 }
 
-
-void virNetClientStreamRef(virNetClientStreamPtr st)
+void virNetClientStreamDispose(void *obj)
 {
-    virMutexLock(&st->lock);
-    st->refs++;
-    virMutexUnlock(&st->lock);
-}
-
-void virNetClientStreamFree(virNetClientStreamPtr st)
-{
-    virMutexLock(&st->lock);
-    st->refs--;
-    if (st->refs > 0) {
-        virMutexUnlock(&st->lock);
-        return;
-    }
-
-    virMutexUnlock(&st->lock);
+    virNetClientStreamPtr st = obj;
 
     virResetError(&st->err);
     VIR_FREE(st->incoming);
     virMutexDestroy(&st->lock);
-    virNetClientProgramFree(st->prog);
-    VIR_FREE(st);
+    virObjectUnref(st->prog);
 }
 
 bool virNetClientStreamMatches(virNetClientStreamPtr st,
@@ -454,13 +447,13 @@ int virNetClientStreamEventAddCallback(virNetClientStreamPtr st,
         goto cleanup;
     }
 
-    st->refs++;
+    virObjectRef(st);
     if ((st->cbTimer =
          virEventAddTimeout(-1,
                             virNetClientStreamEventTimer,
                             st,
-                            virNetClientStreamEventTimerFree)) < 0) {
-        st->refs--;
+                            (virFreeCallback)virObjectUnref)) < 0) {
+        virObjectUnref(st);
         goto cleanup;
     }
 
diff --git a/src/rpc/virnetclientstream.h b/src/rpc/virnetclientstream.h
index 00d598a..68a9e99 100644
--- a/src/rpc/virnetclientstream.h
+++ b/src/rpc/virnetclientstream.h
@@ -24,6 +24,7 @@
 # define __VIR_NET_CLIENT_STREAM_H__
 
 # include "virnetclientprogram.h"
+# include "virobject.h"
 
 typedef struct _virNetClientStream virNetClientStream;
 typedef virNetClientStream *virNetClientStreamPtr;
@@ -35,10 +36,6 @@ virNetClientStreamPtr virNetClientStreamNew(virNetClientProgramPtr prog,
                                             int proc,
                                             unsigned serial);
 
-void virNetClientStreamRef(virNetClientStreamPtr st);
-
-void virNetClientStreamFree(virNetClientStreamPtr st);
-
 bool virNetClientStreamRaiseError(virNetClientStreamPtr st);
 
 int virNetClientStreamSetError(virNetClientStreamPtr st,
-- 
1.7.10.4




More information about the libvir-list mailing list