[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,
> - ¬used, &alen, &from))
> + if (!_XSERVTransGetPeerAddr (oc->trans_conn, ¬used, &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