[libvirt] [PATCH v3 09/10] Turn virNetServer* into virObject instances

Daniel P. Berrange berrange at redhat.com
Mon Aug 6 11:53:05 UTC 2012


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

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

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 7dd7d5c..fa9e7e8 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;
@@ -1325,10 +1325,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 6f26ee5..fe5cae5 100644
--- a/daemon/stream.c
+++ b/daemon/stream.c
@@ -104,14 +104,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
  */
@@ -332,14 +324,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;
 }
 
@@ -365,7 +355,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) {
@@ -411,10 +401,11 @@ int daemonAddClientStream(virNetServerClientPtr client,
 
     if (virStreamEventAddCallback(stream->st, 0,
                                   daemonStreamEvent, client,
-                                  daemonStreamEventFreeFunc) < 0)
+                                  virObjectFreeCallback) < 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 73a1ec1..a3f3f6b 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1499,14 +1499,11 @@ virNetServerAddService;
 virNetServerAddSignalHandler;
 virNetServerAutoShutdown;
 virNetServerClose;
-virNetServerFree;
 virNetServerIsPrivileged;
 virNetServerKeepAliveRequired;
 virNetServerNew;
 virNetServerQuit;
-virNetServerRef;
 virNetServerRun;
-virNetServerServiceFree;
 virNetServerServiceNewTCP;
 virNetServerServiceNewUNIX;
 virNetServerSetTLSContext;
@@ -1517,7 +1514,6 @@ virNetServerUpdateServices;
 virNetServerClientAddFilter;
 virNetServerClientClose;
 virNetServerClientDelayedClose;
-virNetServerClientFree;
 virNetServerClientGetAuth;
 virNetServerClientGetFD;
 virNetServerClientGetIdentity;
@@ -1534,7 +1530,6 @@ virNetServerClientIsSecure;
 virNetServerClientLocalAddrString;
 virNetServerClientNeedAuth;
 virNetServerClientNew;
-virNetServerClientRef;
 virNetServerClientRemoteAddrString;
 virNetServerClientRemoveFilter;
 virNetServerClientSendMessage;
@@ -1562,13 +1557,11 @@ virNetServerMDNSStop;
 
 # virnetserverprogram.h
 virNetServerProgramDispatch;
-virNetServerProgramFree;
 virNetServerProgramGetID;
 virNetServerProgramGetPriority;
 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 56ed7d3..9bc8603 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -264,7 +264,7 @@ static void virLXCControllerFree(virLXCControllerPtr ctrl)
     if (ctrl->timerShutdown != -1)
         virEventRemoveTimeout(ctrl->timerShutdown);
 
-    virNetServerFree(ctrl->server);
+    virObjectUnref(ctrl->server);
 
     VIR_FREE(ctrl);
 }
@@ -620,7 +620,7 @@ static int virLXCControllerSetupServer(virLXCControllerPtr ctrl)
 
     if (virNetServerAddService(ctrl->server, svc, NULL) < 0)
         goto error;
