We only ever need log2(buckets) when rebuilding the table, which is comparatively rare. Compute it when we need it instead of tracking it by hand.
Signed-off-by: Adam Jackson <a...@redhat.com> --- dix/resource.c | 21 +++++++++++++++------ 1 files changed, 15 insertions(+), 6 deletions(-) diff --git a/dix/resource.c b/dix/resource.c index fcda116..a5737f3 100644 --- a/dix/resource.c +++ b/dix/resource.c @@ -158,7 +158,6 @@ static void RebuildTable( #define SERVER_MINID 32 #define INITBUCKETS 64 -#define INITHASHSIZE 6 #define MAXHASHSIZE 11 typedef struct _Resource { @@ -172,7 +171,6 @@ typedef struct _ClientResource { ResourcePtr *resources; int elements; int buckets; - int hashsize; /* log(2)(buckets) */ XID fakeID; XID endFakeID; XID expectID; @@ -233,6 +231,19 @@ static const struct ResourceType predefTypes[] = { CallbackListPtr ResourceStateCallback; +static int +ilog2(unsigned int x) +{ + int r = 0; + + while (x > 1) { + r++; + x >>= 1; + } + + return r; +} + static _X_INLINE void CallResourceStateCallback(ResourceState state, ResourceRec *res) { @@ -313,7 +324,6 @@ InitClientResources(ClientPtr client) return FALSE; clientTable[i].buckets = INITBUCKETS; clientTable[i].elements = 0; - clientTable[i].hashsize = INITHASHSIZE; /* Many IDs allocated from the server client are visible to clients, * so we don't use the SERVER_BIT for them, but we have to start * past the magic value constants used in the protocol. For normal @@ -335,7 +345,7 @@ static int Hash(int client, XID id) { id &= RESOURCE_ID_MASK; - switch (clientTable[client].hashsize) + switch (ilog2(clientTable[client].buckets)) { case 6: return ((int)(0x03F & (id ^ (id>>6) ^ (id>>12)))); @@ -495,7 +505,7 @@ AddResource(XID id, RESTYPE type, pointer value) FatalError("client not in use\n"); } if ((rrec->elements >= 4*rrec->buckets) && - (rrec->hashsize < MAXHASHSIZE)) + (ilog2(rrec->buckets) < MAXHASHSIZE)) RebuildTable(client); head = &rrec->resources[Hash(client, id)]; res = malloc(sizeof(ResourceRec)); @@ -544,7 +554,6 @@ RebuildTable(int client) *rptr = NULL; *tptr = rptr; } - clientTable[client].hashsize++; for (j = clientTable[client].buckets, rptr = clientTable[client].resources; --j >= 0; -- 1.7.3.1 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel