rpc: virnetserver: Support retrieval of a list of clients

For now, the list copy is done simply by locking the whole server, walking the
original and increasing the refcount on each object. We may want to change
the list to a lockable object (like list of domains) later in the future if
we discover some performance issues related to locking the whole server in
order to walk the whole list of clients, possibly issuing some 'ForEach'
callback.

Signed-off-by: Erik Skultety <eskultet@redhat.com>
This commit is contained in:
Erik Skultety 2016-04-15 00:21:05 +02:00
parent 4bd430748c
commit 04bab54d05
3 changed files with 33 additions and 0 deletions

View File

@ -101,6 +101,7 @@ virNetServerAddClient;
virNetServerAddProgram;
virNetServerAddService;
virNetServerClose;
virNetServerGetClients;
virNetServerGetName;
virNetServerHasClients;
virNetServerNew;

View File

@ -943,3 +943,32 @@ virNetServerSetThreadPoolParameters(virNetServerPtr srv,
virObjectUnlock(srv);
return ret;
}
int
virNetServerGetClients(virNetServerPtr srv,
virNetServerClientPtr **clts)
{
int ret = -1;
size_t i;
size_t nclients = 0;
virNetServerClientPtr *list = NULL;
virObjectLock(srv);
for (i = 0; i < srv->nclients; i++) {
virNetServerClientPtr client = virObjectRef(srv->clients[i]);
if (VIR_APPEND_ELEMENT(list, nclients, client) < 0) {
virObjectUnref(client);
goto cleanup;
}
}
*clts = list;
list = NULL;
ret = nclients;
cleanup:
virObjectListFreeCount(list, nclients);
virObjectUnlock(srv);
return ret;
}

View File

@ -105,4 +105,7 @@ int virNetServerSetThreadPoolParameters(virNetServerPtr srv,
unsigned long long virNetServerNextClientID(virNetServerPtr srv);
int virNetServerGetClients(virNetServerPtr srv,
virNetServerClientPtr **clients);
#endif /* __VIR_NET_SERVER_H__ */