static virClassPtr virNetServerClass;
static void virNetServerDispose(void *obj);
+static void virNetServerUpdateServicesLocked(virNetServerPtr srv,
+ bool enabled);
static int virNetServerOnceInit(void)
{
srv->clients[srv->nclients-1] = client;
virObjectRef(client);
+ if (srv->nclients == srv->nclients_max) {
+ /* Temporarily stop accepting new clients */
+ VIR_DEBUG("Temporarily suspending services due to max_clients");
+ virNetServerUpdateServicesLocked(srv, false);
+ }
+
virNetServerClientSetDispatcher(client,
virNetServerDispatchNewMessage,
srv);
}
-void virNetServerUpdateServices(virNetServerPtr srv,
- bool enabled)
+static void
+virNetServerUpdateServicesLocked(virNetServerPtr srv,
+ bool enabled)
{
size_t i;
- virObjectLock(srv);
for (i = 0; i < srv->nservices; i++)
virNetServerServiceToggle(srv->services[i], enabled);
+}
+
+void virNetServerUpdateServices(virNetServerPtr srv,
+ bool enabled)
+{
+ virObjectLock(srv);
+ virNetServerUpdateServicesLocked(srv, enabled);
virObjectUnlock(srv);
}
srv->nclients = 0;
}
+ /* Enable services if we can accept a new client.
+ * The new client can be accepted if we are at the limit. */
+ if (srv->nclients == srv->nclients_max - 1) {
+ /* Now it makes sense to accept() a new client. */
+ VIR_DEBUG("Re-enabling services");
+ virNetServerUpdateServicesLocked(srv, true);
+ }
+
virObjectUnlock(srv);
virObjectUnref(client);
virObjectLock(srv);