glsl_type: Add a talloc-based new
authorCarl Worth <cworth@cworth.org>
Thu, 24 Jun 2010 02:04:45 +0000 (19:04 -0700)
committerCarl Worth <cworth@cworth.org>
Thu, 24 Jun 2010 02:04:45 +0000 (19:04 -0700)
And hook it up at the two sites it's called.

Note that with this change we still don't use glsl_type* objects as
talloc contexts, (see things like get_array_instance that accept both
a talloc 'ctx' as well as a glsl_type*). The reason for this is that
the code is still using many instance of glsl_type objects not created
with new.

This closes 3 leaks in the glsl-orangebook-ch06-bump.frag test:

total heap usage: 55,623 allocs, 55,618

Leaving only 5 leaks to go.

ast_to_hir.cpp
glsl_types.cpp
glsl_types.h

index 38e344f..ddd4b73 100644 (file)
@@ -2354,6 +2354,7 @@ ir_rvalue *
 ast_struct_specifier::hir(exec_list *instructions,
                          struct _mesa_glsl_parse_state *state)
 {
+   void *ctx = talloc_parent(state);
    unsigned decl_count = 0;
 
    /* Make an initial pass over the list of structure fields to determine how
@@ -2416,7 +2417,7 @@ ast_struct_specifier::hir(exec_list *instructions,
       name = this->name;
    }
 
-   glsl_type *t = new glsl_type(fields, decl_count, name);
+   glsl_type *t = new(ctx) glsl_type(fields, decl_count, name);
 
    YYLTYPE loc = this->get_location();
    if (!state->symbols->add_type(name, t)) {
index d1b9dc6..bef267f 100644 (file)
@@ -702,7 +702,7 @@ glsl_type::get_array_instance(void *ctx, const glsl_type *base,
 
    const glsl_type *t = (glsl_type *) hash_table_find(array_types, & key);
    if (t == NULL) {
-      t = new glsl_type(ctx, base, array_size);
+      t = new(ctx) glsl_type(ctx, base, array_size);
 
       hash_table_insert(array_types, (void *) t, t);
    }
index baec763..39e6ac9 100644 (file)
 #include <cstring>
 #include <cassert>
 
+extern "C" {
+#include <talloc.h>
+}
+
 #define GLSL_TYPE_UINT          0
 #define GLSL_TYPE_INT           1
 #define GLSL_TYPE_FLOAT         2
@@ -61,6 +65,25 @@ struct glsl_type {
                                * and \c GLSL_TYPE_UINT are valid.
                                */
 
+   /* Callers of this talloc-based new need not call delete. It's
+    * easier to just talloc_free 'ctx' (or any of its ancestors). */
+   static void* operator new(size_t size, void *ctx)
+   {
+      void *type;
+
+      type = talloc_size(ctx, size);
+      assert(type != NULL);
+
+      return type;
+   }
+
+   /* If the user *does* call delete, that's OK, we will just
+    * talloc_free in that case. */
+   static void operator delete(void *type)
+   {
+      talloc_free(type);
+   }
+
    /**
     * \name Vector and matrix element counts
     *