[libvirt] [PATCH 12/13] Turn virNetServer* into virObject instances

Daniel P. Berrange berrange at redhat.com
Wed Jul 11 13:35:52 UTC 2012


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

Make all the virNetServer* objects use the virObject APIs
for reference countign

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 daemon/libvirtd.c             |   22 ++++-----
 daemon/stream.c               |   19 ++------
 src/libvirt_private.syms      |    7 ---
 src/libvirt_probes.d          |    4 +-
 src/lxc/lxc_controller.c      |    8 +--
 src/rpc/virnetserver.c        |   79 ++++++++++++++----------------
 src/rpc/virnetserver.h        |    5 +-
 src/rpc/virnetserverclient.c  |  108 ++++++++++++++++++-----------------------
 src/rpc/virnetserverclient.h  |    5 +-
 src/rpc/virnetserverprogram.c |   49 ++++++++++---------
 src/rpc/virnetserverprogram.h |    8 +--
 src/rpc/virnetserverservice.c |   83 +++++++++++++++----------------
 src/rpc/virnetserverservice.h |    5 +-
 13 files changed, 172 insertions(+), 230 deletions(-)

diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
index 211a4bc..bed5aa5 100644
--- a/daemon/libvirtd.c
+++ b/daemon/libvirtd.c
@@ -568,10 +568,10 @@ static int daemonSetupNetworking(virNetServerPtr srv,
     return 0;
 
 error:
-    virNetServerServiceFree(svcTLS);
-    virNetServerServiceFree(svcTCP);
-    virNetServerServiceFree(svc);
-    virNetServerServiceFree(svcRO);
+    virObjectUnref(svcTLS);
+    virObjectUnref(svcTCP);
+    virObjectUnref(svc);
+    virObjectUnref(svcRO);
     return -1;
 }
 
@@ -759,21 +759,21 @@ static void daemonRunStateInit(void *opaque)
         VIR_ERROR(_("Driver state initialization failed"));
         /* Ensure the main event loop quits */
         kill(getpid(), SIGTERM);
-        virNetServerFree(srv);
+        virObjectUnref(srv);
         return;
     }
 
     /* Only now accept clients from network */
     virNetServerUpdateServices(srv, true);
