mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 19:58:09 +02:00
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)
This commit is contained in:
parent
2d2561ef96
commit
f961e4458f
3 changed files with 38 additions and 5 deletions
|
|
@ -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();
|
||||
|
|
|
|||
4
ir.h
4
ir.h
|
|
@ -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"
|
||||
|
|
|
|||
6
main.cpp
6
main.cpp
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue