--name=virJSONValueFree \
--name=virLastErrFreeData \
--name=virNetMessageFree \
- --name=virNetClientFree \
- --name=virNetClientProgramFree \
- --name=virNetClientStreamFree \
--name=virNetServerMDNSFree \
--name=virNetServerMDNSEntryFree \
--name=virNetServerMDNSGroupFree \
virNetClientAddStream;
virNetClientClose;
virNetClientDupFD;
-virNetClientFree;
virNetClientGetFD;
virNetClientGetTLSKeySize;
virNetClientHasPassFD;
virNetClientNewSSH;
virNetClientNewTCP;
virNetClientNewUNIX;
-virNetClientRef;
virNetClientRemoteAddrString;
virNetClientRemoveStream;
virNetClientSendNoReply;
# virnetclientprogram.h
virNetClientProgramCall;
virNetClientProgramDispatch;
-virNetClientProgramFree;
virNetClientProgramGetProgram;
virNetClientProgramGetVersion;
virNetClientProgramMatches;
virNetClientProgramNew;
-virNetClientProgramRef;
# virnetclientstream.h
virNetClientStreamEventAddCallback;
virNetClientStreamEventRemoveCallback;
virNetClientStreamEventUpdateCallback;
-virNetClientStreamFree;
virNetClientStreamMatches;
virNetClientStreamNew;
virNetClientStreamQueuePacket;
virNetClientStreamRaiseError;
virNetClientStreamRecvPacket;
-virNetClientStreamRef;
virNetClientStreamSendPacket;
virNetClientStreamSetError;
# file: src/rpc/virnetclient.c
# prefix: rpc
- probe rpc_client_new(void *client, int refs, void *sock);
- probe rpc_client_ref(void *client, int refs);
- probe rpc_client_free(void *client, int refs);
+ probe rpc_client_new(void *client, void *sock);
probe rpc_client_msg_tx_queue(void *client, int len, int prog, int vers, int proc, int type, int status, int serial);
probe rpc_client_msg_rx(void *client, int len, int prog, int vers, int proc, int type, int status, int serial);
if (mon->cb && mon->cb->destroy)
(mon->cb->destroy)(mon, mon->vm);
virMutexDestroy(&mon->lock);
- virNetClientProgramFree(mon->program);
+ virObjectUnref(mon->program);
VIR_FREE(mon);
}
{
if (mon->client) {
virNetClientClose(mon->client);
- virNetClientFree(mon->client);
+ virObjectUnref(mon->client);
mon->client = NULL;
}
}
virReportOOMError();
failed:
- virNetClientProgramFree(priv->remoteProgram);
- virNetClientProgramFree(priv->qemuProgram);
+ virObjectUnref(priv->remoteProgram);
+ virObjectUnref(priv->qemuProgram);
virNetClientClose(priv->client);
- virNetClientFree(priv->client);
+ virObjectUnref(priv->client);
priv->client = NULL;
VIR_FREE(priv->hostname);
virObjectUnref(priv->tls);
priv->tls = NULL;
virNetClientClose(priv->client);
- virNetClientFree(priv->client);
+ virObjectUnref(priv->client);
priv->client = NULL;
- virNetClientProgramFree(priv->remoteProgram);
- virNetClientProgramFree(priv->qemuProgram);
+ virObjectUnref(priv->remoteProgram);
+ virObjectUnref(priv->qemuProgram);
priv->remoteProgram = priv->qemuProgram = NULL;
/* Free hostname copy */
cleanup:
virNetClientRemoveStream(priv->client, privst);
- virNetClientStreamFree(privst);
+ virObjectUnref(privst);
st->privateData = NULL;
st->driver = NULL;
cleanup:
virNetClientRemoveStream(priv->client, privst);
- virNetClientStreamFree(privst);
+ virObjectUnref(privst);
st->privateData = NULL;
st->driver = NULL;
goto done;
if (virNetClientAddStream(priv->client, netst) < 0) {
- virNetClientStreamFree(netst);
+ virObjectUnref(netst);
goto done;
}
(xdrproc_t) xdr_remote_domain_migrate_prepare_tunnel3_args, (char *) &args,
(xdrproc_t) xdr_remote_domain_migrate_prepare_tunnel3_ret, (char *) &ret) == -1) {
virNetClientRemoveStream(priv->client, netst);
- virNetClientStreamFree(netst);
+ virObjectUnref(netst);
goto done;
}
print " goto done;\n";
print "\n";
print " if (virNetClientAddStream(priv->client, netst) < 0) {\n";
- print " virNetClientStreamFree(netst);\n";
+ print " virObjectUnref(netst);\n";
print " goto done;\n";
print " }";
print "\n";
if ($call->{streamflag} ne "none") {
print " virNetClientRemoveStream(priv->client, netst);\n";
- print " virNetClientStreamFree(netst);\n";
+ print " virObjectUnref(netst);\n";
print " st->driver = NULL;\n";
print " st->privateData = NULL;\n";
}
struct _virNetClient {
- int refs;
+ virObject object;
virMutex lock;
};
+static virClassPtr virNetClientClass;
+static void virNetClientDispose(void *obj);
+
+static int virNetClientOnceInit(void)
+{
+ if (!(virNetClientClass = virClassNew("virNetClient",
+ sizeof(virNetClient),
+ virNetClientDispose)))
+ return -1;
+
+ return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virNetClient)
+
static void virNetClientIOEventLoopPassTheBuck(virNetClientPtr client,
virNetClientCallPtr thiscall);
static int virNetClientQueueNonBlocking(virNetClientPtr client,
}
-static void virNetClientEventFree(void *opaque)
-{
- virNetClientPtr client = opaque;
-
- virNetClientFree(client);
-}
-
bool
virNetClientKeepAliveIsSupported(virNetClientPtr client)
{
int wakeupFD[2] = { -1, -1 };
virKeepAlivePtr ka = NULL;
+ if (virNetClientInitialize() < 0)
+ return NULL;
+
if (pipe2(wakeupFD, O_CLOEXEC) < 0) {
virReportSystemError(errno, "%s",
_("unable to make pipe"));
goto error;
}
- if (VIR_ALLOC(client) < 0)
- goto no_memory;
-
- client->refs = 1;
+ if (!(client = virObjectNew(virNetClientClass)))
+ goto error;
- if (virMutexInit(&client->lock) < 0)
+ if (virMutexInit(&client->lock) < 0) {
+ VIR_FREE(client);
goto error;
+ }
client->sock = sock;
client->wakeupReadFD = wakeupFD[0];
goto no_memory;
/* Set up a callback to listen on the socket data */
- client->refs++;
+ virObjectRef(client);
if (virNetSocketAddIOCallback(client->sock,
VIR_EVENT_HANDLE_READABLE,
virNetClientIncomingEvent,
client,
- virNetClientEventFree) < 0) {
- client->refs--;
+ virObjectFreeCallback) < 0) {
+ virObjectUnref(client);
VIR_DEBUG("Failed to add event watch, disabling events and support for"
" keepalive messages");
} else {
if (!(ka = virKeepAliveNew(-1, 0, client,
virNetClientKeepAliveSendCB,
virNetClientKeepAliveDeadCB,
- virNetClientEventFree)))
+ virObjectFreeCallback)))
goto error;
/* keepalive object has a reference to client */
- client->refs++;
+ virObjectRef(client);
}
client->keepalive = ka;
PROBE(RPC_CLIENT_NEW,
- "client=%p refs=%d sock=%p",
- client, client->refs, client->sock);
+ "client=%p sock=%p",
+ client, client->sock);
return client;
no_memory:
virKeepAliveStop(ka);
virObjectUnref(ka);
}
- virNetClientFree(client);
+ virObjectUnref(client);
return NULL;
}
}
-void virNetClientRef(virNetClientPtr client)
-{
- virNetClientLock(client);
- client->refs++;
- PROBE(RPC_CLIENT_REF,
- "client=%p refs=%d",
- client, client->refs);
- virNetClientUnlock(client);
-}
-
-
int virNetClientGetFD(virNetClientPtr client)
{
int fd;
}
-void virNetClientFree(virNetClientPtr client)
+void virNetClientDispose(void *obj)
{
+ virNetClientPtr client = obj;
int i;
- if (!client)
- return;
-
- virNetClientLock(client);
- PROBE(RPC_CLIENT_FREE,
- "client=%p refs=%d",
- client, client->refs);
- client->refs--;
- if (client->refs > 0) {
- virNetClientUnlock(client);
- return;
- }
-
if (client->closeFf)
client->closeFf(client->closeOpaque);
for (i = 0 ; i < client->nprograms ; i++)
- virNetClientProgramFree(client->programs[i]);
+ virObjectUnref(client->programs[i]);
VIR_FREE(client->programs);
VIR_FORCE_CLOSE(client->wakeupSendFD);
virNetClientUnlock(client);
virMutexDestroy(&client->lock);
-
- VIR_FREE(client);
}
virNetClientCloseFunc closeCb = client->closeCb;
void *closeOpaque = client->closeOpaque;
int closeReason = client->closeReason;
- client->refs++;
+ virObjectRef(client);
virNetClientUnlock(client);
if (ka) {
closeCb(client, closeReason, closeOpaque);
virNetClientLock(client);
- client->refs--;
+ virObjectUnref(client);
}
}
if (VIR_EXPAND_N(client->programs, client->nprograms, 1) < 0)
goto no_memory;
- client->programs[client->nprograms-1] = prog;
- virNetClientProgramRef(prog);
+ client->programs[client->nprograms-1] = virObjectRef(prog);
virNetClientUnlock(client);
return 0;
if (VIR_EXPAND_N(client->streams, client->nstreams, 1) < 0)
goto no_memory;
- client->streams[client->nstreams-1] = st;
- virNetClientStreamRef(st);
+ client->streams[client->nstreams-1] = virObjectRef(st);
virNetClientUnlock(client);
return 0;
VIR_FREE(client->streams);
client->nstreams = 0;
}
- virNetClientStreamFree(st);
+ virObjectUnref(st);
cleanup:
virNetClientUnlock(client);
# endif
# include "virnetclientprogram.h"
# include "virnetclientstream.h"
+# include "virobject.h"
virNetClientPtr virNetClientNewUNIX(const char *path,
void *opaque,
virFreeCallback ff);
-void virNetClientRef(virNetClientPtr client);
-
int virNetClientGetFD(virNetClientPtr client);
int virNetClientDupFD(virNetClientPtr client, bool cloexec);
int virNetClientGetTLSKeySize(virNetClientPtr client);
-void virNetClientFree(virNetClientPtr client);
void virNetClientClose(virNetClientPtr client);
bool virNetClientKeepAliveIsSupported(virNetClientPtr client);
#include "logging.h"
#include "util.h"
#include "virfile.h"
+#include "threads.h"
#define VIR_FROM_THIS VIR_FROM_RPC
struct _virNetClientProgram {
- int refs;
+ virObject object;
unsigned program;
unsigned version;
void *eventOpaque;
};
+static virClassPtr virNetClientProgramClass;
+static void virNetClientProgramDispose(void *obj);
+
+static int virNetClientProgramOnceInit(void)
+{
+ if (!(virNetClientProgramClass = virClassNew("virNetClientProgram",
+ sizeof(virNetClientProgram),
+ virNetClientProgramDispose)))
+ return -1;
+
+ return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virNetClientProgram)
+
+
virNetClientProgramPtr virNetClientProgramNew(unsigned program,
unsigned version,
virNetClientProgramEventPtr events,
{
virNetClientProgramPtr prog;
- if (VIR_ALLOC(prog) < 0) {
- virReportOOMError();
+ if (virNetClientProgramInitialize() < 0)
+ return NULL;
+
+ if (!(prog = virObjectNew(virNetClientProgramClass)))
return NULL;
- }
- prog->refs = 1;
prog->program = program;
prog->version = version;
prog->events = events;
}
-void virNetClientProgramRef(virNetClientProgramPtr prog)
+void virNetClientProgramDispose(void *obj ATTRIBUTE_UNUSED)
{
- prog->refs++;
-}
-
-
-void virNetClientProgramFree(virNetClientProgramPtr prog)
-{
- if (!prog)
- return;
-
- prog->refs--;
- if (prog->refs > 0)
- return;
-
- VIR_FREE(prog);
}
# include <rpc/xdr.h>
# include "virnetmessage.h"
+# include "virobject.h"
typedef struct _virNetClient virNetClient;
typedef virNetClient *virNetClientPtr;
unsigned virNetClientProgramGetProgram(virNetClientProgramPtr prog);
unsigned virNetClientProgramGetVersion(virNetClientProgramPtr prog);
-void virNetClientProgramRef(virNetClientProgramPtr prog);
-
-void virNetClientProgramFree(virNetClientProgramPtr prog);
-
int virNetClientProgramMatches(virNetClientProgramPtr prog,
virNetMessagePtr msg);
#define VIR_FROM_THIS VIR_FROM_RPC
struct _virNetClientStream {
+ virObject object;
+
virMutex lock;
virNetClientProgramPtr prog;
int proc;
unsigned serial;
- int refs;
virError err;
};
+static virClassPtr virNetClientStreamClass;
+static void virNetClientStreamDispose(void *obj);
+
+static int virNetClientStreamOnceInit(void)
+{
+ if (!(virNetClientStreamClass = virClassNew("virNetClientStream",
+ sizeof(virNetClientStream),
+ virNetClientStreamDispose)))
+ return -1;
+
+ return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virNetClientStream)
+
+
static void
virNetClientStreamEventTimerUpdate(virNetClientStreamPtr st)
{
}
-static void
-virNetClientStreamEventTimerFree(void *opaque)
-{
- virNetClientStreamPtr st = opaque;
- virNetClientStreamFree(st);
-}
-
-
virNetClientStreamPtr virNetClientStreamNew(virNetClientProgramPtr prog,
int proc,
unsigned serial)
{
virNetClientStreamPtr st;
- if (VIR_ALLOC(st) < 0) {
- virReportOOMError();
+ if (virNetClientStreamInitialize() < 0)
+ return NULL;
+
+ if (!(st = virObjectNew(virNetClientStreamClass)))
return NULL;
- }
- st->refs = 1;
st->prog = prog;
st->proc = proc;
st->serial = serial;
return NULL;
}
- virNetClientProgramRef(prog);
+ virObjectRef(prog);
return st;
}
-
-void virNetClientStreamRef(virNetClientStreamPtr st)
+void virNetClientStreamDispose(void *obj)
{
- virMutexLock(&st->lock);
- st->refs++;
- virMutexUnlock(&st->lock);
-}
-
-void virNetClientStreamFree(virNetClientStreamPtr st)
-{
- virMutexLock(&st->lock);
- st->refs--;
- if (st->refs > 0) {
- virMutexUnlock(&st->lock);
- return;
- }
-
- virMutexUnlock(&st->lock);
+ virNetClientStreamPtr st = obj;
virResetError(&st->err);
VIR_FREE(st->incoming);
virMutexDestroy(&st->lock);
- virNetClientProgramFree(st->prog);
- VIR_FREE(st);
+ virObjectUnref(st->prog);
}
bool virNetClientStreamMatches(virNetClientStreamPtr st,
goto cleanup;
}
- st->refs++;
+ virObjectRef(st);
if ((st->cbTimer =
virEventAddTimeout(-1,
virNetClientStreamEventTimer,
st,
- virNetClientStreamEventTimerFree)) < 0) {
- st->refs--;
+ virObjectFreeCallback)) < 0) {
+ virObjectUnref(st);
goto cleanup;
}
# define __VIR_NET_CLIENT_STREAM_H__
# include "virnetclientprogram.h"
+# include "virobject.h"
typedef struct _virNetClientStream virNetClientStream;
typedef virNetClientStream *virNetClientStreamPtr;
int proc,
unsigned serial);
-void virNetClientStreamRef(virNetClientStreamPtr st);
-
-void virNetClientStreamFree(virNetClientStreamPtr st);
-
bool virNetClientStreamRaiseError(virNetClientStreamPtr st);
int virNetClientStreamSetError(virNetClientStreamPtr st,