提交 0f7f4b16 编写于 作者: D Daniel P. Berrange

Add callback to virNetClient to be invoked on connection close

Allow detection of socket close in virNetClient via a callback
function, triggered on any condition that causes the socket to
be closed.
Signed-off-by: NDaniel P. Berrange <berrange@redhat.com>
上级 e5a1bee0
......@@ -1319,6 +1319,7 @@ virNetClientSendNoReply;
virNetClientSendNonBlock;
virNetClientSendWithReply;
virNetClientSendWithReplyStream;
virNetClientSetCloseCallback;
virNetClientSetSASLSession;
virNetClientSetTLSSession;
......
......@@ -102,6 +102,10 @@ struct _virNetClient {
virKeepAlivePtr keepalive;
bool wantClose;
int closeReason;
virNetClientCloseFunc closeCb;
void *closeOpaque;
virFreeCallback closeFf;
};
......@@ -125,6 +129,19 @@ static void virNetClientUnlock(virNetClientPtr client)
}
void virNetClientSetCloseCallback(virNetClientPtr client,
virNetClientCloseFunc cb,
void *opaque,
virFreeCallback ff)
{
virNetClientLock(client);
client->closeCb = cb;
client->closeOpaque = opaque;
client->closeFf = ff;
virNetClientUnlock(client);
}
static void virNetClientIncomingEvent(virNetSocketPtr sock,
int events,
void *opaque);
......@@ -463,6 +480,9 @@ void virNetClientFree(virNetClientPtr client)
return;
}
if (client->closeFf)
client->closeFf(client->closeOpaque);
for (i = 0 ; i < client->nprograms ; i++)
virNetClientProgramFree(client->programs[i]);
VIR_FREE(client->programs);
......@@ -519,12 +539,19 @@ virNetClientCloseLocked(virNetClientPtr client)
client->keepalive = NULL;
client->wantClose = false;
if (ka) {
if (ka || client->closeCb) {
virNetClientCloseFunc closeCb = client->closeCb;
void *closeOpaque = client->closeOpaque;
int closeReason = client->closeReason;
client->refs++;
virNetClientUnlock(client);
virKeepAliveStop(ka);
virKeepAliveFree(ka);
if (ka) {
virKeepAliveStop(ka);
virKeepAliveFree(ka);
}
if (closeCb)
closeCb(client, closeReason, closeOpaque);
virNetClientLock(client);
client->refs--;
......@@ -534,7 +561,7 @@ virNetClientCloseLocked(virNetClientPtr client)
static void virNetClientCloseInternal(virNetClientPtr client,
int reason)
{
VIR_DEBUG("client=%p", client);
VIR_DEBUG("client=%p wantclose=%d", client, client ? client->wantClose : false);
if (!client)
return;
......
......@@ -51,6 +51,15 @@ virNetClientPtr virNetClientNewSSH(const char *nodename,
virNetClientPtr virNetClientNewExternal(const char **cmdargv);
typedef void (*virNetClientCloseFunc)(virNetClientPtr client,
int reason,
void *opaque);
void virNetClientSetCloseCallback(virNetClientPtr client,
virNetClientCloseFunc cb,
void *opaque,
virFreeCallback ff);
void virNetClientRef(virNetClientPtr client);
int virNetClientGetFD(virNetClientPtr client);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册