static int
remoteDispatchClose(virNetServerPtr server ATTRIBUTE_UNUSED,
- virNetServerClientPtr client,
+ virNetServerClientPtr client ATTRIBUTE_UNUSED,
virNetMessageHeaderPtr hdr ATTRIBUTE_UNUSED,
virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED)
{
- virNetServerClientClose(client);
+ virNetServerClientDelayedClose(client);
return 0;
}
memset(msg, 0, sizeof(*msg));
msg->header.type = VIR_NET_REPLY;
if (virNetServerClientSendMessage(client, msg) < 0) {
- virNetServerClientMarkClose(client);
+ virNetServerClientImmediateClose(client);
virNetMessageFree(msg);
ret = -1;
}
virNetMessageQueueServe(&stream->rx);
if (ret < 0) {
virNetMessageFree(msg);
- virNetServerClientMarkClose(client);
+ virNetServerClientImmediateClose(client);
return -1;
}
msg->header.type = VIR_NET_REPLY;
if (virNetServerClientSendMessage(client, msg) < 0) {
virNetMessageFree(msg);
- virNetServerClientMarkClose(client);
+ virNetServerClientImmediateClose(client);
return -1;
}
}
{
int refs;
bool wantClose;
+ bool delayedClose;
virMutex lock;
virNetSocketPtr sock;
int auth;
return closed;
}
-void virNetServerClientMarkClose(virNetServerClientPtr client)
+void virNetServerClientDelayedClose(virNetServerClientPtr client)
+{
+ virNetServerClientLock(client);
+ client->delayedClose = true;
+ virNetServerClientUnlock(client);
+}
+
+void virNetServerClientImmediateClose(virNetServerClientPtr client)
{
virNetServerClientLock(client);
client->wantClose = true;
virNetMessageFree(msg);
virNetServerClientUpdateEvent(client);
+
+ if (client->delayedClose)
+ client->wantClose = true;
}
}
}
virNetServerClientDispatchFunc func,
void *opaque);
void virNetServerClientClose(virNetServerClientPtr client);
-
bool virNetServerClientIsClosed(virNetServerClientPtr client);
-void virNetServerClientMarkClose(virNetServerClientPtr client);
+
+void virNetServerClientDelayedClose(virNetServerClientPtr client);
+void virNetServerClientImmediateClose(virNetServerClientPtr client);
bool virNetServerClientWantClose(virNetServerClientPtr client);
int virNetServerClientInit(virNetServerClientPtr client);