}
+void virNetSocketRef(virNetSocketPtr sock)
+{
+ virMutexLock(&sock->lock);
+ sock->refs++;
+ virMutexUnlock(&sock->lock);
+}
+
+
void virNetSocketFree(virNetSocketPtr sock)
{
if (!sock)
{
int ret = -1;
+ virNetSocketRef(sock);
virMutexLock(&sock->lock);
if (sock->watch > 0) {
VIR_DEBUG("Watch already registered on socket %p", sock);
goto cleanup;
}
- sock->refs++;
if ((sock->watch = virEventAddHandle(sock->fd,
events,
virNetSocketEventHandle,
sock,
virNetSocketEventFree)) < 0) {
VIR_DEBUG("Failed to register watch on socket %p", sock);
- sock->refs--;
goto cleanup;
}
sock->func = func;
cleanup:
virMutexUnlock(&sock->lock);
+ if (ret != 0)
+ virNetSocketFree(sock);
return ret;
}
virNetSASLSessionPtr sess);
# endif
bool virNetSocketHasCachedData(virNetSocketPtr sock);
+void virNetSocketRef(virNetSocketPtr sock);
void virNetSocketFree(virNetSocketPtr sock);
const char *virNetSocketLocalAddrString(virNetSocketPtr sock);