[PATCH 1/3 (v3)] os: always check if client is local when connection is accepted

Pauli Nieminen suokkos at gmail.com
Fri Dec 31 02:52:25 PST 2010


On Fri, Dec 31, 2010 at 11:55 AM, Daniel Stone <daniel at fooishbar.org> wrote:
> From: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
>
> 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 at nokia.com>
> Reviewed-by: Daniel Stone <daniel at fooishbar.org>

I did same changes except comment down there. It works for me perfectly fine.

Thanks for your help.

(yes. Nokia mail server doesn't like to delivery mails just now)

>
> ---
>  include/os.h    |    1 +
>  os/access.c     |   18 ++++++++++++------
>  os/connection.c |    1 +
>  os/osdep.h      |    1 +
>  4 files changed, 15 insertions(+), 6 deletions(-)
>
> v3: Moved ComputeLocalClient back into access.c so it would actually compile,
>    two typo fixes (ComputerLocalClient and OsCommmPtr), line-wrapping fix, and
>    move os->local_client assignment to after client->osPrivate gets set. -ds
>
> diff --git a/include/os.h b/include/os.h
> index d747040..99a7002 100644
> --- a/include/os.h
> +++ b/include/os.h
> @@ -353,6 +353,7 @@ typedef struct sockaddr * sockaddrPtr;
>
>  extern _X_EXPORT int InvalidHost(sockaddrPtr /*saddr*/, int /*len*/, ClientPtr client);
>
> +extern Bool ComputeLocalClient(ClientPtr /* client */);
>  extern _X_EXPORT int LocalClient(ClientPtr /* client */);

Would it better to have this in internal header like os/osdep.h?

>
>  extern _X_EXPORT int LocalClientCred(ClientPtr, int *, int *);
> diff --git a/os/access.c b/os/access.c
> index 494986e..eb1a21d 100644
> --- a/os/access.c
> +++ b/os/access.c
> @@ -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
>  *
> diff --git a/os/connection.c b/os/connection.c
> index 5452ae1..5580fab 100644
> --- a/os/connection.c
> +++ b/os/connection.c
> @@ -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
> 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.2.3
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>


More information about the xorg-devel mailing list