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