From: "Daniel P. Berrange" <berrange(a)redhat.com>
Make all the virNetServer* objects use the virObject APIs
for reference countign
Signed-off-by: Daniel P. Berrange <berrange(a)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