On Tue, 2014-04-22 at 21:31 +1000, Timothy Arceri wrote: > On Tue, 2014-04-22 at 16:58 +0800, Chia-I Wu wrote: > > Move group clearing to debug_clear_group. Add debug_pop_group and > > debug_destroy for use in _mesa_PopDebugGroup and _mesa_free_errors_data > > respectively. > > debug_destroy is not very specific debug_destroy_groups maybe?
Please ignore my comment I see now that this is does free the debug context too. > > > > > Signed-off-by: Chia-I Wu <o...@lunarg.com> > > --- > > src/mesa/main/errors.c | 127 > > +++++++++++++++++++++++++------------------------ > > 1 file changed, 64 insertions(+), 63 deletions(-) > > > > diff --git a/src/mesa/main/errors.c b/src/mesa/main/errors.c > > index 9873dfc..139e31d 100644 > > --- a/src/mesa/main/errors.c > > +++ b/src/mesa/main/errors.c > > @@ -217,7 +217,57 @@ debug_create(void) > > return debug; > > } > > > > -/* > > +static void > > +debug_clear_group_cb(GLuint key, void *data, void *userData) > > +{ > > +} > > + > > +/** > > + * Free debug state for the given stack depth. > > + */ > > +static void > > +debug_clear_group(struct gl_debug_state *debug, GLint gstack) > > +{ > > + enum mesa_debug_type t; > > + enum mesa_debug_source s; > > + enum mesa_debug_severity sev; > > + > > + /* Tear down state for filtering debug messages. */ > > + for (s = 0; s < MESA_DEBUG_SOURCE_COUNT; s++) { > > + for (t = 0; t < MESA_DEBUG_TYPE_COUNT; t++) { > > + struct gl_debug_namespace *nspace = > > &debug->Namespaces[gstack][s][t]; > > + > > + _mesa_HashDeleteAll(nspace->IDs, debug_clear_group_cb, NULL); > > + _mesa_DeleteHashTable(nspace->IDs); > > + for (sev = 0; sev < MESA_DEBUG_SEVERITY_COUNT; sev++) { > > + struct simple_node *node, *tmp; > > + struct gl_debug_severity *entry; > > + > > + foreach_s(node, tmp, &nspace->Severity[sev]) { > > + entry = (struct gl_debug_severity *)node; > > + free(entry); > > + } > > + } > > + } > > + } > > +} > > + > > +/** > > + * Loop through debug group stack tearing down states for > > + * filtering debug messages. Then free debug output state. > > + */ > > +static void > > +debug_destroy(struct gl_debug_state *debug) > > +{ > > + GLint i; > > + > > + for (i = 0; i <= debug->GroupStackDepth; i++) > > + debug_clear_group(debug, i); > > + > > + free(debug); > > +} > > + > > +/** > > * Sets the state of the given message source/type/ID tuple. > > */ > > static void > > @@ -538,6 +588,15 @@ out: > > debug->GroupStackDepth++; > > } > > > > +static void > > +debug_pop_group(struct gl_debug_state *debug) > > +{ > > + const GLint gstack = debug->GroupStackDepth; > > + > > + debug->GroupStackDepth--; > > + debug_clear_group(debug, gstack); > > +} > > + > > > > /** > > * Return debug state for the context. The debug state will be allocated > > @@ -840,47 +899,6 @@ message_insert(GLenum source, GLenum type, GLuint id, > > } > > > > > > -static void > > -do_nothing(GLuint key, void *data, void *userData) > > -{ > > -} > > - > > - > > -/** > > - * Free context state pertaining to error/debug state for the given stack > > - * depth. > > - */ > > -static void > > -free_errors_data(struct gl_context *ctx, GLint gstack) > > -{ > > - struct gl_debug_state *debug = ctx->Debug; > > - enum mesa_debug_type t; > > - enum mesa_debug_source s; > > - enum mesa_debug_severity sev; > > - > > - assert(debug); > > - > > - /* Tear down state for filtering debug messages. */ > > - for (s = 0; s < MESA_DEBUG_SOURCE_COUNT; s++) { > > - for (t = 0; t < MESA_DEBUG_TYPE_COUNT; t++) { > > - _mesa_HashDeleteAll(debug->Namespaces[gstack][s][t].IDs, > > - do_nothing, NULL); > > - _mesa_DeleteHashTable(debug->Namespaces[gstack][s][t].IDs); > > - for (sev = 0; sev < MESA_DEBUG_SEVERITY_COUNT; sev++) { > > - struct simple_node *node, *tmp; > > - struct gl_debug_severity *entry; > > - > > - foreach_s(node, tmp, > > - &debug->Namespaces[gstack][s][t].Severity[sev]) { > > - entry = (struct gl_debug_severity *)node; > > - free(entry); > > - } > > - } > > - } > > - } > > -} > > - > > - > > void GLAPIENTRY > > _mesa_DebugMessageInsert(GLenum source, GLenum type, GLuint id, > > GLenum severity, GLint length, > > @@ -1044,7 +1062,6 @@ _mesa_PopDebugGroup(void) > > struct gl_debug_state *debug = _mesa_get_debug_state(ctx); > > const char *callerstr = "glPopDebugGroup"; > > struct gl_debug_msg *gdmessage; > > - GLint prevStackDepth; > > > > if (!debug) > > return; > > @@ -1054,10 +1071,9 @@ _mesa_PopDebugGroup(void) > > return; > > } > > > > - prevStackDepth = debug->GroupStackDepth; > > - debug->GroupStackDepth--; > > + debug_pop_group(debug); > > > > - gdmessage = &debug->DebugGroupMsgs[prevStackDepth]; > > + gdmessage = debug_get_group_message(debug); > > /* using log_msg() directly here as verification of parameters > > * already done in push > > */ > > @@ -1067,13 +1083,7 @@ _mesa_PopDebugGroup(void) > > gl_enum_to_debug_severity(GL_DEBUG_SEVERITY_NOTIFICATION), > > gdmessage->length, gdmessage->message); > > > > - if (gdmessage->message != (char*)out_of_memory) > > - free(gdmessage->message); > > - gdmessage->message = NULL; > > - gdmessage->length = 0; > > - > > - /* free popped debug group data */ > > - free_errors_data(ctx, prevStackDepth); > > + debug_clear_message(debug, gdmessage); > > } > > > > > > @@ -1084,20 +1094,11 @@ _mesa_init_errors(struct gl_context *ctx) > > } > > > > > > -/** > > - * Loop through debug group stack tearing down states for > > - * filtering debug messages. Then free debug output state. > > - */ > > void > > _mesa_free_errors_data(struct gl_context *ctx) > > { > > if (ctx->Debug) { > > - GLint i; > > - > > - for (i = 0; i <= ctx->Debug->GroupStackDepth; i++) { > > - free_errors_data(ctx, i); > > - } > > - free(ctx->Debug); > > + debug_destroy(ctx->Debug); > > /* set to NULL just in case it is used before context is completely > > gone. */ > > ctx->Debug = NULL; > > } > > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev