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)tags/mesa-7.9-rc1
@@ -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(); |
@@ -29,6 +29,10 @@ | |||
#include <cstdio> | |||
#include <cstdlib> | |||
extern "C" { | |||
#include <talloc.h> | |||
} | |||
#include "list.h" | |||
#include "ir_visitor.h" | |||
#include "ir_hierarchical_visitor.h" |
@@ -29,10 +29,6 @@ | |||
#include <fcntl.h> | |||
#include <unistd.h> | |||
extern "C" { | |||
#include <talloc.h> | |||
} | |||
#include "ast.h" | |||
#include "glsl_parser_extras.h" | |||
#include "glsl_parser.h" | |||
@@ -118,7 +114,7 @@ compile_shader(struct glsl_shader *shader) | |||
state->scanner = NULL; | |||
state->translation_unit.make_empty(); | |||
state->symbols = new glsl_symbol_table; | |||
state->symbols = new(shader) glsl_symbol_table; | |||
state->info_log = talloc_strdup(shader, ""); | |||
state->error = false; | |||
state->temp_index = 0; |