mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-02 09:55:18 +00:00
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: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
parent
e5a1bee07a
commit
0f7f4b160b
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user