hash.c revision 19316fa5e707a23324c91b47aebf8697362428b3
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* Copyright (c) 2001, Stanford University
82a2fc4751cef28c0bdc327d02012bf8796083b9James Carlson * All rights reserved
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * See the file LICENSE.txt for information on redistributing this software.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxctypedef struct FreeElemRec {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxctypedef struct CRHashIdPoolRec {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxctypedef struct CRHashNode {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc unsigned long key;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc unsigned int num_elements;
82a2fc4751cef28c0bdc327d02012bf8796083b9James Carlson CRHashIdPool *pool = (CRHashIdPool *) crCalloc(sizeof(CRHashIdPool));
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc pool->freeList = (FreeElem *) crCalloc(sizeof(FreeElem));
fb91fd8a302dfb13e250bbefb6a3970c2edc3ae3zf * Allocate a block of <count> IDs. Return index of first one.
fb91fd8a302dfb13e250bbefb6a3970c2edc3ae3zf * Return 0 if we fail.
fb91fd8a302dfb13e250bbefb6a3970c2edc3ae3zfstatic GLuint crHashIdPoolAllocBlock( CRHashIdPool *pool, GLuint count )
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* found a sufficiently large enough block */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* remove this block from linked list */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* remove from head */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* remove from elsewhere */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* make sure the IDs really are allocated */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc for (i = 0; i < count; i++)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc //CRASSERT(crHashIdPoolIsIdUsed(pool, ret + i));
a399b7655a1d835aa8606c2b29e4e777baac8635zf /* failed to find free block */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Free a block of <count> IDs starting at <first>.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcstatic void crHashIdPoolFreeBlock( CRHashIdPool *pool, GLuint first, GLuint count )
82a2fc4751cef28c0bdc327d02012bf8796083b9James Carlson /*********************************/
82a2fc4751cef28c0bdc327d02012bf8796083b9James Carlson /* Add the name to the freeList */
82a2fc4751cef28c0bdc327d02012bf8796083b9James Carlson /* Find the bracketing sequences */
82a2fc4751cef28c0bdc327d02012bf8796083b9James Carlson for (i = pool->freeList; i && i->next && i->next->min < first; i = i->next)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* EMPTY BODY */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* j will always be valid */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* Case: j:(~,first-1) */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* Collapse */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* Case: j->next: (first+1, ~) */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* Collapse */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* Case: j: (first+1, ~) j->next: null */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* allocate a new FreeElem node */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* Case: j: (~,first-(2+)) j->next: (first+(2+), ~) or null */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* Case: j: (first+(2+), ~) */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* Can only happen if j = t->freeList! */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Mark the given Id as being allocated.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcstatic void crHashIdPoolAllocId( CRHashIdPool *pool, GLuint id )
82a2fc4751cef28c0bdc327d02012bf8796083b9James Carlson /* found the block */
f->max--;
if (f->next)
f = f->next;
FreeElem *i;
return GL_TRUE;
return GL_FALSE;
for (i = 0 ; i < CR_NUM_BUCKETS ; i++)
#ifdef CHROMIUM_THREADSAFE
return hash;
if ( !hash) return;
#ifdef CHROMIUM_THREADSAFE
for ( i = 0; i < CR_NUM_BUCKETS; i++ )
while (entry)
#ifdef CHROMIUM_THREADSAFE
#ifdef CHROMIUM_THREADSAFE
#ifdef CHROMIUM_THREADSAFE
if (!hash)
#ifdef CHROMIUM_THREADSAFE
for (i = 0; i < CR_NUM_BUCKETS; i++)
while (entry)
#ifdef CHROMIUM_THREADSAFE
#ifdef CHROMIUM_THREADSAFE
h->num_elements++;
#ifdef CHROMIUM_THREADSAFE
#ifdef CHROMIUM_THREADSAFE
#ifdef CHROMIUM_THREADSAFE
return res;
#ifdef CHROMIUM_THREADSAFE
if ( !temp ) {
#ifdef CHROMIUM_THREADSAFE
if ( beftemp )
h->num_elements--;
#ifdef CHROMIUM_THREADSAFE
void crHashtableDeleteBlock( CRHashTable *h, unsigned long key, GLsizei range, CRHashtableCallback deleteFunc )
GLuint i;
#ifdef CHROMIUM_THREADSAFE
#ifdef CHROMIUM_THREADSAFE
if ( !temp )
return NULL;
#ifdef CHROMIUM_THREADSAFE
#ifdef CHROMIUM_THREADSAFE
if ( !temp )
#ifdef CHROMIUM_THREADSAFE
#ifdef CHROMIUM_THREADSAFE
return h->num_elements;
if (!pHash)
return rc;
#ifdef CHROMIUM_THREADSAFE
while (entry)
if (pKey)
#ifdef CHROMIUM_THREADSAFE
return rc;