summaryrefslogtreecommitdiff
path: root/glsl_symbol_table.h
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2010-06-23 15:47:04 -0700
committerCarl Worth <cworth@cworth.org>2010-06-23 16:35:45 -0700
commitf961e4458f1e894ca782c1627b69cdee993a16f8 (patch)
tree2df145299ce4f02edbb7a2cf3ecce3fe4f3a2ac6 /glsl_symbol_table.h
parent2d2561ef9696aa5ff0c1a85e3a4a95475f927935 (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.h33
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();