[PATCH xserver 21/23] os: eliminate fd value limits for clients
Keith Packard
keithp at keithp.com
Thu May 26 23:59:56 UTC 2016
With no code depending on the range of file descriptors, checking
for that can be eliminated.
Signed-off-by: Keith Packard <keithp at keithp.com>
---
os/connection.c | 81 ++++++++++++---------------------------------------------
os/osdep.h | 43 +++++-------------------------
2 files changed, 23 insertions(+), 101 deletions(-)
diff --git a/os/connection.c b/os/connection.c
index 1ae50b1..24ad109 100644
--- a/os/connection.c
+++ b/os/connection.c
@@ -103,7 +103,6 @@ SOFTWARE.
#endif /* WIN32 */
#include "misc.h" /* for typedef of pointer */
#include "osdep.h"
-#include <X11/Xpoll.h>
#include "opaque.h"
#include "dixstruct.h"
#include "xace.h"
@@ -119,7 +118,6 @@ SOFTWARE.
#include "probes.h"
-static int lastfdesc; /* maximum file descriptor */
struct ospoll *server_poll;
int MaxClients = 0;
@@ -133,8 +131,6 @@ static char dynamic_display[7]; /* display name */
Bool PartialNetwork; /* continue even if unable to bind all addrs */
static Pid_t ParentProcess;
-static Bool debug_conns = FALSE;
-
int GrabInProgress = 0;
static void
@@ -148,19 +144,15 @@ set_poll_clients(void);
#if !defined(WIN32)
int *ConnectionTranslation = NULL;
+int ConnectionTranslationSize = 0;
#else
/*
- * On NT fds are not between 0 and MAXSOCKS, they are unrelated, and there is
+ * On NT fds are not small integers, they are unrelated, and there is
* not even a known maximum value, so use something quite arbitrary for now.
* Do storage is a hash table of size 256. Collisions are handled in a linked
* list.
*/
-#undef MAXSOCKS
-#define MAXSOCKS 512
-#undef MAXSELECT
-#define MAXSELECT 512
-
struct _ct_node {
struct _ct_node *next;
int key;
@@ -265,47 +257,17 @@ lookup_trans_conn(int fd)
void
InitConnectionLimits(void)
{
- lastfdesc = -1;
-
-#ifndef __CYGWIN__
-
-#if !defined(XNO_SYSCONF) && defined(_SC_OPEN_MAX)
- lastfdesc = sysconf(_SC_OPEN_MAX) - 1;
-#endif
-
-#ifdef HAVE_GETDTABLESIZE
- if (lastfdesc < 0)
- lastfdesc = getdtablesize() - 1;
-#endif
-
-#ifdef _NFILE
- if (lastfdesc < 0)
- lastfdesc = _NFILE - 1;
-#endif
-
-#endif /* __CYGWIN__ */
-
- /* This is the fallback */
- if (lastfdesc < 0)
- lastfdesc = MAXSOCKS;
-
- if (lastfdesc > MAXSELECT)
- lastfdesc = MAXSELECT;
-
- if (lastfdesc > MAXCLIENTS) {
- lastfdesc = MAXCLIENTS;
- if (debug_conns)
- ErrorF("REACHED MAXIMUM CLIENTS LIMIT %d\n", LimitClients);
- }
- MaxClients = lastfdesc;
+ MaxClients = MAXCLIENTS;
#ifdef DEBUG
ErrorF("InitConnectionLimits: MaxClients = %d\n", MaxClients);
#endif
#if !defined(WIN32)
- if (!ConnectionTranslation)
- ConnectionTranslation = xnfallocarray(lastfdesc + 1, sizeof(int));
+ if (!ConnectionTranslation) {
+ ConnectionTranslation = xnfallocarray(MaxClients, sizeof(int));
+ ConnectionTranslationSize = MaxClients;
+ }
#else
InitConnectionTranslation();
#endif
@@ -388,7 +350,7 @@ CreateWellKnownSockets(void)
FatalError("failed to allocate poll structure");
#if !defined(WIN32)
- for (i = 0; i < MaxClients; i++)
+ for (i = 0; i < ConnectionTranslationSize; i++)
ConnectionTranslation[i] = 0;
#else
ClearConnectionTranslation();
@@ -762,14 +724,6 @@ AllocNewConnection(XtransConnInfo trans_conn, int fd, CARD32 conn_time)
OsCommPtr oc;
ClientPtr client;
- if (
-#ifndef WIN32
- fd >= lastfdesc
-#else
- XFD_SETCOUNT(&AllClients) >= MaxClients
-#endif
- )
- return NullClient;
oc = malloc(sizeof(OsCommRec));
if (!oc)
return NullClient;
@@ -786,6 +740,10 @@ AllocNewConnection(XtransConnInfo trans_conn, int fd, CARD32 conn_time)
}
client->local = ComputeLocalClient(client);
#if !defined(WIN32)
+ if (fd >= ConnectionTranslationSize) {
+ ConnectionTranslationSize *= 2;
+ ConnectionTranslation = xnfreallocarray(ConnectionTranslation, ConnectionTranslationSize, sizeof (int));
+ }
ConnectionTranslation[fd] = client->index;
#else
SetConnectionTranslation(fd, client->index);
@@ -825,6 +783,7 @@ EstablishNewConnections(ClientPtr clientUnused, void *closure)
OsCommPtr oc;
XtransConnInfo trans_conn, new_trans_conn;
int status;
+ int clientid;
connect_time = GetTimeInMillis();
/* kill off stragglers */
@@ -846,17 +805,9 @@ EstablishNewConnections(ClientPtr clientUnused, void *closure)
newconn = _XSERVTransGetConnectionNumber(new_trans_conn);
- if (newconn < lastfdesc) {
- int clientid;
-
-#if !defined(WIN32)
- clientid = ConnectionTranslation[newconn];
-#else
- clientid = GetConnectionTranslation(newconn);
-#endif
- if (clientid && (client = clients[clientid]))
- CloseDownClient(client);
- }
+ clientid = GetConnectionTranslation(newconn);
+ if (clientid && (client = clients[clientid]))
+ CloseDownClient(client);
_XSERVTransSetOption(new_trans_conn, TRANS_NONBLOCKING, 1);
diff --git a/os/osdep.h b/os/osdep.h
index d44df76..8d89f35 100644
--- a/os/osdep.h
+++ b/os/osdep.h
@@ -64,43 +64,8 @@ SOFTWARE.
#endif
#include <poll.h>
-
-#ifndef OPEN_MAX
-#ifdef SVR4
-#define OPEN_MAX 512
-#else
-#include <sys/param.h>
-#ifndef OPEN_MAX
-#if defined(NOFILE) && !defined(NOFILES_MAX)
-#define OPEN_MAX NOFILE
-#else
-#if !defined(WIN32) || defined(__CYGWIN__)
-#define OPEN_MAX NOFILES_MAX
-#else
-#define OPEN_MAX 512
-#endif
-#endif
-#endif
-#endif
-#endif
-
-#include <X11/Xpoll.h>
-
-/*
- * MAXSOCKS is used only for initialising MaxClients when no other method
- * like sysconf(_SC_OPEN_MAX) is not supported.
- */
-
-#if OPEN_MAX <= 512
-#define MAXSOCKS (OPEN_MAX - 1)
-#else
-#define MAXSOCKS 512
-#endif
-
-/* MAXSELECT is the number of fds that select() can handle */
-#define MAXSELECT (sizeof(fd_set) * NBBY)
-
#include <stddef.h>
+#include <X11/Xos.h>
#if defined(XDMCP) || defined(HASXDMAUTH)
typedef Bool (*ValidatorFunc) (ARRAY8Ptr Auth, ARRAY8Ptr Data, int packet_type);
@@ -175,6 +140,12 @@ listen_to_client(ClientPtr client);
#if !defined(WIN32) || defined(__CYGWIN__)
extern int *ConnectionTranslation;
+extern int ConnectionTranslationSize;
+static inline int GetConnectionTranslation(int conn) {
+ if (conn >= ConnectionTranslationSize)
+ return 0;
+ return ConnectionTranslation[conn];
+}
#else
extern int GetConnectionTranslation(int conn);
extern void SetConnectionTranslation(int conn, int client);
--
2.8.0.rc3
More information about the xorg-devel
mailing list