From: Pauli Nieminen <[email protected]> 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 <[email protected]> --- os/access.c | 34 +--------------------------------- os/connection.c | 39 +++++++++++++++++++++++++++++++++++++++ os/osdep.h | 1 + 3 files changed, 41 insertions(+), 33 deletions(-) diff --git a/os/access.c b/os/access.c index 494986e..1df62c0 100644 --- a/os/access.c +++ b/os/access.c @@ -1030,41 +1030,9 @@ ResetHosts (char *display) /* Is client on the local host */ Bool LocalClient(ClientPtr client) { - int alen, family, notused; - Xtransaddr *from = NULL; - pointer addr; - register HOST *host; - if (!client->osPrivate) return FALSE; - if (!((OsCommPtr)client->osPrivate)->trans_conn) - return FALSE; - - if (!_XSERVTransGetPeerAddr (((OsCommPtr)client->osPrivate)->trans_conn, - ¬used, &alen, &from)) - { - family = ConvertAddr ((struct sockaddr *) from, - &alen, (pointer *)&addr); - if (family == -1) - { - free(from); - return FALSE; - } - if (family == FamilyLocal) - { - free(from); - return TRUE; - } - for (host = selfhosts; host; host = host->next) - { - if (addrEqual (family, addr, alen, host)) { - free(from); - return TRUE; - } - } - free(from); - } - return FALSE; + return ((OsCommmPtr)client->osPrivate)->local_client; } /* diff --git a/os/connection.c b/os/connection.c index 5452ae1..f545589 100644 --- a/os/connection.c +++ b/os/connection.c @@ -718,6 +718,44 @@ ClientAuthorized(ClientPtr client, return((char *)NULL); } +static Bool +ComputerLocalClient(OsCommPtr oc) +{ + int alen, family, notused; + Xtransaddr *from = NULL; + pointer addr; + register HOST *host; + + if (!oc->trans_conn) + return FALSE; + + if (!_XSERVTransGetPeerAddr (oc->trans_conn, + ¬used, &alen, &from)) + { + family = ConvertAddr ((struct sockaddr *) from, + &alen, (pointer *)&addr); + if (family == -1) + { + free(from); + return FALSE; + } + if (family == FamilyLocal) + { + free(from); + return TRUE; + } + for (host = selfhosts; host; host = host->next) + { + if (addrEqual (family, addr, alen, host)) { + free(from); + return TRUE; + } + } + free(from); + } + return FALSE; +} + static ClientPtr AllocNewConnection (XtransConnInfo trans_conn, int fd, CARD32 conn_time) { @@ -741,6 +779,7 @@ AllocNewConnection (XtransConnInfo trans_conn, int fd, CARD32 conn_time) oc->output = (ConnectionOutputPtr)NULL; oc->auth_id = None; oc->conn_time = conn_time; + oc->local_client = ComputeLocalClient(oc); if (!(client = NextAvailableClient((pointer)oc))) { free(oc); diff --git a/os/osdep.h b/os/osdep.h index 3c0e78f..b47605e 100644 --- a/os/osdep.h +++ b/os/osdep.h @@ -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( -- 1.7.0.4 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
