glsl_type: All glsl_type objects live in their own talloc context
authorIan Romanick <ian.d.romanick@intel.com>
Mon, 28 Jun 2010 19:19:52 +0000 (12:19 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Tue, 29 Jun 2010 18:15:40 +0000 (11:15 -0700)
src/glsl/glsl_types.cpp
src/glsl/glsl_types.h

index f910efdddef43338a4eddf60efa9a2d0e3006b0e..0d807fbc3dca43a76b6c50ec01858d29b8e9e97f 100644 (file)
@@ -33,6 +33,7 @@ extern "C" {
 
 hash_table *glsl_type::array_types = NULL;
 hash_table *glsl_type::record_types = NULL;
+void *glsl_type::ctx = NULL;
 
 glsl_type::glsl_type(GLenum gl_type,
                     unsigned base_type, unsigned vector_elements,
@@ -384,7 +385,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(ctx) glsl_type(ctx, base, array_size);
+      t = new glsl_type(ctx, base, array_size);
 
       hash_table_insert(array_types, (void *) t, t);
    }
@@ -455,7 +456,7 @@ glsl_type::get_record_instance(const glsl_struct_field *fields,
 
    const glsl_type *t = (glsl_type *) hash_table_find(record_types, & key);
    if (t == NULL) {
-      t = new(NULL) glsl_type(fields, num_fields, name);
+      t = new glsl_type(fields, num_fields, name);
 
       hash_table_insert(record_types, (void *) t, t);
    }
index fc94bea1ccc04f2e55f9b9b1df0b7038d0251ce2..1147d38ca64f355f39ad8831f0747b435da56f53 100644 (file)
@@ -74,11 +74,16 @@ struct glsl_type {
 
    /* 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)
+   static void* operator new(size_t size)
    {
+      if (glsl_type::ctx == NULL) {
+        glsl_type::ctx = talloc_init("glsl_type");
+        assert(glsl_type::ctx != NULL);
+      }
+
       void *type;
 
-      type = talloc_size(ctx, size);
+      type = talloc_size(glsl_type::ctx, size);
       assert(type != NULL);
 
       return type;
@@ -382,6 +387,13 @@ struct glsl_type {
    }
 
 private:
+   /**
+    * talloc context for all glsl_type allocations
+    *
+    * Set on the first call to \c glsl_type::new.
+    */
+   static TALLOC_CTX *ctx;
+
    /** Constructor for vector and matrix types */
    glsl_type(GLenum gl_type,
             unsigned base_type, unsigned vector_elements,