-    virNetServerServiceFree(svc);
+    virObjectUnref(svc);
     svc = NULL;
 
     if (!(ctrl->prog = virNetServerProgramNew(VIR_LXC_PROTOCOL_PROGRAM,
@@ -635,9 +635,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 e9f500e..ecab0e0 100644
--- a/src/rpc/virnetserver.c
+++ b/src/rpc/virnetserver.c
@@ -66,7 +66,7 @@ struct _virNetServerJob {
 };
 
 struct _virNetServer {
-    int refs;
+    virObjectPtr object;
 
     virMutex lock;
 
@@ -113,6 +113,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);
@@ -179,18 +195,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);
 }
 
@@ -227,7 +243,7 @@ static int virNetServerDispatchNewMessage(virNetServerClientPtr client,
         job->msg = msg;
 
         if (prog) {
-            virNetServerProgramRef(prog);
+            virObjectRef(prog);
             job->prog = prog;
             priority = virNetServerProgramGetPriority(prog, msg->header.proc);
         }
@@ -236,7 +252,7 @@ static int virNetServerDispatchNewMessage(virNetServerClientPtr client,
 
         if (ret < 0) {
             VIR_FREE(job);
-            virNetServerProgramFree(prog);
+            virObjectUnref(prog);
         }
     } else {
         ret = virNetServerProcessMsg(srv, client, prog, msg);
@@ -276,7 +292,7 @@ static int virNetServerDispatchNewClient(virNetServerServicePtr svc ATTRIBUTE_UN
         goto error;
     }
     srv->clients[srv->nclients-1] = client;
-    virNetServerClientRef(client);
+    virObjectRef(client);
 
     virNetServerClientSetDispatcher(client,
                                     virNetServerDispatchNewMessage,
@@ -336,12 +352,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,
@@ -404,24 +419,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;
@@ -611,7 +616,7 @@ int virNetServerAddService(virNetServerPtr srv,
 #endif
 
     srv->services[srv->nservices-1] = svc;
-    virNetServerServiceRef(svc);
+    virObjectRef(svc);
 
     virNetServerServiceSetDispatcher(svc,
                                      virNetServerDispatchNewClient,
@@ -637,8 +642,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;
@@ -749,7 +753,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,
@@ -780,20 +784,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);
@@ -811,16 +805,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);
 
@@ -830,7 +824,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 92f741a..7dc52ca 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 85f7c88..d135b0f 100644
--- a/src/rpc/virnetserverclient.c
+++ b/src/rpc/virnetserverclient.c
@@ -57,7 +57,8 @@ struct _virNetServerClientFilter {
 
 struct _virNetServerClient
 {
-    int refs;
+    virObject object;
+
     bool wantClose;
     bool delayedClose;
     virMutex lock;
@@ -103,6 +104,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);
@@ -167,13 +184,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
@@ -182,15 +192,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--;
+                                  virObjectFreeCallback) < 0) {
+        virObjectUnref(client);
         return -1;
     }
 
@@ -334,15 +346,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;
@@ -365,28 +379,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)
 {
@@ -568,21 +572,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)
@@ -599,7 +591,6 @@ void virNetServerClientFree(virNetServerClientPtr client)
     virObjectUnref(client->sock);
     virNetServerClientUnlock(client);
     virMutexDestroy(&client->lock);
-    VIR_FREE(client);
 }
 
 
@@ -617,7 +608,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;
@@ -627,20 +618,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
@@ -904,12 +895,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;
             }
         }
@@ -1168,11 +1159,6 @@ virNetServerClientKeepAliveSendCB(void *opaque,
     return virNetServerClientSendMessage(opaque, msg);
 }
 
-static void
-virNetServerClientFreeCB(void *opaque)
-{
-    virNetServerClientFree(opaque);
-}
 
 int
 virNetServerClientInitKeepAlive(virNetServerClientPtr client,
@@ -1187,10 +1173,10 @@ virNetServerClientInitKeepAlive(virNetServerClientPtr client,
     if (!(ka = virKeepAliveNew(interval, count, client,
                                virNetServerClientKeepAliveSendCB,
                                virNetServerClientKeepAliveDeadCB,
-                               virNetServerClientFreeCB)))
+                               virObjectFreeCallback)))
         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 606c428..a1ff19b 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 c083fb3..d13b621 100644
--- a/src/rpc/virnetserverprogram.c
+++ b/src/rpc/virnetserverprogram.c
@@ -30,11 +30,12 @@
 #include "virterror_internal.h"
 #include "logging.h"
 #include "virfile.h"
+#include "threads.h"
 
 #define VIR_FROM_THIS VIR_FROM_RPC
 
 struct _virNetServerProgram {
-    int refs;
+    virObject object;
 
     unsigned program;
     unsigned version;
@@ -42,6 +43,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,
@@ -49,18 +67,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;
 }
@@ -78,13 +96,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)
 {
@@ -516,16 +527,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 015ecef..99e1661 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 93c0574..000b5b6 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);
+                                      virObjectFreeCallback) < 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);
+                                      virObjectFreeCallback) < 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 d6bf98b..98fd396 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.4




More information about the libvir-list mailing list