... 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 <[email protected]> --- 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 _______________________________________________ xorg-devel mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-devel
