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,
-       &notused, &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,
+       &notused, &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

Reply via email to