fix double deletion
authorZack Rusin <zack@tungstengraphics.com>
Tue, 11 Mar 2008 02:10:18 +0000 (22:10 -0400)
committerZack Rusin <zack@tungstengraphics.com>
Tue, 11 Mar 2008 02:12:32 +0000 (22:12 -0400)
plus, if the current hash is bigger than max size make sure
we delete enough from it

src/gallium/auxiliary/cso_cache/cso_cache.c
src/gallium/auxiliary/cso_cache/cso_hash.c

index b427b509f8aad27e8751e40ab5d194cc03b6e424..a2764b4265c28796df58e2a6d7497db3b7a0627e 100644 (file)
@@ -207,8 +207,11 @@ static INLINE void sanitize_hash(struct cso_hash *hash, enum cso_cache_type type
 {
    /* if we're approach the maximum size, remove fourth of the entries
     * otherwise every subsequent call will go through the same */
-   int max_entries = (max_size > cso_hash_size(hash)) ? max_size : cso_hash_size(hash);
+   int hash_size = cso_hash_size(hash);
+   int max_entries = (max_size > hash_size) ? max_size : hash_size;
    int to_remove =  (max_size < max_entries) * max_entries/4;
+   if (hash_size > max_size)
+      to_remove += hash_size - max_size;
    while (to_remove) {
       /*remove elements until we're good */
       /*fixme: currently we pick the nodes to remove at random*/
index b3b4d667d2cfa8a3ce920115ad5efabf624cdfbf..5cad5d3be71e4111161fd5b6015974ac6b2fd2fe 100644 (file)
@@ -101,13 +101,6 @@ static void *cso_data_allocate_node(struct cso_hash_data *hash)
 
 static void cso_data_free_node(struct cso_node *node)
 {
-   /* XXX still a leak here.
-    * Need to cast value ptr to original cso type, then free the
-    * driver-specific data hanging off of it.  For example:
-   struct cso_sampler *csamp = (struct cso_sampler *) node->value;
-   FREE(csamp->data);
-   */
-   FREE(node->value);
    FREE(node);
 }