[PATCH v2 12/12] os: always check if client is local when connection is accepted
Pauli Nieminen
suokkos at gmail.com
Thu Dec 30 12:48:36 PST 2010
On Thu, Dec 30, 2010 at 9:07 PM, Alan Coopersmith
<alan.coopersmith at oracle.com> wrote:
> On 12/30/10 09:19 AM, Pauli 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>
>> ---
>> 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)
>
> That should be "Compute" not "Computer" (surprised it compiled,
> since you called it as Compute below).
>
Most likely it didn't link and I tested my previous version of X :/
But tomorrow is maybe better day.
>> +{
>> + 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(
>
>
> Everything else looks fine from a quick review though.
>
> --
> -Alan Coopersmith- alan.coopersmith at oracle.com
> Oracle Solaris Platform Engineering: X Window System
>
> _______________________________________________
> 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