void
virNetServerProcessClients(virNetServer *srv)
{
- size_t i;
- virNetServerClient *client;
+ size_t i = 0;
- virObjectLock(srv);
+ while (true) {
+ virNetServerClient *client;
+ bool removed = false;
+
+ virObjectLock(srv);
+
+ if (i >= srv->nclients) {
+ virObjectUnlock(srv);
+ return;
+ }
- reprocess:
- for (i = 0; i < srv->nclients; i++) {
client = srv->clients[i];
virObjectLock(client);
if (virNetServerClientWantCloseLocked(client))
if (virNetServerClientIsClosedLocked(client)) {
VIR_DELETE_ELEMENT(srv->clients, i, srv->nclients);
+ removed = true;
/* Update server authentication tracking */
virNetServerSetClientAuthCompletedLocked(srv, client);
- virObjectUnlock(client);
-
virNetServerCheckLimits(srv);
+ }
+
+ virObjectUnlock(client);
+ if (removed) {
+ i = 0;
virObjectUnlock(srv);
virObjectUnref(client);
- virObjectLock(srv);
-
- goto reprocess;
- } else {
- virObjectUnlock(client);
+ continue;
}
- }
- virObjectUnlock(srv);
+ i++;
+
+ virObjectUnlock(srv);
+ }
}