-    virNetServerFree(srv);
+    virObjectUnref(srv);
 }
 
 static int daemonStateInit(virNetServerPtr srv)
 {
     virThread thr;
-    virNetServerRef(srv);
+    virObjectRef(srv);
     if (virThreadCreate(&thr, false, daemonRunStateInit, srv) < 0) {
-        virNetServerFree(srv);
+        virObjectUnref(srv);
         return -1;
     }
     return 0;
@@ -1306,10 +1306,10 @@ int main(int argc, char **argv) {
 
 cleanup:
     virNetlinkEventServiceStop();
-    virNetServerProgramFree(remoteProgram);
-    virNetServerProgramFree(qemuProgram);
+    virObjectUnref(remoteProgram);
+    virObjectUnref(qemuProgram);
     virNetServerClose(srv);
-    virNetServerFree(srv);
+    virObjectUnref(srv);
     virNetlinkShutdown();
     if (statuswrite != -1) {
         if (ret != 0) {
diff --git a/daemon/stream.c b/daemon/stream.c
index bb66f75..024a8c9 100644
--- a/daemon/stream.c
+++ b/daemon/stream.c
@@ -108,14 +108,6 @@ daemonStreamMessageFinished(virNetMessagePtr msg ATTRIBUTE_UNUSED,
 }
 
 
-static void
-daemonStreamEventFreeFunc(void *opaque)
-{
-    virNetServerClientPtr client = opaque;
-
-    virNetServerClientFree(client);
-}
-
 /*
  * Callback that gets invoked when a stream becomes writable/readable
  */
@@ -336,14 +328,12 @@ daemonCreateClientStream(virNetServerClientPtr client,
 
     stream->refs = 1;
     stream->priv = priv;
-    stream->prog = prog;
+    stream->prog = virObjectRef(prog);
     stream->procedure = header->proc;
     stream->serial = header->serial;
     stream->filterID = -1;
     stream->st = st;
 
-    virNetServerProgramRef(prog);
-
     return stream;
 }
 
@@ -369,7 +359,7 @@ int daemonFreeClientStream(virNetServerClientPtr client,
     VIR_DEBUG("client=%p, proc=%d, serial=%d",
               client, stream->procedure, stream->serial);
 
-    virNetServerProgramFree(stream->prog);
+    virObjectUnref(stream->prog);
 
     msg = stream->rx;
     while (msg) {
@@ -415,10 +405,11 @@ int daemonAddClientStream(virNetServerClientPtr client,
 
     if (virStreamEventAddCallback(stream->st, 0,
                                   daemonStreamEvent, client,
-                                  daemonStreamEventFreeFunc) < 0)
+                                  (virFreeCallback)virObjectUnref) < 0)
         return -1;
 
-    virNetServerClientRef(client);
+    virObjectRef(client);
+
     if ((stream->filterID = virNetServerClientAddFilter(client,
                                                         daemonStreamFilter,
                                                         stream)) < 0) {
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index ee2f581..a129cd5 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1406,14 +1406,11 @@ virNetServerAddService;
 virNetServerAddSignalHandler;
 virNetServerAutoShutdown;
 virNetServerClose;
-virNetServerFree;
 virNetServerIsPrivileged;
 virNetServerKeepAliveRequired;
 virNetServerNew;
 virNetServerQuit;
-virNetServerRef;
 virNetServerRun;
-virNetServerServiceFree;
 virNetServerServiceNewTCP;
 virNetServerServiceNewUNIX;
 virNetServerUpdateServices;
@@ -1423,7 +1420,6 @@ virNetServerUpdateServices;
 virNetServerClientAddFilter;
 virNetServerClientClose;
 virNetServerClientDelayedClose;
-virNetServerClientFree;
 virNetServerClientGetAuth;
 virNetServerClientGetFD;
 virNetServerClientGetPrivateData;
@@ -1434,7 +1430,6 @@ virNetServerClientHasTLSSession;
 virNetServerClientImmediateClose;
 virNetServerClientIsSecure;
 virNetServerClientLocalAddrString;
-virNetServerClientRef;
 virNetServerClientRemoteAddrString;
 virNetServerClientRemoveFilter;
 virNetServerClientSendMessage;
@@ -1445,12 +1440,10 @@ virNetServerClientStartKeepAlive;
 
 
 # virnetserverprogram.h
-virNetServerProgramFree;
 virNetServerProgramGetID;
 virNetServerProgramGetVersion;
 virNetServerProgramMatches;
 virNetServerProgramNew;
-virNetServerProgramRef;
 virNetServerProgramSendReplyError;
 virNetServerProgramSendStreamData;
 virNetServerProgramSendStreamError;
diff --git a/src/libvirt_probes.d b/src/libvirt_probes.d
index be1d938..27f4e9a 100644
--- a/src/libvirt_probes.d
+++ b/src/libvirt_probes.d
@@ -32,9 +32,7 @@ provider libvirt {
 
 	# file: src/rpc/virnetserverclient.c
 	# prefix: rpc
-	probe rpc_server_client_new(void *client, int refs, void *sock);
-	probe rpc_server_client_ref(void *client, int refs);
-	probe rpc_server_client_free(void *client, int refs);
+	probe rpc_server_client_new(void *client, void *sock);
 
 	probe rpc_server_client_msg_tx_queue(void *client, int len, int prog, int vers, int proc, int type, int status, int serial);
 	probe rpc_server_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_controller.c b/src/lxc/lxc_controller.c
index a4874ea..40ac06d 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -248,7 +248,7 @@ static void virLXCControllerFree(virLXCControllerPtr ctrl)
     virDomainDefFree(ctrl->def);
     VIR_FREE(ctrl->name);
 
-    virNetServerFree(ctrl->server);
+    virObjectUnref(ctrl->server);
 
     VIR_FREE(ctrl);
 }
@@ -806,7 +806,7 @@ static int virLXCControllerSetupServer(virLXCControllerPtr ctrl)
 
     if (virNetServerAddService(ctrl->server, svc, NULL) < 0)
         goto error;
-    virNetServerServiceFree(svc);
+    virObjectUnref(svc);
     svc = NULL;
 
     virNetServerUpdateServices(ctrl->server, true);
@@ -815,9 +815,9 @@ static int virLXCControllerSetupServer(virLXCControllerPtr ctrl)
 
 error:
     VIR_FREE(sockpath);
-    virNetServerFree(ctrl->server);
+    virObjectUnref(ctrl->server);
     ctrl->server = NULL;
-    virNetServerServiceFree(svc);
+    virObjectUnref(svc);
     return -1;
 }
 
diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c
index 17da40c..acfbeaa 100644
--- a/src/rpc/virnetserver.c
+++ b/src/rpc/virnetserver.c
@@ -69,7 +69,7 @@ struct _virNetServerJob {
 };
 
 struct _virNetServer {
-    int refs;
+    virObjectPtr object;
 
     virMutex lock;
 
@@ -116,6 +116,22 @@ struct _virNetServer {
 };
 
 
+static virClassPtr virNetServerClass;
+static void virNetServerDispose(void *obj);
+
+static int virNetServerOnceInit(void)
+{
+    if (!(virNetServerClass = virClassNew("virNetServer",
+                                          sizeof(virNetServer),
+                                          virNetServerDispose)))
+        return -1;
+
+    return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virNetServer)
+
+
 static void virNetServerLock(virNetServerPtr srv)
 {
     virMutexLock(&srv->lock);
@@ -182,18 +198,18 @@ static void virNetServerHandleJob(void *jobOpaque, void *opaque)
         goto error;
 
     virNetServerLock(srv);
-    virNetServerProgramFree(job->prog);
+    virObjectUnref(job->prog);
     virNetServerUnlock(srv);
 
-    virNetServerClientFree(job->client);
+    virObjectUnref(job->client);
     VIR_FREE(job);
     return;
 
 error:
-    virNetServerProgramFree(job->prog);
+    virObjectUnref(job->prog);
     virNetMessageFree(job->msg);
     virNetServerClientClose(job->client);
-    virNetServerClientFree(job->client);
+    virObjectUnref(job->client);
     VIR_FREE(job);
 }
 
@@ -230,7 +246,7 @@ static int virNetServerDispatchNewMessage(virNetServerClientPtr client,
         job->msg = msg;
 
         if (prog) {
-            virNetServerProgramRef(prog);
+            virObjectRef(prog);
             job->prog = prog;
             priority = virNetServerProgramGetPriority(prog, msg->header.proc);
         }
@@ -239,7 +255,7 @@ static int virNetServerDispatchNewMessage(virNetServerClientPtr client,
 
         if (ret < 0) {
             VIR_FREE(job);
-            virNetServerProgramFree(prog);
+            virObjectUnref(prog);
         }
     } else {
         ret = virNetServerProcessMsg(srv, client, prog, msg);
@@ -279,7 +295,7 @@ static int virNetServerDispatchNewClient(virNetServerServicePtr svc ATTRIBUTE_UN
         goto error;
     }
     srv->clients[srv->nclients-1] = client;
-    virNetServerClientRef(client);
+    virObjectRef(client);
 
     virNetServerClientSetDispatcher(client,
                                     virNetServerDispatchNewMessage,
@@ -339,12 +355,11 @@ virNetServerPtr virNetServerNew(size_t min_workers,
     virNetServerPtr srv;
     struct sigaction sig_action;
 
-    if (VIR_ALLOC(srv) < 0) {
-        virReportOOMError();
+    if (virNetServerInitialize() < 0)
         return NULL;
-    }
 
-    srv->refs = 1;
+    if (!(srv = virObjectNew(virNetServerClass)))
+        return NULL;
 
     if (max_workers &&
         !(srv->workers = virThreadPoolNew(min_workers, max_workers,
@@ -407,24 +422,14 @@ virNetServerPtr virNetServerNew(size_t min_workers,
     sigaction(SIGUSR2, &sig_action, NULL);
 #endif
 
-    VIR_DEBUG("srv=%p refs=%d", srv, srv->refs);
     return srv;
 
 error:
-    virNetServerFree(srv);
+    virObjectUnref(srv);
     return NULL;
 }
 
 
-void virNetServerRef(virNetServerPtr srv)
-{
-    virNetServerLock(srv);
-    srv->refs++;
-    VIR_DEBUG("srv=%p refs=%d", srv, srv->refs);
-    virNetServerUnlock(srv);
-}
-
-
 bool virNetServerIsPrivileged(virNetServerPtr srv)
 {
     bool priv;
@@ -614,7 +619,7 @@ int virNetServerAddService(virNetServerPtr srv,
 #endif
 
     srv->services[srv->nservices-1] = svc;
-    virNetServerServiceRef(svc);
+    virObjectRef(svc);
 
     virNetServerServiceSetDispatcher(svc,
                                      virNetServerDispatchNewClient,
@@ -640,8 +645,7 @@ int virNetServerAddProgram(virNetServerPtr srv,
     if (VIR_EXPAND_N(srv->programs, srv->nprograms, 1) < 0)
         goto no_memory;
 
-    srv->programs[srv->nprograms-1] = prog;
-    virNetServerProgramRef(prog);
+    srv->programs[srv->nprograms-1] = virObjectRef(prog);
 
     virNetServerUnlock(srv);
     return 0;
@@ -750,7 +754,7 @@ void virNetServerRun(virNetServerPtr srv)
             if (virNetServerClientWantClose(srv->clients[i]))
                 virNetServerClientClose(srv->clients[i]);
             if (virNetServerClientIsClosed(srv->clients[i])) {
-                virNetServerClientFree(srv->clients[i]);
+                virObjectUnref(srv->clients[i]);
                 if (srv->nclients > 1) {
                     memmove(srv->clients + i,
                             srv->clients + i + 1,
@@ -781,20 +785,10 @@ void virNetServerQuit(virNetServerPtr srv)
     virNetServerUnlock(srv);
 }
 
-void virNetServerFree(virNetServerPtr srv)
+void virNetServerDispose(void *obj)
 {
+    virNetServerPtr srv = obj;
     int i;
-    int refs;
-
-    if (!srv)
-        return;
-
-    virNetServerLock(srv);
-    VIR_DEBUG("srv=%p refs=%d", srv, srv->refs);
-    refs = --srv->refs;
-    virNetServerUnlock(srv);
-    if (refs > 0)
-        return;
 
     for (i = 0 ; i < srv->nservices ; i++)
         virNetServerServiceToggle(srv->services[i], false);
@@ -812,16 +806,16 @@ void virNetServerFree(virNetServerPtr srv)
         virEventRemoveHandle(srv->sigwatch);
 
     for (i = 0 ; i < srv->nservices ; i++)
-        virNetServerServiceFree(srv->services[i]);
+        virObjectUnref(srv->services[i]);
     VIR_FREE(srv->services);
 
     for (i = 0 ; i < srv->nprograms ; i++)
-        virNetServerProgramFree(srv->programs[i]);
+        virObjectUnref(srv->programs[i]);
     VIR_FREE(srv->programs);
 
     for (i = 0 ; i < srv->nclients ; i++) {
         virNetServerClientClose(srv->clients[i]);
-        virNetServerClientFree(srv->clients[i]);
+        virObjectUnref(srv->clients[i]);
     }
     VIR_FREE(srv->clients);
 
@@ -831,7 +825,6 @@ void virNetServerFree(virNetServerPtr srv)
 #endif
 
     virMutexDestroy(&srv->lock);
-    VIR_FREE(srv);
 }
 
 void virNetServerClose(virNetServerPtr srv)
diff --git a/src/rpc/virnetserver.h b/src/rpc/virnetserver.h
index 438f524..25c1baa 100644
--- a/src/rpc/virnetserver.h
+++ b/src/rpc/virnetserver.h
@@ -30,6 +30,7 @@
 # include "virnetserverprogram.h"
 # include "virnetserverclient.h"
 # include "virnetserverservice.h"
+# include "virobject.h"
 
 typedef int (*virNetServerClientInitHook)(virNetServerPtr srv,
                                           virNetServerClientPtr client,
@@ -48,8 +49,6 @@ virNetServerPtr virNetServerNew(size_t min_workers,
 
 typedef int (*virNetServerAutoShutdownFunc)(virNetServerPtr srv, void *opaque);
 
-void virNetServerRef(virNetServerPtr srv);
-
 bool virNetServerIsPrivileged(virNetServerPtr srv);
 
 void virNetServerAutoShutdown(virNetServerPtr srv,
@@ -81,8 +80,6 @@ void virNetServerRun(virNetServerPtr srv);
 
 void virNetServerQuit(virNetServerPtr srv);
 
-void virNetServerFree(virNetServerPtr srv);
-
 void virNetServerClose(virNetServerPtr srv);
 
 bool virNetServerKeepAliveRequired(virNetServerPtr srv);
diff --git a/src/rpc/virnetserverclient.c b/src/rpc/virnetserverclient.c
index 58b56e1..a3b2e74 100644
--- a/src/rpc/virnetserverclient.c
+++ b/src/rpc/virnetserverclient.c
@@ -60,7 +60,8 @@ struct _virNetServerClientFilter {
 
 struct _virNetServerClient
 {
-    int refs;
+    virObject object;
+
     bool wantClose;
     bool delayedClose;
     virMutex lock;
@@ -106,6 +107,22 @@ struct _virNetServerClient
 };
 
 
+static virClassPtr virNetServerClientClass;
+static void virNetServerClientDispose(void *obj);
+
+static int virNetServerClientOnceInit(void)
+{
+    if (!(virNetServerClientClass = virClassNew("virNetServerClient",
+                                                sizeof(virNetServerClient),
+                                                virNetServerClientDispose)))
+        return -1;
+
+    return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virNetServerClient)
+
+
 static void virNetServerClientDispatchEvent(virNetSocketPtr sock, int events, void *opaque);
 static void virNetServerClientUpdateEvent(virNetServerClientPtr client);
 static void virNetServerClientDispatchRead(virNetServerClientPtr client);
@@ -169,13 +186,6 @@ virNetServerClientCalculateHandleMode(virNetServerClientPtr client) {
     return mode;
 }
 
-static void virNetServerClientEventFree(void *opaque)
-{
-    virNetServerClientPtr client = opaque;
-
-    virNetServerClientFree(client);
-}
-
 /*
  * @server: a locked or unlocked server object
  * @client: a locked client object
@@ -184,15 +194,17 @@ static int virNetServerClientRegisterEvent(virNetServerClientPtr client)
 {
     int mode = virNetServerClientCalculateHandleMode(client);
 
-    client->refs++;
+    if (!client->sock)
+        return -1;
+
+    virObjectRef(client);
     VIR_DEBUG("Registering client event callback %d", mode);
-    if (!client->sock ||
-        virNetSocketAddIOCallback(client->sock,
+    if (virNetSocketAddIOCallback(client->sock,
                                   mode,
                                   virNetServerClientDispatchEvent,
                                   client,
-                                  virNetServerClientEventFree) < 0) {
-        client->refs--;
+                                  (virFreeCallback)virObjectUnref) < 0) {
+        virObjectUnref(client);
         return -1;
     }
 
@@ -336,15 +348,17 @@ virNetServerClientPtr virNetServerClientNew(virNetSocketPtr sock,
 
     VIR_DEBUG("sock=%p auth=%d tls=%p", sock, auth, tls);
 
-    if (VIR_ALLOC(client) < 0) {
-        virReportOOMError();
+    if (virNetServerClientInitialize() < 0)
         return NULL;
-    }
 
-    if (virMutexInit(&client->lock) < 0)
-        goto error;
+    if (!(client = virObjectNew(virNetServerClientClass)))
+        return NULL;
+
+    if (virMutexInit(&client->lock) < 0) {
+        VIR_FREE(client);
+        return NULL;
+    }
 
-    client->refs = 1;
     client->sock = sock;
     client->auth = auth;
     client->readonly = readonly;
@@ -367,28 +381,18 @@ virNetServerClientPtr virNetServerClientNew(virNetSocketPtr sock,
     client->nrequests = 1;
 
     PROBE(RPC_SERVER_CLIENT_NEW,
-          "client=%p refs=%d sock=%p",
-          client, client->refs, client->sock);
+          "client=%p sock=%p",
+          client, client->sock);
 
     return client;
 
 error:
     /* XXX ref counting is better than this */
     client->sock = NULL; /* Caller owns 'sock' upon failure */
-    virNetServerClientFree(client);
+    virObjectUnref(client);
     return NULL;
 }
 
-void virNetServerClientRef(virNetServerClientPtr client)
-{
-    virNetServerClientLock(client);
-    client->refs++;
-    PROBE(RPC_SERVER_CLIENT_REF,
-          "client=%p refs=%d",
-          client, client->refs);
-    virNetServerClientUnlock(client);
-}
-
 
 int virNetServerClientGetAuth(virNetServerClientPtr client)
 {
@@ -570,21 +574,9 @@ const char *virNetServerClientRemoteAddrString(virNetServerClientPtr client)
 }
 
 
-void virNetServerClientFree(virNetServerClientPtr client)
+void virNetServerClientDispose(void *obj)
 {
-    if (!client)
-        return;
-
-    virNetServerClientLock(client);
-    PROBE(RPC_SERVER_CLIENT_FREE,
-          "client=%p refs=%d",
-          client, client->refs);
-
-    client->refs--;
-    if (client->refs > 0) {
-        virNetServerClientUnlock(client);
-        return;
-    }
+    virNetServerClientPtr client = obj;
 
     if (client->privateData &&
         client->privateDataFreeFunc)
@@ -601,7 +593,6 @@ void virNetServerClientFree(virNetServerClientPtr client)
     virObjectUnref(client->sock);
     virNetServerClientUnlock(client);
     virMutexDestroy(&client->lock);
-    VIR_FREE(client);
 }
 
 
@@ -619,7 +610,7 @@ void virNetServerClientClose(virNetServerClientPtr client)
     virKeepAlivePtr ka;
 
     virNetServerClientLock(client);
-    VIR_DEBUG("client=%p refs=%d", client, client->refs);
+    VIR_DEBUG("client=%p", client);
     if (!client->sock) {
         virNetServerClientUnlock(client);
         return;
@@ -629,20 +620,20 @@ void virNetServerClientClose(virNetServerClientPtr client)
         virKeepAliveStop(client->keepalive);
         ka = client->keepalive;
         client->keepalive = NULL;
-        client->refs++;
+        virObjectRef(client);
         virNetServerClientUnlock(client);
         virObjectUnref(ka);
         virNetServerClientLock(client);
-        client->refs--;
+        virObjectUnref(client);
     }
 
     if (client->privateDataCloseFunc) {
         cf = client->privateDataCloseFunc;
-        client->refs++;
+        virObjectRef(client);
         virNetServerClientUnlock(client);
         (cf)(client);
         virNetServerClientLock(client);
-        client->refs--;
+        virObjectUnref(client);
     }
 
     /* Do now, even though we don't close the socket
@@ -906,12 +897,12 @@ readmore:
 
         /* Send off to for normal dispatch to workers */
         if (msg) {
-            client->refs++;
+            virObjectRef(client);
             if (!client->dispatchFunc ||
                 client->dispatchFunc(client, msg, client->dispatchOpaque) < 0) {
                 virNetMessageFree(msg);
                 client->wantClose = true;
-                client->refs--;
+                virObjectUnref(client);
                 return;
             }
         }
@@ -1170,11 +1161,6 @@ virNetServerClientKeepAliveSendCB(void *opaque,
     return virNetServerClientSendMessage(opaque, msg);
 }
 
-static void
-virNetServerClientFreeCB(void *opaque)
-{
-    virNetServerClientFree(opaque);
-}
 
 int
 virNetServerClientInitKeepAlive(virNetServerClientPtr client,
@@ -1189,10 +1175,10 @@ virNetServerClientInitKeepAlive(virNetServerClientPtr client,
     if (!(ka = virKeepAliveNew(interval, count, client,
                                virNetServerClientKeepAliveSendCB,
                                virNetServerClientKeepAliveDeadCB,
-                               virNetServerClientFreeCB)))
+                               (virFreeCallback)virObjectUnref)))
         goto cleanup;
     /* keepalive object has a reference to client */
-    client->refs++;
+    virObjectRef(client);
 
     client->keepalive = ka;
     ka = NULL;
diff --git a/src/rpc/virnetserverclient.h b/src/rpc/virnetserverclient.h
index 154a160..428c916 100644
--- a/src/rpc/virnetserverclient.h
+++ b/src/rpc/virnetserverclient.h
@@ -26,6 +26,7 @@
 
 # include "virnetsocket.h"
 # include "virnetmessage.h"
+# include "virobject.h"
 
 typedef struct _virNetServerClient virNetServerClient;
 typedef virNetServerClient *virNetServerClientPtr;
@@ -73,8 +74,6 @@ const char *virNetServerClientGetIdentity(virNetServerClientPtr client);
 int virNetServerClientGetUNIXIdentity(virNetServerClientPtr client,
                                       uid_t *uid, gid_t *gid, pid_t *pid);
 
-void virNetServerClientRef(virNetServerClientPtr client);
-
 typedef void (*virNetServerClientFreeFunc)(void *data);
 
 void virNetServerClientSetPrivateData(virNetServerClientPtr client,
@@ -114,7 +113,5 @@ int virNetServerClientSendMessage(virNetServerClientPtr client,
 
 bool virNetServerClientNeedAuth(virNetServerClientPtr client);
 
-void virNetServerClientFree(virNetServerClientPtr client);
-
 
 #endif /* __VIR_NET_SERVER_CLIENT_H__ */
diff --git a/src/rpc/virnetserverprogram.c b/src/rpc/virnetserverprogram.c
index 7f589c8..db79fa2 100644
--- a/src/rpc/virnetserverprogram.c
+++ b/src/rpc/virnetserverprogram.c
@@ -30,6 +30,7 @@
 #include "virterror_internal.h"
 #include "logging.h"
 #include "virfile.h"
+#include "threads.h"
 
 #define VIR_FROM_THIS VIR_FROM_RPC
 #define virNetError(code, ...)                                    \
@@ -37,7 +38,7 @@
                          __FUNCTION__, __LINE__, __VA_ARGS__)
 
 struct _virNetServerProgram {
-    int refs;
+    virObject object;
 
     unsigned program;
     unsigned version;
@@ -45,6 +46,23 @@ struct _virNetServerProgram {
     size_t nprocs;
 };
 
+
+static virClassPtr virNetServerProgramClass;
+static void virNetServerProgramDispose(void *obj);
+
+static int virNetServerProgramOnceInit(void)
+{
+    if (!(virNetServerProgramClass = virClassNew("virNetServerProgram",
+                                                 sizeof(virNetServerProgram),
+                                                 virNetServerProgramDispose)))
+        return -1;
+
+    return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virNetServerProgram)
+
+
 virNetServerProgramPtr virNetServerProgramNew(unsigned program,
                                               unsigned version,
                                               virNetServerProgramProcPtr procs,
@@ -52,18 +70,18 @@ virNetServerProgramPtr virNetServerProgramNew(unsigned program,
 {
     virNetServerProgramPtr prog;
 
-    if (VIR_ALLOC(prog) < 0) {
-        virReportOOMError();
+    if (virNetServerProgramInitialize() < 0)
+        return NULL;
+
+    if (!(prog = virObjectNew(virNetServerProgramClass)))
         return NULL;
-    }
 
-    prog->refs = 1;
     prog->program = program;
     prog->version = version;
     prog->procs = procs;
     prog->nprocs = nprocs;
 
-    VIR_DEBUG("prog=%p refs=%d", prog, prog->refs);
+    VIR_DEBUG("prog=%p", prog);
 
     return prog;
 }
@@ -81,13 +99,6 @@ int virNetServerProgramGetVersion(virNetServerProgramPtr prog)
 }
 
 
-void virNetServerProgramRef(virNetServerProgramPtr prog)
-{
-    prog->refs++;
-    VIR_DEBUG("prog=%p refs=%d", prog, prog->refs);
-}
-
-
 int virNetServerProgramMatches(virNetServerProgramPtr prog,
                                virNetMessagePtr msg)
 {
@@ -519,16 +530,6 @@ int virNetServerProgramSendStreamData(virNetServerProgramPtr prog,
 }
 
 
-void virNetServerProgramFree(virNetServerProgramPtr prog)
+void virNetServerProgramDispose(void *obj ATTRIBUTE_UNUSED)
 {
-    if (!prog)
-        return;
-
-    VIR_DEBUG("prog=%p refs=%d", prog, prog->refs);
-
-    prog->refs--;
-    if (prog->refs > 0)
-        return;
-
-    VIR_FREE(prog);
 }
diff --git a/src/rpc/virnetserverprogram.h b/src/rpc/virnetserverprogram.h
index aa9f3cf..7bc9985 100644
--- a/src/rpc/virnetserverprogram.h
+++ b/src/rpc/virnetserverprogram.h
@@ -26,6 +26,7 @@
 
 # include "virnetmessage.h"
 # include "virnetserverclient.h"
+# include "virobject.h"
 
 typedef struct _virNetServer virNetServer;
 typedef virNetServer *virNetServerPtr;
@@ -67,8 +68,6 @@ int virNetServerProgramGetVersion(virNetServerProgramPtr prog);
 unsigned int virNetServerProgramGetPriority(virNetServerProgramPtr prog,
                                             int procedure);
 
-void virNetServerProgramRef(virNetServerProgramPtr prog);
-
 int virNetServerProgramMatches(virNetServerProgramPtr prog,
                                virNetMessagePtr msg);
 
@@ -102,9 +101,4 @@ int virNetServerProgramSendStreamData(virNetServerProgramPtr prog,
                                       const char *data,
                                       size_t len);
 
-void virNetServerProgramFree(virNetServerProgramPtr prog);
-
-
-
-
 #endif /* __VIR_NET_SERVER_PROGRAM_H__ */
diff --git a/src/rpc/virnetserverservice.c b/src/rpc/virnetserverservice.c
index 46cef3a..ffda655 100644
--- a/src/rpc/virnetserverservice.c
+++ b/src/rpc/virnetserverservice.c
@@ -27,12 +27,12 @@
 
 #include "memory.h"
 #include "virterror_internal.h"
-
+#include "threads.h"
 
 #define VIR_FROM_THIS VIR_FROM_RPC
 
 struct _virNetServerService {
-    int refs;
+    virObject object;
 
     size_t nsocks;
     virNetSocketPtr *socks;
@@ -48,6 +48,21 @@ struct _virNetServerService {
 };
 
 
+static virClassPtr virNetServerServiceClass;
+static void virNetServerServiceDispose(void *obj);
+
+static int virNetServerServiceOnceInit(void)
+{
+    if (!(virNetServerServiceClass = virClassNew("virNetServerService",
+                                                 sizeof(virNetServerService),
+                                                 virNetServerServiceDispose)))
+        return -1;
+
+    return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virNetServerService)
+
 
 static void virNetServerServiceAccept(virNetSocketPtr sock,
                                       int events ATTRIBUTE_UNUSED,
@@ -76,7 +91,7 @@ static void virNetServerServiceAccept(virNetSocketPtr sock,
     if (svc->dispatchFunc(svc, client, svc->dispatchOpaque) < 0)
         virNetServerClientClose(client);
 
-    virNetServerClientFree(client);
+    virObjectUnref(client);
 
 cleanup:
     return;
@@ -84,21 +99,13 @@ cleanup:
 error:
     if (client) {
         virNetServerClientClose(client);
-        virNetServerClientFree(client);
+        virObjectUnref(client);
     } else {
         virObjectUnref(clientsock);
     }
 }
 
 
-static void virNetServerServiceEventFree(void *opaque)
-{
-    virNetServerServicePtr svc = opaque;
-
-    virNetServerServiceFree(svc);
-}
-
-
 virNetServerServicePtr virNetServerServiceNewTCP(const char *nodename,
                                                  const char *service,
                                                  int auth,
@@ -109,10 +116,12 @@ virNetServerServicePtr virNetServerServiceNewTCP(const char *nodename,
     virNetServerServicePtr svc;
     size_t i;
 
-    if (VIR_ALLOC(svc) < 0)
-        goto no_memory;
+    if (virNetServerServiceInitialize() < 0)
+        return NULL;
+
+    if (!(svc = virObjectNew(virNetServerServiceClass)))
+        return NULL;
 
-    svc->refs = 1;
     svc->auth = auth;
     svc->readonly = readonly;
     svc->nrequests_client_max = nrequests_client_max;
@@ -130,13 +139,13 @@ virNetServerServicePtr virNetServerServiceNewTCP(const char *nodename,
 
         /* IO callback is initially disabled, until we're ready
          * to deal with incoming clients */
-        virNetServerServiceRef(svc);
+        virObjectRef(svc);
         if (virNetSocketAddIOCallback(svc->socks[i],
                                       0,
                                       virNetServerServiceAccept,
                                       svc,
-                                      virNetServerServiceEventFree) < 0) {
-            virNetServerServiceFree(svc);
+                                      (virFreeCallback)virObjectUnref) < 0) {
+            virObjectUnref(svc);
             goto error;
         }
     }
@@ -144,10 +153,8 @@ virNetServerServicePtr virNetServerServiceNewTCP(const char *nodename,
 
     return svc;
 
-no_memory:
-    virReportOOMError();
 error:
-    virNetServerServiceFree(svc);
+    virObjectUnref(svc);
     return NULL;
 }
 
@@ -163,10 +170,12 @@ virNetServerServicePtr virNetServerServiceNewUNIX(const char *path,
     virNetServerServicePtr svc;
     int i;
 
-    if (VIR_ALLOC(svc) < 0)
-        goto no_memory;
+    if (virNetServerServiceInitialize() < 0)
+        return NULL;
+
+    if (!(svc = virObjectNew(virNetServerServiceClass)))
+        return NULL;
 
-    svc->refs = 1;
     svc->auth = auth;
     svc->readonly = readonly;
     svc->nrequests_client_max = nrequests_client_max;
@@ -189,13 +198,13 @@ virNetServerServicePtr virNetServerServiceNewUNIX(const char *path,
 
         /* IO callback is initially disabled, until we're ready
          * to deal with incoming clients */
-        virNetServerServiceRef(svc);
+        virObjectRef(svc);
         if (virNetSocketAddIOCallback(svc->socks[i],
                                       0,
                                       virNetServerServiceAccept,
                                       svc,
-                                      virNetServerServiceEventFree) < 0) {
-            virNetServerServiceFree(svc);
+                                      (virFreeCallback)virObjectUnref) < 0) {
+            virObjectUnref(svc);
             goto error;
         }
     }
@@ -206,7 +215,7 @@ virNetServerServicePtr virNetServerServiceNewUNIX(const char *path,
 no_memory:
     virReportOOMError();
 error:
-    virNetServerServiceFree(svc);
+    virObjectUnref(svc);
     return NULL;
 }
 
@@ -231,12 +240,6 @@ bool virNetServerServiceIsReadonly(virNetServerServicePtr svc)
 }
 
 
-void virNetServerServiceRef(virNetServerServicePtr svc)
-{
-    svc->refs++;
-}
-
-
 void virNetServerServiceSetDispatcher(virNetServerServicePtr svc,
                                       virNetServerServiceDispatchFunc func,
                                       void *opaque)
@@ -246,24 +249,16 @@ void virNetServerServiceSetDispatcher(virNetServerServicePtr svc,
 }
 
 
-void virNetServerServiceFree(virNetServerServicePtr svc)
+void virNetServerServiceDispose(void *obj)
 {
+    virNetServerServicePtr svc = obj;
     int i;
 
-    if (!svc)
-        return;
-
-    svc->refs--;
-    if (svc->refs > 0)
-        return;
-
     for (i = 0 ; i < svc->nsocks ; i++)
         virObjectUnref(svc->socks[i]);
     VIR_FREE(svc->socks);
 
     virObjectUnref(svc->tls);
-
-    VIR_FREE(svc);
 }
 
 void virNetServerServiceToggle(virNetServerServicePtr svc,
diff --git a/src/rpc/virnetserverservice.h b/src/rpc/virnetserverservice.h
index 8540bd9..67227a9 100644
--- a/src/rpc/virnetserverservice.h
+++ b/src/rpc/virnetserverservice.h
@@ -25,6 +25,7 @@
 # define __VIR_NET_SERVER_SERVICE_H__
 
 # include "virnetserverprogram.h"
+# include "virobject.h"
 
 enum {
     VIR_NET_SERVER_SERVICE_AUTH_NONE = 0,
@@ -55,14 +56,10 @@ int virNetServerServiceGetPort(virNetServerServicePtr svc);
 int virNetServerServiceGetAuth(virNetServerServicePtr svc);
 bool virNetServerServiceIsReadonly(virNetServerServicePtr svc);
 
-void virNetServerServiceRef(virNetServerServicePtr svc);
-
 void virNetServerServiceSetDispatcher(virNetServerServicePtr svc,
                                       virNetServerServiceDispatchFunc func,
                                       void *opaque);
 
-void virNetServerServiceFree(virNetServerServicePtr svc);
-
 void virNetServerServiceToggle(virNetServerServicePtr svc,
                                bool enabled);
 
-- 
1.7.10.2




More information about the libvir-list mailing list