--name=virNetServerMDNSGroupFree \
--name=virNetServerProgramFree \
--name=virNetServerServiceFree \
- --name=virNetSocketFree \
--name=virNWFilterDefFree \
--name=virNWFilterEntryFree \
--name=virNWFilterHashTableFree \
virNetSocketAddIOCallback;
virNetSocketClose;
virNetSocketDupFD;
-virNetSocketFree;
virNetSocketGetFD;
virNetSocketGetPort;
virNetSocketGetUNIXIdentity;
virNetSocketNewListenUNIX;
virNetSocketRead;
virNetSocketRecvFD;
-virNetSocketRef;
virNetSocketRemoteAddrString;
virNetSocketRemoveIOCallback;
virNetSocketSendFD;
# file: src/rpc/virnetsocket.c
# prefix: rpc
- probe rpc_socket_new(void *sock, int refs, int fd, int errfd, pid_t pid, const char *localAddr, const char *remoteAddr);
+ probe rpc_socket_new(void *sock, int fd, int errfd, pid_t pid, const char *localAddr, const char *remoteAddr);
probe rpc_socket_send_fd(void *sock, int fd);
probe rpc_socket_recv_fd(void *sock, int fd);
- probe rpc_socket_ref(void *sock, int refs);
- probe rpc_socket_free(void *sock, int refs);
# file: src/rpc/virnetserverclient.c
goto cleanup;
if (virNetSocketNewConnectTCP(host, port, &sock) == 0) {
spec->dest.fd.qemu = virNetSocketDupFD(sock, true);
- virNetSocketFree(sock);
+ virObjectUnref(sock);
}
if (virSecurityManagerClearSocketLabel(driver->securityManager, vm->def) < 0 ||
spec->dest.fd.qemu == -1)
VIR_FORCE_CLOSE(spec.dest.fd.qemu);
VIR_FORCE_CLOSE(spec.dest.fd.local);
} else {
- virNetSocketFree(sock);
+ virObjectUnref(sock);
VIR_FREE(spec.dest.unix_socket.file);
}
if (client->sock)
virNetSocketRemoveIOCallback(client->sock);
- virNetSocketFree(client->sock);
+ virObjectUnref(client->sock);
virObjectUnref(client->tls);
#if HAVE_SASL
virObjectUnref(client->sasl);
if (!client->sock)
return;
- virNetSocketFree(client->sock);
+ virObjectUnref(client->sock);
client->sock = NULL;
virObjectUnref(client->tls);
client->tls = NULL;
virEventRemoveTimeout(client->sockTimer);
virObjectUnref(client->tls);
virObjectUnref(client->tlsCtxt);
- virNetSocketFree(client->sock);
+ virObjectUnref(client->sock);
virNetServerClientUnlock(client);
virMutexDestroy(&client->lock);
VIR_FREE(client);
}
if (client->sock) {
- virNetSocketFree(client->sock);
+ virObjectUnref(client->sock);
client->sock = NULL;
}
virNetServerClientClose(client);
virNetServerClientFree(client);
} else {
- virNetSocketFree(clientsock);
+ virObjectUnref(clientsock);
}
}
return;
for (i = 0 ; i < svc->nsocks ; i++)
- virNetSocketFree(svc->socks[i]);
+ virObjectUnref(svc->socks[i]);
VIR_FREE(svc->socks);
virObjectUnref(svc->tls);
struct _virNetSocket {
+ virObject object;
+
virMutex lock;
- int refs;
int fd;
int watch;
};
+static virClassPtr virNetSocketClass;
+static void virNetSocketDispose(void *obj);
+
+static int virNetSocketOnceInit(void)
+{
+ if (!(virNetSocketClass = virClassNew("virNetSocket",
+ sizeof(virNetSocket),
+ virNetSocketDispose)))
+ return -1;
+
+ return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virNetSocket)
+
+
#ifndef WIN32
static int virNetSocketForkDaemon(const char *binary)
{
virNetSocketPtr sock;
int no_slow_start = 1;
+ if (virNetSocketInitialize() < 0)
+ return NULL;
+
VIR_DEBUG("localAddr=%p remoteAddr=%p fd=%d errfd=%d pid=%lld",
localAddr, remoteAddr,
fd, errfd, (long long) pid);
return NULL;
}
- if (VIR_ALLOC(sock) < 0) {
- virReportOOMError();
+ if (!(sock = virObjectNew(virNetSocketClass)))
return NULL;
- }
if (virMutexInit(&sock->lock) < 0) {
virReportSystemError(errno, "%s",
VIR_FREE(sock);
return NULL;
}
- sock->refs = 1;
if (localAddr)
sock->localAddr = *localAddr;
sock->client = isClient;
PROBE(RPC_SOCKET_NEW,
- "sock=%p refs=%d fd=%d errfd=%d pid=%lld localAddr=%s, remoteAddr=%s",
- sock, sock->refs, fd, errfd, (long long) pid,
+ "sock=%p fd=%d errfd=%d pid=%lld localAddr=%s, remoteAddr=%s",
+ sock, fd, errfd, (long long) pid,
NULLSTR(sock->localAddrStr), NULLSTR(sock->remoteAddrStr));
return sock;
error:
sock->fd = sock->errfd = -1; /* Caller owns fd/errfd on failure */
- virNetSocketFree(sock);
+ virObjectUnref(sock);
return NULL;
}
error:
for (i = 0 ; i < nsocks ; i++)
- virNetSocketFree(socks[i]);
+ virObjectUnref(socks[i]);
VIR_FREE(socks);
freeaddrinfo(ai);
VIR_FORCE_CLOSE(fd);
}
-void virNetSocketRef(virNetSocketPtr sock)
-{
- virMutexLock(&sock->lock);
- sock->refs++;
- PROBE(RPC_SOCKET_REF,
- "sock=%p refs=%d",
- sock, sock->refs);
- virMutexUnlock(&sock->lock);
-}
-
-
-void virNetSocketFree(virNetSocketPtr sock)
+void virNetSocketDispose(void *obj)
{
- if (!sock)
- return;
-
- virMutexLock(&sock->lock);
- PROBE(RPC_SOCKET_FREE,
- "sock=%p refs=%d",
- sock, sock->refs);
-
- sock->refs--;
- if (sock->refs > 0) {
- virMutexUnlock(&sock->lock);
- return;
- }
+ virNetSocketPtr sock = obj;
VIR_DEBUG("sock=%p fd=%d", sock, sock->fd);
if (sock->watch > 0) {
VIR_FREE(sock->localAddrStr);
VIR_FREE(sock->remoteAddrStr);
- virMutexUnlock(&sock->lock);
virMutexDestroy(&sock->lock);
-
- VIR_FREE(sock);
}
if (ff)
ff(eopaque);
- virNetSocketFree(sock);
+ virObjectUnref(sock);
}
int virNetSocketAddIOCallback(virNetSocketPtr sock,
{
int ret = -1;
- virNetSocketRef(sock);
+ virObjectRef(sock);
virMutexLock(&sock->lock);
if (sock->watch > 0) {
VIR_DEBUG("Watch already registered on socket %p", sock);
cleanup:
virMutexUnlock(&sock->lock);
if (ret != 0)
- virNetSocketFree(sock);
+ virObjectUnref(sock);
return ret;
}
# include "virsocketaddr.h"
# include "command.h"
# include "virnettlscontext.h"
+# include "virobject.h"
# ifdef HAVE_SASL
# include "virnetsaslcontext.h"
# endif
# endif
bool virNetSocketHasCachedData(virNetSocketPtr sock);
bool virNetSocketHasPendingData(virNetSocketPtr sock);
-void virNetSocketRef(virNetSocketPtr sock);
-void virNetSocketFree(virNetSocketPtr sock);
const char *virNetSocketLocalAddrString(virNetSocketPtr sock);
const char *virNetSocketRemoteAddrString(virNetSocketPtr sock);
if (virNetSocketNewConnectTCP(data->cnode, portstr, &csock) < 0)
goto cleanup;
- virNetSocketFree(csock);
+ virObjectUnref(csock);
for (i = 0 ; i < nlsock ; i++) {
if (virNetSocketAccept(lsock[i], &ssock) != -1 && ssock) {
goto cleanup;
}
}
- virNetSocketFree(ssock);
+ virObjectUnref(ssock);
ssock = NULL;
}
ret = 0;
cleanup:
- virNetSocketFree(ssock);
+ virObjectUnref(ssock);
for (i = 0 ; i < nlsock ; i++)
- virNetSocketFree(lsock[i]);
+ virObjectUnref(lsock[i]);
VIR_FREE(lsock);
return ret;
}
if (virNetSocketNewConnectUNIX(path, false, NULL, &csock) < 0)
goto cleanup;
- virNetSocketFree(csock);
+ virObjectUnref(csock);
if (virNetSocketAccept(lsock, &ssock) != -1) {
char c = 'a';
cleanup:
VIR_FREE(path);
- virNetSocketFree(lsock);
- virNetSocketFree(ssock);
+ virObjectUnref(lsock);
+ virObjectUnref(ssock);
if (tmpdir)
rmdir(tmpdir);
return ret;
cleanup:
VIR_FREE(path);
- virNetSocketFree(lsock);
- virNetSocketFree(ssock);
- virNetSocketFree(csock);
+ virObjectUnref(lsock);
+ virObjectUnref(ssock);
+ virObjectUnref(csock);
if (tmpdir)
rmdir(tmpdir);
return ret;
ret = 0;
cleanup:
- virNetSocketFree(csock);
+ virObjectUnref(csock);
return ret;
}
ret = 0;
cleanup:
- virNetSocketFree(csock);
+ virObjectUnref(csock);
return ret;
}
ret = 0;
cleanup:
- virNetSocketFree(csock);
+ virObjectUnref(csock);
return ret;
}