os: always check if client is local when connection is accepted

LocalClient is used for all DRI2 requests that makes it frequently
called function. Querying if connection is local or not takes 10-15us
(on ARM) depending on malloc speed.

Signed-off-by: Pauli Nieminen <ext-pauli.nieminen@nokia.com>
Reviewed-by: Daniel Stone <daniel@fooishbar.org>
This commit is contained in:
Pauli Nieminen 2010-12-30 19:19:43 +02:00 committed by Daniel Stone
parent 617b7d2211
commit 2d67ada3c4
3 changed files with 17 additions and 6 deletions

View File

@ -1028,20 +1028,19 @@ ResetHosts (char *display)
}
/* Is client on the local host */
Bool LocalClient(ClientPtr client)
Bool
ComputeLocalClient(ClientPtr client)
{
int alen, family, notused;
Xtransaddr *from = NULL;
pointer addr;
register HOST *host;
OsCommPtr oc = (OsCommPtr) client->osPrivate;
if (!client->osPrivate)
return FALSE;
if (!((OsCommPtr)client->osPrivate)->trans_conn)
if (!oc->trans_conn)
return FALSE;
if (!_XSERVTransGetPeerAddr (((OsCommPtr)client->osPrivate)->trans_conn,
&notused, &alen, &from))
if (!_XSERVTransGetPeerAddr (oc->trans_conn, &notused, &alen, &from))
{
family = ConvertAddr ((struct sockaddr *) from,
&alen, (pointer *)&addr);
@ -1067,6 +1066,13 @@ Bool LocalClient(ClientPtr client)
return FALSE;
}
Bool LocalClient(ClientPtr client)
{
if (!client->osPrivate)
return FALSE;
return ((OsCommPtr)client->osPrivate)->local_client;
}
/*
* Return the uid and gid of a connected local client
*

View File

@ -746,6 +746,7 @@ AllocNewConnection (XtransConnInfo trans_conn, int fd, CARD32 conn_time)
free(oc);
return NullClient;
}
oc->local_client = ComputeLocalClient(client);
#if !defined(WIN32)
ConnectionTranslation[fd] = client->index;
#else

View File

@ -172,6 +172,7 @@ typedef struct _osComm {
XID auth_id; /* authorization id */
CARD32 conn_time; /* timestamp if not established, else 0 */
struct _XtransConnInfo *trans_conn; /* transport connection object */
Bool local_client;
} OsCommRec, *OsCommPtr;
extern int FlushClient(
@ -217,6 +218,9 @@ typedef long int fd_mask;
#define ffs mffs
extern int mffs(fd_mask);
/* in access.c */
extern Bool ComputeLocalClient(ClientPtr client);
/* in auth.c */
extern void GenerateRandomData (int len, char *buf);