Mesa (master): hash_table: Make string_to_uint_map make a copy of the name

Ian Romanick idr at kemper.freedesktop.org
Mon Oct 10 10:24:27 PDT 2011


Module: Mesa
Branch: master
Commit: f3650b05cf4e37066d0f142a4c14fcc650de8d8d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f3650b05cf4e37066d0f142a4c14fcc650de8d8d

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Fri Oct  7 14:29:51 2011 -0700

hash_table: Make string_to_uint_map make a copy of the name

The hash table needs a copy of the key that it can keep for
comparisons during searches.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41499
Cc: Stéphane Marchesin <stephane.marchesin at gmail.com>
Tested-by: Luzipher <luziphermcleod at yahoo.ie>
Tested-by: Michał Lipski <tallica at o2.pl>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/mesa/program/hash_table.h |   18 +++++++++++++++++-
 1 files changed, 17 insertions(+), 1 deletions(-)

diff --git a/src/mesa/program/hash_table.h b/src/mesa/program/hash_table.h
index bfe221b..941d28a 100644
--- a/src/mesa/program/hash_table.h
+++ b/src/mesa/program/hash_table.h
@@ -32,6 +32,7 @@
 #define HASH_TABLE_H
 
 #include <string.h>
+#include <stdlib.h>
 #include <stdint.h>
 #include <limits.h>
 #include <assert.h>
@@ -100,6 +101,10 @@ extern void *hash_table_find(struct hash_table *ht, const void *key);
  * calls to \c hash_table_find and \c hash_table_remove will return or remove,
  * repsectively, the most recently added instance of \c key.
  *
+ * \warning
+ * The value passed by \c key is kept in the hash table and is used by later
+ * calls to \c hash_table_find.
+ *
  * \sa hash_table_replace
  */
 extern void hash_table_insert(struct hash_table *ht, void *data,
@@ -204,6 +209,7 @@ public:
 
    ~string_to_uint_map()
    {
+      hash_table_call_foreach(this->ht, delete_key, NULL);
       hash_table_dtor(this->ht);
    }
 
@@ -243,10 +249,20 @@ public:
        * because UINT_MAX+1 = 0.
        */
       assert(value != UINT_MAX);
-      hash_table_replace(ht, (void *) (intptr_t) (value + 1), key);
+      hash_table_replace(this->ht,
+			 (void *) (intptr_t) (value + 1),
+			 strdup(key));
    }
 
 private:
+   static void delete_key(const void *key, void *data, void *closure)
+   {
+      (void) data;
+      (void) closure;
+
+      free((char *)key);
+   }
+
    struct hash_table *ht;
 };
 



More information about the mesa-commit mailing list