Ver código fonte

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)
tags/mesa-7.9-rc1
Carl Worth 15 anos atrás
pai
commit
f961e4458f
3 arquivos alterados com 38 adições e 5 exclusões
  1. 33
    0
      glsl_symbol_table.h
  2. 4
    0
      ir.h
  3. 1
    5
      main.cpp

+ 33
- 0
glsl_symbol_table.h Ver arquivo

@@ -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
- 0
ir.h Ver arquivo

@@ -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"

+ 1
- 5
main.cpp Ver arquivo

@@ -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;

Carregando…
Cancelar
Salvar