rearranged order of some functions
[mesa.git] / src / mesa / main / hash.c
index ce5fdee93163a694ee4cedb284c7ab83896b1e02..88e94e7884d19d2d764993746040dcaf8589e057 100644 (file)
@@ -1,10 +1,10 @@
-/* $Id: hash.c,v 1.2 1999/10/08 09:27:10 keithw Exp $ */
+/* $Id: hash.c,v 1.7 2000/01/31 23:11:39 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.1
+ * Version:  3.3
  * 
- * Copyright (C) 1999  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
  * 
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  */
 
 
-
-
-
 #ifdef PC_HEADER
 #include "all.h"
 #else
-#ifndef XFree86Server
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#else
-#include "GL/xf86glx.h"
-#endif
+#include "glheader.h"
+#include "glthread.h"
 #include "hash.h"
+#include "mem.h"
 #endif
 
 
 /*
- * Generic hash table.  Only dependency is the GLuint datatype.
+ * Generic hash table.
  *
  * This is used to implement display list and texture object lookup.
  * NOTE: key=0 is illegal.
@@ -58,9 +51,10 @@ struct HashEntry {
    struct HashEntry *Next;
 };
 
-struct HashTable {
+struct _mesa_HashTable {
    struct HashEntry *Table[TABLE_SIZE];
    GLuint MaxKey;
+   _glthread_Mutex Mutex;
 };
 
 
@@ -68,9 +62,9 @@ struct HashTable {
 /*
  * Return pointer to a new, empty hash table.
  */
-struct HashTable *NewHashTable(void)
+struct _mesa_HashTable *_mesa_NewHashTable(void)
 {
-   return (struct HashTable *) calloc(sizeof (struct HashTable), 1);
+   return CALLOC_STRUCT(_mesa_HashTable);
 }
 
 
@@ -78,7 +72,7 @@ struct HashTable *NewHashTable(void)
 /*
  * Delete a hash table.
  */
-void DeleteHashTable(struct HashTable *table)
+void _mesa_DeleteHashTable(struct _mesa_HashTable *table)
 {
    GLuint i;
    assert(table);
@@ -86,11 +80,11 @@ void DeleteHashTable(struct HashTable *table)
       struct HashEntry *entry = table->Table[i];
       while (entry) {
         struct HashEntry *next = entry->Next;
-        free(entry);
+        FREE(entry);
         entry = next;
       }
    }
-   free(table);
+   FREE(table);
 }
 
 
@@ -101,7 +95,7 @@ void DeleteHashTable(struct HashTable *table)
  *         key - the key
  * Return:  user data pointer or NULL if key not in table
  */
-void *HashLookup(const struct HashTable *table, GLuint key)
+void *_mesa_HashLookup(const struct _mesa_HashTable *table, GLuint key)
 {
    GLuint pos;
    const struct HashEntry *entry;
@@ -129,7 +123,7 @@ void *HashLookup(const struct HashTable *table, GLuint key)
  *         key - the key (not zero)
  *         data - pointer to user data
  */
-void HashInsert(struct HashTable *table, GLuint key, void *data)
+void _mesa_HashInsert(struct _mesa_HashTable *table, GLuint key, void *data)
 {
    /* search for existing entry with this key */
    GLuint pos;
@@ -138,6 +132,8 @@ void HashInsert(struct HashTable *table, GLuint key, void *data)
    assert(table);
    assert(key);
 
+   _glthread_LOCK_MUTEX(table->Mutex);
+
    if (key > table->MaxKey)
       table->MaxKey = key;
 
@@ -147,17 +143,20 @@ void HashInsert(struct HashTable *table, GLuint key, void *data)
       if (entry->Key == key) {
          /* replace entry's data */
         entry->Data = data;
+         _glthread_UNLOCK_MUTEX(table->Mutex);
         return;
       }
       entry = entry->Next;
    }
 
    /* alloc and insert new table entry */
-   entry = (struct HashEntry *) calloc(sizeof(struct HashEntry), 1);
+   entry = MALLOC_STRUCT(HashEntry);
    entry->Key = key;
    entry->Data = data;
    entry->Next = table->Table[pos];
    table->Table[pos] = entry;
+
+   _glthread_UNLOCK_MUTEX(table->Mutex);
 }
 
 
@@ -167,7 +166,7 @@ void HashInsert(struct HashTable *table, GLuint key, void *data)
  * Input:  table - the hash table
  *         key - key of entry to remove
  */
-void HashRemove(struct HashTable *table, GLuint key)
+void _mesa_HashRemove(struct _mesa_HashTable *table, GLuint key)
 {
    GLuint pos;
    struct HashEntry *entry, *prev;
@@ -175,6 +174,8 @@ void HashRemove(struct HashTable *table, GLuint key)
    assert(table);
    assert(key);
 
+   _glthread_LOCK_MUTEX(table->Mutex);
+
    pos = key & (TABLE_SIZE-1);
    prev = NULL;
    entry = table->Table[pos];
@@ -187,12 +188,15 @@ void HashRemove(struct HashTable *table, GLuint key)
          else {
             table->Table[pos] = entry->Next;
          }
-         free(entry);
+         FREE(entry);
+         _glthread_UNLOCK_MUTEX(table->Mutex);
         return;
       }
       prev = entry;
       entry = entry->Next;
    }
+
+   _glthread_UNLOCK_MUTEX(table->Mutex);
 }
 
 
@@ -202,7 +206,7 @@ void HashRemove(struct HashTable *table, GLuint key)
  * By calling this function until zero is returned we can get
  * the keys of all entries in the table.
  */
-GLuint HashFirstEntry(const struct HashTable *table)
+GLuint _mesa_HashFirstEntry(const struct _mesa_HashTable *table)
 {
    GLuint pos;
    assert(table);
@@ -218,7 +222,7 @@ GLuint HashFirstEntry(const struct HashTable *table)
 /*
  * Dump contents of hash table for debugging.
  */
-void HashPrint(const struct HashTable *table)
+void _mesa_HashPrint(const struct _mesa_HashTable *table)
 {
    GLuint i;
    assert(table);
@@ -237,9 +241,9 @@ void HashPrint(const struct HashTable *table)
  * Find a block of 'numKeys' adjacent unused hash keys.
  * Input:  table - the hash table
  *         numKeys - number of keys needed
- * Return:  startint key of free block or 0 if failure
+ * Return:  starting key of free block or 0 if failure
  */
-GLuint HashFindFreeKeyBlock(const struct HashTable *table, GLuint numKeys)
+GLuint _mesa_HashFindFreeKeyBlock(const struct _mesa_HashTable *table, GLuint numKeys)
 {
    GLuint maxKey = ~((GLuint) 0);
    if (maxKey - numKeys > table->MaxKey) {
@@ -249,10 +253,10 @@ GLuint HashFindFreeKeyBlock(const struct HashTable *table, GLuint numKeys)
    else {
       /* the slow solution */
       GLuint freeCount = 0;
-      GLuint freeStart = 0;
+      GLuint freeStart = 1;
       GLuint key;
-      for (key=0; key!=maxKey; key++) {
-        if (HashLookup(table, key)) {
+      for (key=1; key!=maxKey; key++) {
+        if (_mesa_HashLookup(table, key)) {
            /* darn, this key is already in use */
            freeCount = 0;
            freeStart = key+1;
@@ -281,15 +285,15 @@ int main(int argc, char *argv[])
    printf("&a = %p\n", &a);
    printf("&b = %p\n", &b);
 
-   t = NewHashTable();
-   HashInsert(t, 501, &a);
-   HashInsert(t, 10, &c);
-   HashInsert(t, 0xfffffff8, &b);
-   HashPrint(t);
-   printf("Find 501: %p\n", HashLookup(t,501));
-   printf("Find 1313: %p\n", HashLookup(t,1313));
-   printf("Find block of 100: %d\n", HashFindFreeKeyBlock(t, 100));
-   DeleteHashTable(t);
+   t = _mesa_NewHashTable();
+   _mesa_HashInsert(t, 501, &a);
+   _mesa_HashInsert(t, 10, &c);
+   _mesa_HashInsert(t, 0xfffffff8, &b);
+   _mesa_HashPrint(t);
+   printf("Find 501: %p\n", _mesa_HashLookup(t,501));
+   printf("Find 1313: %p\n", _mesa_HashLookup(t,1313));
+   printf("Find block of 100: %d\n", _mesa_HashFindFreeKeyBlock(t, 100));
+   _mesa_DeleteHashTable(t);
 
    return 0;
 }