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:
parent
617b7d2211
commit
2d67ada3c4
18
os/access.c
18
os/access.c
|
@ -1028,20 +1028,19 @@ ResetHosts (char *display)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Is client on the local host */
|
/* Is client on the local host */
|
||||||
Bool LocalClient(ClientPtr client)
|
Bool
|
||||||
|
ComputeLocalClient(ClientPtr client)
|
||||||
{
|
{
|
||||||
int alen, family, notused;
|
int alen, family, notused;
|
||||||
Xtransaddr *from = NULL;
|
Xtransaddr *from = NULL;
|
||||||
pointer addr;
|
pointer addr;
|
||||||
register HOST *host;
|
register HOST *host;
|
||||||
|
OsCommPtr oc = (OsCommPtr) client->osPrivate;
|
||||||
|
|
||||||
if (!client->osPrivate)
|
if (!oc->trans_conn)
|
||||||
return FALSE;
|
|
||||||
if (!((OsCommPtr)client->osPrivate)->trans_conn)
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (!_XSERVTransGetPeerAddr (((OsCommPtr)client->osPrivate)->trans_conn,
|
if (!_XSERVTransGetPeerAddr (oc->trans_conn, ¬used, &alen, &from))
|
||||||
¬used, &alen, &from))
|
|
||||||
{
|
{
|
||||||
family = ConvertAddr ((struct sockaddr *) from,
|
family = ConvertAddr ((struct sockaddr *) from,
|
||||||
&alen, (pointer *)&addr);
|
&alen, (pointer *)&addr);
|
||||||
|
@ -1067,6 +1066,13 @@ Bool LocalClient(ClientPtr client)
|
||||||
return FALSE;
|
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
|
* Return the uid and gid of a connected local client
|
||||||
*
|
*
|
||||||
|
|
|
@ -746,6 +746,7 @@ AllocNewConnection (XtransConnInfo trans_conn, int fd, CARD32 conn_time)
|
||||||
free(oc);
|
free(oc);
|
||||||
return NullClient;
|
return NullClient;
|
||||||
}
|
}
|
||||||
|
oc->local_client = ComputeLocalClient(client);
|
||||||
#if !defined(WIN32)
|
#if !defined(WIN32)
|
||||||
ConnectionTranslation[fd] = client->index;
|
ConnectionTranslation[fd] = client->index;
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -172,6 +172,7 @@ typedef struct _osComm {
|
||||||
XID auth_id; /* authorization id */
|
XID auth_id; /* authorization id */
|
||||||
CARD32 conn_time; /* timestamp if not established, else 0 */
|
CARD32 conn_time; /* timestamp if not established, else 0 */
|
||||||
struct _XtransConnInfo *trans_conn; /* transport connection object */
|
struct _XtransConnInfo *trans_conn; /* transport connection object */
|
||||||
|
Bool local_client;
|
||||||
} OsCommRec, *OsCommPtr;
|
} OsCommRec, *OsCommPtr;
|
||||||
|
|
||||||
extern int FlushClient(
|
extern int FlushClient(
|
||||||
|
@ -217,6 +218,9 @@ typedef long int fd_mask;
|
||||||
#define ffs mffs
|
#define ffs mffs
|
||||||
extern int mffs(fd_mask);
|
extern int mffs(fd_mask);
|
||||||
|
|
||||||
|
/* in access.c */
|
||||||
|
extern Bool ComputeLocalClient(ClientPtr client);
|
||||||
|
|
||||||
/* in auth.c */
|
/* in auth.c */
|
||||||
extern void GenerateRandomData (int len, char *buf);
|
extern void GenerateRandomData (int len, char *buf);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue