[PATCH 2/3] os: Don't limit MaxClients to MAXCLIENTS

Adam Jackson ajax at redhat.com
Mon Dec 14 12:19:48 PST 2009


... which is sort of a funny thing to say.  MaxClients was actually the
maximum file descriptor number to pass to select(); MAXCLIENTS is the
client count limit.  Typical servers have quite a few file descriptors
open below MAXCLIENTS that are not clients (input devices, mostly),
which means you end up losing client slots.

Rename MaxClients to reflect its true nature, and don't clamp it to
MAXCLIENTS.

Signed-off-by: Adam Jackson <ajax at redhat.com>
---
 dix/dispatch.c   |    2 +-
 include/opaque.h |    1 -
 os/WaitFor.c     |    4 ++--
 os/connection.c  |   18 ++++++------------
 os/osdep.h       |    6 ++++--
 5 files changed, 13 insertions(+), 18 deletions(-)

diff --git a/dix/dispatch.c b/dix/dispatch.c
index 414bd04..ccbbc74 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -365,7 +365,7 @@ Dispatch(void)
     nextFreeClientID = 1;
     nClients = 0;
 
-    clientReady = xalloc(sizeof(int) * MaxClients);
+    clientReady = xalloc(sizeof(int) * MAXCLIENTS);
     if (!clientReady)
 	return;
 
diff --git a/include/opaque.h b/include/opaque.h
index b3c7c70..e97aca9 100644
--- a/include/opaque.h
+++ b/include/opaque.h
@@ -35,7 +35,6 @@ from The Open Group.
 
 extern _X_EXPORT char *defaultTextFont;
 extern _X_EXPORT char *defaultCursorFont;
-extern _X_EXPORT int MaxClients;
 extern _X_EXPORT volatile char isItTimeToYield;
 extern _X_EXPORT volatile char dispatchException;
 
diff --git a/os/WaitFor.c b/os/WaitFor.c
index 7d10183..1d16c74 100644
--- a/os/WaitFor.c
+++ b/os/WaitFor.c
@@ -222,11 +222,11 @@ WaitForSomething(int *pClientsReady)
 	else if (AnyClientsWriteBlocked)
 	{
 	    XFD_COPYSET(&ClientsWriteBlocked, &clientsWritable);
-	    i = Select (MaxClients, &LastSelectMask, &clientsWritable, NULL, wt);
+	    i = Select (MaxClientFd, &LastSelectMask, &clientsWritable, NULL, wt);
 	}
 	else 
 	{
-	    i = Select (MaxClients, &LastSelectMask, NULL, NULL, wt);
+	    i = Select (MaxClientFd, &LastSelectMask, NULL, NULL, wt);
 	}
 	selecterr = GetErrno();
 	WakeupHandler(i, (pointer)&LastSelectMask);
diff --git a/os/connection.c b/os/connection.c
index bf16f6a..651ac58 100644
--- a/os/connection.c
+++ b/os/connection.c
@@ -141,7 +141,7 @@ fd_set LastSelectMask;		/* mask returned from last select call */
 fd_set ClientsWithInput;	/* clients with FULL requests in buffer */
 fd_set ClientsWriteBlocked;	/* clients who cannot receive output */
 fd_set OutputPending;		/* clients with reply/event data ready to go */
-int MaxClients = 0;
+int MaxClientFd = 0;
 Bool NewOutputPending;		/* not yet attempted to write some new output */
 Bool AnyClientsWriteBlocked;	/* true if some client blocked on write */
 
@@ -251,7 +251,7 @@ void SetConnectionTranslation(int conn, int client)
 void ClearConnectionTranslation(void)
 {
 #ifndef WIN32
-    for (i=0; i<MaxClients; i++) ConnectionTranslation[i] = 0;
+    for (i=0; i<MaxClientFd; i++) ConnectionTranslation[i] = 0;
 #else
     unsigned i;
     for (i = 0; i < 256; i++)
@@ -287,7 +287,7 @@ lookup_trans_conn (int fd)
     return (NULL);
 }
 
-/* Set MaxClients and lastfdesc, and allocate ConnectionTranslation */
+/* Set MaxClientFd and lastfdesc, and allocate ConnectionTranslation */
 
 void
 InitConnectionLimits(void)
@@ -319,16 +319,10 @@ InitConnectionLimits(void)
     if (lastfdesc > MAXSELECT)
 	lastfdesc = MAXSELECT;
 
-    if (lastfdesc > MAXCLIENTS)
-    {
-	lastfdesc = MAXCLIENTS;
-	if (debug_conns)
-	    ErrorF( "REACHED MAXIMUM CLIENTS LIMIT %d\n", MAXCLIENTS);
-    }
-    MaxClients = lastfdesc;
+    MaxClientFd = lastfdesc;
 
 #ifdef DEBUG
-    ErrorF("InitConnectionLimits: MaxClients = %d\n", MaxClients);
+    ErrorF("InitConnectionLimits: MaxClientFd = %d\n", MaxClientFd);
 #endif
 
     InitConnectionTranslation();
@@ -741,7 +735,7 @@ AllocNewConnection (XtransConnInfo trans_conn, int fd, CARD32 conn_time)
 #ifndef WIN32
 	fd >= lastfdesc
 #else
-	XFD_SETCOUNT(&AllClients) >= MaxClients
+	XFD_SETCOUNT(&AllClients) >= MaxClientFd
 #endif
 	)
 	return NullClient;
diff --git a/os/osdep.h b/os/osdep.h
index 4ebe0e9..2cda4ff 100644
--- a/os/osdep.h
+++ b/os/osdep.h
@@ -89,9 +89,11 @@ SOFTWARE.
 
 #include <X11/Xpoll.h>
 
+extern int MaxClientFd;
+
 /*
- * MAXSOCKS is used only for initialising MaxClients when no other method
- * like sysconf(_SC_OPEN_MAX) is not supported.
+ * MAXSOCKS is used only for initialising MaxClientFd when no other method
+ * like sysconf(_SC_OPEN_MAX) is supported.
  */
 
 #if OPEN_MAX <= 256
-- 
1.6.5.2



More information about the xorg-devel mailing list