14a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg/* glxhash.c -- Small hash table support for integer -> integer mapping
24a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg * Taken from libdrm.
34a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg *
44ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * Created: Sun Apr 18 09:35:45 1999 by faith@precisioninsight.com
54ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
64ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
74ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * All Rights Reserved.
84ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
94ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * Permission is hereby granted, free of charge, to any person obtaining a
104ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * copy of this software and associated documentation files (the "Software"),
114ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * to deal in the Software without restriction, including without limitation
124ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
134ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * and/or sell copies of the Software, and to permit persons to whom the
144ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * Software is furnished to do so, subject to the following conditions:
154ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
164ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * The above copyright notice and this permission notice (including the next
174ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * paragraph) shall be included in all copies or substantial portions of the
184ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * Software.
194ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
204ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
214ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
224ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
234ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
244ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
254ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
264ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * DEALINGS IN THE SOFTWARE.
274ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
284ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * Authors: Rickard E. (Rik) Faith <faith@valinux.com>
294ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
304ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * DESCRIPTION
314ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
324ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * This file contains a straightforward implementation of a fixed-sized
334ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * hash table using self-organizing linked lists [Knuth73, pp. 398-399] for
344ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * collision resolution.  There are two potentially interesting things
354ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * about this implementation:
364ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
374ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * 1) The table is power-of-two sized.  Prime sized tables are more
384ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * traditional, but do not have a significant advantage over power-of-two
394ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * sized table, especially when double hashing is not used for collision
404ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * resolution.
414ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
424ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * 2) The hash computation uses a table of random integers [Hanson97,
434ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * pp. 39-41].
444ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
454ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * FUTURE ENHANCEMENTS
464ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
474ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * With a table size of 512, the current implementation is sufficient for a
484ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * few hundred keys.  Since this is well above the expected size of the
494ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * tables for which this implementation was designed, the implementation of
504ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * dynamic hash tables was postponed until the need arises.  A common (and
514ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * naive) approach to dynamic hash table implementation simply creates a
524ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * new hash table when necessary, rehashes all the data into the new table,
534ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * and destroys the old table.  The approach in [Larson88] is superior in
544ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * two ways: 1) only a portion of the table is expanded when needed,
554ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * distributing the expansion cost over several insertions, and 2) portions
564ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * of the table can be locked, enabling a scalable thread-safe
574ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * implementation.
584ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
594ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * REFERENCES
604ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
614ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * [Hanson97] David R. Hanson.  C Interfaces and Implementations:
624ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * Techniques for Creating Reusable Software.  Reading, Massachusetts:
634ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * Addison-Wesley, 1997.
644ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
654ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * [Knuth73] Donald E. Knuth. The Art of Computer Programming.  Volume 3:
664ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * Sorting and Searching.  Reading, Massachusetts: Addison-Wesley, 1973.
674ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
684ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * [Larson88] Per-Ake Larson. "Dynamic Hash Tables".  CACM 31(4), April
694ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg * 1988, pp. 446-457.
704ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg *
714ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg */
724ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
734ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#include "glxhash.h"
743d28a2690f3752990be50a25447747e237d7bee9Kristian Høgsberg#include <X11/Xfuncproto.h>
754ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
764ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#define HASH_MAIN 0
774ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
784ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#include <stdio.h>
794ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#include <stdlib.h>
80bc7546476078dd520af4853f6f0d3f577ec670ecBrian Paul#include <string.h>
814ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
824ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#define HASH_MAGIC 0xdeadbeef
834ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#define HASH_DEBUG 0
84bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf#define HASH_SIZE  512          /* Good for about 100 entries */
85bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf                                /* If you change this value, you probably
864ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg                                   have to change the HashHash hashing
874ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg                                   function! */
884ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
894ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#define HASH_ALLOC malloc
904ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#define HASH_FREE  free
91d09941c8cc2d4620eb774744c8878921b9dc3bccRobert Noland#ifndef __GLIBC__
92d09941c8cc2d4620eb774744c8878921b9dc3bccRobert Noland#define HASH_RANDOM_DECL	char *ps, rs[256]
93d09941c8cc2d4620eb774744c8878921b9dc3bccRobert Noland#define HASH_RANDOM_INIT(seed)	ps = initstate(seed, rs, sizeof(rs))
94d09941c8cc2d4620eb774744c8878921b9dc3bccRobert Noland#define HASH_RANDOM		random()
95d09941c8cc2d4620eb774744c8878921b9dc3bccRobert Noland#define HASH_RANDOM_DESTROY	setstate(ps)
96d09941c8cc2d4620eb774744c8878921b9dc3bccRobert Noland#else
979666529b5a5be1fcde82caadc2fe2efa5ea81e49Ian Romanick#define HASH_RANDOM_DECL	struct random_data rd; int32_t rv; char rs[256]
989666529b5a5be1fcde82caadc2fe2efa5ea81e49Ian Romanick#define HASH_RANDOM_INIT(seed)					\
999666529b5a5be1fcde82caadc2fe2efa5ea81e49Ian Romanick   do {								\
1009666529b5a5be1fcde82caadc2fe2efa5ea81e49Ian Romanick      (void) memset(&rd, 0, sizeof(rd));			\
1019666529b5a5be1fcde82caadc2fe2efa5ea81e49Ian Romanick      (void) initstate_r(seed, rs, sizeof(rs), &rd);		\
1029666529b5a5be1fcde82caadc2fe2efa5ea81e49Ian Romanick   } while(0)
1039666529b5a5be1fcde82caadc2fe2efa5ea81e49Ian Romanick#define HASH_RANDOM             ((void) random_r(&rd, &rv), rv)
1044ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#define HASH_RANDOM_DESTROY
105d09941c8cc2d4620eb774744c8878921b9dc3bccRobert Noland#endif
1064ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
107bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóftypedef struct __glxHashBucket
108bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf{
109bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   unsigned long key;
110bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   void *value;
111bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   struct __glxHashBucket *next;
1124ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg} __glxHashBucket, *__glxHashBucketPtr;
1134ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
1144ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsbergtypedef struct __glxHashTable *__glxHashTablePtr;
115bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristófstruct __glxHashTable
116bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf{
117bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   unsigned long magic;
118bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   unsigned long hits;          /* At top of linked list */
119bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   unsigned long partials;      /* Not at top of linked list */
120bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   unsigned long misses;        /* Not in table */
121bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashBucketPtr buckets[HASH_SIZE];
122bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   int p0;
123bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashBucketPtr p1;
1244ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg};
1254ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
126bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristófstatic unsigned long
127bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, KristófHashHash(unsigned long key)
1284ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg{
129bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   unsigned long hash = 0;
130bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   unsigned long tmp = key;
131bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   static int init = 0;
132bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   static unsigned long scatter[256];
133bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   int i;
134bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
135bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   if (!init) {
136bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      HASH_RANDOM_DECL;
137bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      HASH_RANDOM_INIT(37);
138bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      for (i = 0; i < 256; i++)
139bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         scatter[i] = HASH_RANDOM;
140bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      HASH_RANDOM_DESTROY;
141bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      ++init;
142bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   }
143bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
144bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   while (tmp) {
145bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      hash = (hash << 1) + scatter[tmp & 0xff];
146bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      tmp >>= 8;
147bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   }
148bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
149bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   hash %= HASH_SIZE;
1504ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#if HASH_DEBUG
151bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   printf("Hash(%d) = %d\n", key, hash);
1524ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#endif
153bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   return hash;
1544ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg}
1554ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
156bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf_X_HIDDEN __glxHashTable *
157bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf__glxHashCreate(void)
1584ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg{
159bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashTablePtr table;
160bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   int i;
161bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
162bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   table = HASH_ALLOC(sizeof(*table));
163bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   if (!table)
164bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      return NULL;
165bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   table->magic = HASH_MAGIC;
166bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   table->hits = 0;
167bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   table->partials = 0;
168bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   table->misses = 0;
169bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
170bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < HASH_SIZE; i++)
171bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      table->buckets[i] = NULL;
172bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   return table;
1734ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg}
1744ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
175bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf_X_HIDDEN int
176bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf__glxHashDestroy(__glxHashTable * t)
1774ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg{
178bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashTablePtr table = (__glxHashTablePtr) t;
179bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashBucketPtr bucket;
180bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashBucketPtr next;
181bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   int i;
182bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
183bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   if (table->magic != HASH_MAGIC)
184bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      return -1;                /* Bad magic */
185bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
186bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < HASH_SIZE; i++) {
187bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      for (bucket = table->buckets[i]; bucket;) {
188bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         next = bucket->next;
189bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         HASH_FREE(bucket);
190bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         bucket = next;
191bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      }
192bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   }
193bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   HASH_FREE(table);
194bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   return 0;
1954ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg}
1964ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
1974ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg/* Find the bucket and organize the list so that this bucket is at the
1984ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg   top. */
1994ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
200bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristófstatic __glxHashBucketPtr
201bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, KristófHashFind(__glxHashTablePtr table, unsigned long key, unsigned long *h)
2024ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg{
203bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   unsigned long hash = HashHash(key);
204bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashBucketPtr prev = NULL;
205bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashBucketPtr bucket;
206bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
207bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   if (h)
208bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      *h = hash;
209bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
210bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (bucket = table->buckets[hash]; bucket; bucket = bucket->next) {
211bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      if (bucket->key == key) {
212bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         if (prev) {
213bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf            /* Organize */
214bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf            prev->next = bucket->next;
215bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf            bucket->next = table->buckets[hash];
216bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf            table->buckets[hash] = bucket;
217bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf            ++table->partials;
218bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         }
219bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         else {
220bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf            ++table->hits;
221bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         }
222bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         return bucket;
223bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      }
224bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      prev = bucket;
225bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   }
226bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   ++table->misses;
227bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   return NULL;
2284ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg}
2294ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
230bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf_X_HIDDEN int
231bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf__glxHashLookup(__glxHashTable * t, unsigned long key, void **value)
2324ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg{
233bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashTablePtr table = (__glxHashTablePtr) t;
234bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashBucketPtr bucket;
2354ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
236bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   if (!table || table->magic != HASH_MAGIC)
237bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      return -1;                /* Bad magic */
2384ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
239bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   bucket = HashFind(table, key, NULL);
240bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   if (!bucket)
241bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      return 1;                 /* Not found */
242bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   *value = bucket->value;
243bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   return 0;                    /* Found */
2444ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg}
2454ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
246bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf_X_HIDDEN int
247bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf__glxHashInsert(__glxHashTable * t, unsigned long key, void *value)
2484ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg{
249bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashTablePtr table = (__glxHashTablePtr) t;
250bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashBucketPtr bucket;
251bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   unsigned long hash;
252bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
253bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   if (table->magic != HASH_MAGIC)
254bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      return -1;                /* Bad magic */
255bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
256bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   if (HashFind(table, key, &hash))
257bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      return 1;                 /* Already in table */
258bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
259bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   bucket = HASH_ALLOC(sizeof(*bucket));
260bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   if (!bucket)
261bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      return -1;                /* Error */
262bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   bucket->key = key;
263bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   bucket->value = value;
264bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   bucket->next = table->buckets[hash];
265bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   table->buckets[hash] = bucket;
2664ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#if HASH_DEBUG
267bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   printf("Inserted %d at %d/%p\n", key, hash, bucket);
2684ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#endif
269bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   return 0;                    /* Added to table */
2704ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg}
2714ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
272bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf_X_HIDDEN int
273bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf__glxHashDelete(__glxHashTable * t, unsigned long key)
2744ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg{
275bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashTablePtr table = (__glxHashTablePtr) t;
276bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   unsigned long hash;
277bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashBucketPtr bucket;
2784ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
279bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   if (table->magic != HASH_MAGIC)
280bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      return -1;                /* Bad magic */
2814ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
282bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   bucket = HashFind(table, key, &hash);
2834ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
284bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   if (!bucket)
285bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      return 1;                 /* Not found */
2864ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
287bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   table->buckets[hash] = bucket->next;
288bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   HASH_FREE(bucket);
289bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   return 0;
2904ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg}
2914ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
292bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf_X_HIDDEN int
293bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf__glxHashNext(__glxHashTable * t, unsigned long *key, void **value)
2944ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg{
295bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashTablePtr table = (__glxHashTablePtr) t;
296bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
297bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   while (table->p0 < HASH_SIZE) {
298bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      if (table->p1) {
299bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         *key = table->p1->key;
300bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         *value = table->p1->value;
301bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         table->p1 = table->p1->next;
302bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         return 1;
303bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      }
304bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      table->p1 = table->buckets[table->p0];
305bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      ++table->p0;
306bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   }
307bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   return 0;
3084ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg}
3094ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
310bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf_X_HIDDEN int
311bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf__glxHashFirst(__glxHashTable * t, unsigned long *key, void **value)
3124ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg{
313bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashTablePtr table = (__glxHashTablePtr) t;
3144ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
315bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   if (table->magic != HASH_MAGIC)
316bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      return -1;                /* Bad magic */
3174ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
318bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   table->p0 = 0;
319bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   table->p1 = table->buckets[0];
320bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   return __glxHashNext(table, key, value);
3214ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg}
3224ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
3234ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#if HASH_MAIN
3244ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#define DIST_LIMIT 10
3254ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsbergstatic int dist[DIST_LIMIT];
3264ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
327bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristófstatic void
328bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristófclear_dist(void)
329bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf{
330bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   int i;
3314ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
332bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < DIST_LIMIT; i++)
333bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      dist[i] = 0;
3344ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg}
3354ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
336bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristófstatic int
337bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristófcount_entries(__glxHashBucketPtr bucket)
3384ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg{
339bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   int count = 0;
3404ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
341bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (; bucket; bucket = bucket->next)
342bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      ++count;
343bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   return count;
3444ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg}
3454ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
346bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristófstatic void
347bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristófupdate_dist(int count)
3484ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg{
349bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   if (count >= DIST_LIMIT)
350bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      ++dist[DIST_LIMIT - 1];
351bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   else
352bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      ++dist[count];
3534ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg}
3544ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
355bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristófstatic void
356bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristófcompute_dist(__glxHashTablePtr table)
3574ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg{
358bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   int i;
359bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashBucketPtr bucket;
360bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
361bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   printf("Hits = %ld, partials = %ld, misses = %ld\n",
362bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf          table->hits, table->partials, table->misses);
363bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   clear_dist();
364bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < HASH_SIZE; i++) {
365bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      bucket = table->buckets[i];
366bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      update_dist(count_entries(bucket));
367bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   }
368bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < DIST_LIMIT; i++) {
369bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      if (i != DIST_LIMIT - 1)
370bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         printf("%5d %10d\n", i, dist[i]);
371bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      else
372bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         printf("other %10d\n", dist[i]);
373bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   }
3744ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg}
3754ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
376bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristófstatic void
377bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristófcheck_table(__glxHashTablePtr table, unsigned long key, unsigned long value)
3784ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg{
379bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   unsigned long retval = 0;
380bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   int retcode = __glxHashLookup(table, key, &retval);
381bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
382bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   switch (retcode) {
383bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   case -1:
384bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      printf("Bad magic = 0x%08lx:"
385bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf             " key = %lu, expected = %lu, returned = %lu\n",
386bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf             table->magic, key, value, retval);
387bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      break;
388bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   case 1:
389bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      printf("Not found: key = %lu, expected = %lu returned = %lu\n",
390bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf             key, value, retval);
391bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      break;
392bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   case 0:
393bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      if (value != retval)
394bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf         printf("Bad value: key = %lu, expected = %lu, returned = %lu\n",
395bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf                key, value, retval);
396bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      break;
397bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   default:
398bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      printf("Bad retcode = %d: key = %lu, expected = %lu, returned = %lu\n",
399bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf             retcode, key, value, retval);
400bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      break;
401bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   }
4024ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg}
4034ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg
404bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristófint
405bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristófmain(void)
4064ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg{
407bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashTablePtr table;
408bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   int i;
409bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
410bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   printf("\n***** 256 consecutive integers ****\n");
411bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   table = __glxHashCreate();
412bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < 256; i++)
413bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      __glxHashInsert(table, i, i);
414bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < 256; i++)
415bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      check_table(table, i, i);
416bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 256; i >= 0; i--)
417bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      check_table(table, i, i);
418bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   compute_dist(table);
419bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashDestroy(table);
420bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
421bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   printf("\n***** 1024 consecutive integers ****\n");
422bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   table = __glxHashCreate();
423bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < 1024; i++)
424bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      __glxHashInsert(table, i, i);
425bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < 1024; i++)
426bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      check_table(table, i, i);
427bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 1024; i >= 0; i--)
428bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      check_table(table, i, i);
429bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   compute_dist(table);
430bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashDestroy(table);
431bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
432bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   printf("\n***** 1024 consecutive page addresses (4k pages) ****\n");
433bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   table = __glxHashCreate();
434bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < 1024; i++)
435bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      __glxHashInsert(table, i * 4096, i);
436bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < 1024; i++)
437bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      check_table(table, i * 4096, i);
438bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 1024; i >= 0; i--)
439bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      check_table(table, i * 4096, i);
440bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   compute_dist(table);
441bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashDestroy(table);
442bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
443bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   printf("\n***** 1024 random integers ****\n");
444bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   table = __glxHashCreate();
445bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   srandom(0xbeefbeef);
446bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < 1024; i++)
447bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      __glxHashInsert(table, random(), i);
448bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   srandom(0xbeefbeef);
449bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < 1024; i++)
450bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      check_table(table, random(), i);
451bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   srandom(0xbeefbeef);
452bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < 1024; i++)
453bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      check_table(table, random(), i);
454bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   compute_dist(table);
455bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashDestroy(table);
456bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
457bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   printf("\n***** 5000 random integers ****\n");
458bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   table = __glxHashCreate();
459bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   srandom(0xbeefbeef);
460bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < 5000; i++)
461bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      __glxHashInsert(table, random(), i);
462bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   srandom(0xbeefbeef);
463bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < 5000; i++)
464bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      check_table(table, random(), i);
465bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   srandom(0xbeefbeef);
466bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   for (i = 0; i < 5000; i++)
467bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf      check_table(table, random(), i);
468bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   compute_dist(table);
469bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   __glxHashDestroy(table);
470bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf
471bd6a3d5975aed1fb764b8b76a04082843747abe1RALOVICH, Kristóf   return 0;
4724ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg}
4734ceefccbfa180d19e27716bf7f282d0438ac34bdKristian Høgsberg#endif
474