[Rpm-maint] Problems in rpmstrPoolRehash function
Michael Schroeder
mls at suse.de
Thu Sep 12 08:31:12 UTC 2013
On Wed, Sep 11, 2013 at 07:09:29PM +0200, Michael Schroeder wrote:
> There are different (and easier) ways to fix this:
>
> - you can always put an empty string into the pool, it would always
> have id 1. This simplifies the dummy entry check to:
> if (i != 1 && str[0] == 0)
>
> - you could get rid of the dummy entries and remove the
> rpmstrPoolStrlen() function. It's only used 5 times in the code
> and calling strlen() on the returned string does not cost much.
Having slept one night I think the best way is really to remove the
dummy entries. You can still have rpmstrPoolStrlen() if you start
each chunk with a non-zero character, e.g.
\377first_string_in_chunk\0...\0last_string_in_chunk\0
^ ^
You can then change rpmPoolStrlen to:
size_t rpmstrPoolStrlen(rpmstrPool pool, rpmsid sid)
{
size_t slen = 0;
if (pool && sid > 0 && sid <= pool->offs_size) {
const char *str = pool->offs[sid];
const char *nextstr = pool->offs[sid + 1];
if (nextstr[-1] == 0)
slen = nextstr - str - 1;
else
slen = strlen(str); /* last string in chunk */
}
return slen;
}
So rpmstrPoolStrlen() is as fast as before except for the last sting
in the chunk.
But maybe simply replacing the rpmstrPoolStrlen() calls with (inlined)
strlen() calls is even faster.
Cheers,
Michael.
--
Michael Schroeder mls at suse.de
SUSE LINUX Products GmbH, GF Jeff Hawn, HRB 16746 AG Nuernberg
main(_){while(_=~getchar())putchar(~_-1/(~(_|32)/13*2-11)*13);}
More information about the Rpm-maint
mailing list