glsl_type: Add _mesa_glsl_release_types to release all type related storage
authorIan Romanick <ian.d.romanick@intel.com>
Mon, 28 Jun 2010 20:17:18 +0000 (13:17 -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
src/glsl/main.cpp

index 0d807fbc3dca43a76b6c50ec01858d29b8e9e97f..806b71495dec71885eb5de2f5e929749a46b1ae5 100644 (file)
@@ -195,6 +195,26 @@ const glsl_type *glsl_type::get_base_type() const
 }
 
 
+void
+_mesa_glsl_release_types(void)
+{
+   if (glsl_type::array_types != NULL) {
+      hash_table_dtor(glsl_type::array_types);
+      glsl_type::array_types = NULL;
+   }
+
+   if (glsl_type::record_types != NULL) {
+      hash_table_dtor(glsl_type::record_types);
+      glsl_type::record_types = NULL;
+   }
+
+   if (glsl_type::ctx != NULL) {
+      talloc_free(glsl_type::ctx);
+      glsl_type::ctx = NULL;
+   }
+}
+
+
 ir_function *
 glsl_type::generate_constructor(glsl_symbol_table *symtab) const
 {
index 1147d38ca64f355f39ad8831f0747b435da56f53..e869071cab0cdb387c8f0649736bd06dbb80c622 100644 (file)
@@ -39,6 +39,9 @@ struct _mesa_glsl_parse_state;
 extern "C" void
 _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state);
 
+extern "C" void
+_mesa_glsl_release_types(void);
+
 #define GLSL_TYPE_UINT          0
 #define GLSL_TYPE_INT           1
 #define GLSL_TYPE_FLOAT         2
@@ -455,11 +458,18 @@ private:
                                                    bool);
    static void generate_EXT_texture_array_types(class glsl_symbol_table *,
                                                bool);
+   /*@}*/
+
    /**
-    * This function is a friend because it needs to call the various
-    * generate_*_types functions and it has C linkage.
+    * \name Friend functions.
+    *
+    * These functions are friends because they must have C linkage and the
+    * need to call various private methods or access various private static
+    * data.
     */
+   /*@{*/
    friend void _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *);
+   friend void _mesa_glsl_release_types(void);
    /*@}*/
 };
 
index 16b2cf84c53452cedb6e935540dbd04307943bd0..342cf9884047000b396c4751d492d9422fa035aa 100644 (file)
@@ -258,6 +258,7 @@ main(int argc, char **argv)
    }
 
    talloc_free(whole_program);
+   _mesa_glsl_release_types();
 
    return status;
 }