diff options
author | Carl Worth <cworth@cworth.org> | 2010-06-23 15:47:04 -0700 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2010-06-23 16:35:45 -0700 |
commit | f961e4458f1e894ca782c1627b69cdee993a16f8 (patch) | |
tree | 2df145299ce4f02edbb7a2cf3ecce3fe4f3a2ac6 /glsl_symbol_table.h | |
parent | 2d2561ef9696aa5ff0c1a85e3a4a95475f927935 (diff) |
glsl_symbol_table: Add new talloc-based new()
We take advantage of overloading of the new operator (with an
additional parameter!) to make this look as "C++ like" as possible.
This closes 507 memory leaks when compiling glsl-orangebook-ch06-bump.frag
when measured with:
valgrind ./glsl glsl-orangebook-ch06-bump.frag
as seen here:
total heap usage: 55,623 allocs, 14,389 frees
(was 13,882 frees before)
Diffstat (limited to 'glsl_symbol_table.h')
-rw-r--r-- | glsl_symbol_table.h | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/glsl_symbol_table.h b/glsl_symbol_table.h index 26b90fdb7c..ae2fd3f4f1 100644 --- a/glsl_symbol_table.h +++ b/glsl_symbol_table.h @@ -26,6 +26,8 @@ #ifndef GLSL_SYMBOL_TABLE #define GLSL_SYMBOL_TABLE +#include <new> + #include "symbol_table.h" #include "ir.h" #include "glsl_types.h" @@ -44,7 +46,38 @@ private: glsl_function_name_space = 2 }; + static int + _glsl_symbol_table_destructor (glsl_symbol_table *table) + { + table->~glsl_symbol_table(); + + return 0; + } + public: + /* 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 *table; + + table = talloc_size(ctx, size); + assert(table != NULL); + + talloc_set_destructor(table, (int (*)(void*)) _glsl_symbol_table_destructor); + + return table; + } + + /* If the user *does* call delete, that's OK, we will just + * talloc_free in that case. Here, C++ will have already called the + * destructor so tell talloc not to do that again. */ + static void operator delete(void *table) + { + talloc_set_destructor(table, NULL); + talloc_free(table); + } + glsl_symbol_table() { table = _mesa_symbol_table_ctor(); |