[PATCH] registry: Make RegisterExtensionNames slightly less inefficient
Aaron Plattner
aplattner at nvidia.com
Wed Nov 13 16:27:11 PST 2013
On 11/13/2013 11:06 AM, Adam Jackson wrote:
> The big change is to defer strdup until we actually know the line
> matches the extension we're initializing. This cuts the number of calls
> to strdup on this path from 24090 to 554, and 'Xvfb -pogo' drops from
> about 45M to 38M instructions retired according to valgrind.
>
> Signed-off-by: Adam Jackson <ajax at redhat.com>
> ---
> dix/registry.c | 27 +++++++++++++--------------
> 1 file changed, 13 insertions(+), 14 deletions(-)
>
> diff --git a/dix/registry.c b/dix/registry.c
> index 82a3340..52ac9da 100644
> --- a/dix/registry.c
> +++ b/dix/registry.c
> @@ -124,10 +124,13 @@ RegisterExtensionNames(ExtensionEntry * extEntry)
> {
> char buf[256], *lineobj, *ptr;
> unsigned offset;
> + int namelen;
>
> if (fh == NULL)
> return;
>
> + namelen = strlen(extEntry->name);
> +
> rewind(fh);
>
> while (fgets(buf, sizeof(buf), fh)) {
> @@ -149,26 +152,22 @@ RegisterExtensionNames(ExtensionEntry * extEntry)
> goto invalid;
> }
>
> - /* Check for space character in the fifth position */
> - ptr = strchr(buf, ' ');
> - if (!ptr || ptr != buf + 4)
> + /* check for proper formatting */
> + if (buf[4] != ' ')
We should probably memset buf or let the C compiler initialize it, or
this could dereference uninitialized memory if there's a line that's
only 1, 2, or 3 chars long in fh.
> goto invalid;
>
> + /* check for extension name match */
> + if (strncmp(buf + 5, extEntry->name, namelen))
> + goto skip;
> +
> + if (buf[5 + namelen] != ':')
> + goto skip;
> +
> /* Duplicate the string after the space */
> - lineobj = strdup(ptr + 1);
> + lineobj = strdup(buf + 5);
> if (!lineobj)
> continue;
>
> - /* Check for a colon somewhere on the line */
> - ptr = strchr(buf, ':');
> - if (!ptr)
> - goto invalid;
> -
> - /* Compare the part before colon with the target extension name */
> - *ptr = 0;
> - if (strcmp(buf + 5, extEntry->name))
> - goto skip;
> -
> /* Get the opcode for the request, event, or error */
> offset = strtol(buf + 1, &ptr, 10);
> if (offset == 0 && ptr == buf + 1)
>
--
Aaron
More information about the xorg-devel
mailing list