trace: add context pointer sanity checking
authorBrian Paul <brianp@vmware.com>
Fri, 15 Feb 2013 17:42:32 +0000 (10:42 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 15 Feb 2013 18:11:34 +0000 (11:11 -0700)
To help catch mixed up context pointer bugs in the future, add a
trace_context_check() function and some new assertions.

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
src/gallium/drivers/trace/tr_context.c
src/gallium/drivers/trace/tr_context.h
src/gallium/drivers/trace/tr_texture.c

index b88f37999e9a7834077cfd7283993150e4797556..538ff4afc9eedb04ccf3a71c7faf30dca8cbdd8a 100644 (file)
@@ -852,6 +852,8 @@ trace_context_sampler_view_destroy(struct pipe_context *_pipe,
    struct pipe_context *pipe = tr_ctx->pipe;
    struct pipe_sampler_view *view = tr_view->sampler_view;
 
+   assert(_view->context == _pipe);
+
    trace_dump_call_begin("pipe_context", "sampler_view_destroy");
 
    trace_dump_arg(ptr, pipe);
@@ -1610,3 +1612,16 @@ trace_context_create(struct trace_screen *tr_scr,
 error1:
    return pipe;
 }
+
+
+/**
+ * Sanity checker: check that the given context really is a 
+ * trace context (and not the wrapped driver's context).
+ */
+void
+trace_context_check(const struct pipe_context *pipe)
+{
+   struct trace_context *tr_ctx = (struct trace_context *) pipe;
+   assert(tr_ctx->base.destroy == trace_context_destroy);
+}
+
index dadbe5611808734d2e3290c4e481badc352aa0d4..90883d712396ddb3da457712b1174d189768e311 100644 (file)
@@ -50,10 +50,17 @@ struct trace_context
 };
 
 
+void
+trace_context_check(const struct pipe_context *pipe);
+
+
 static INLINE struct trace_context *
 trace_context(struct pipe_context *pipe)
 {
    assert(pipe);
+#ifdef DEBUG
+   trace_context_check(pipe);
+#endif
    return (struct trace_context *)pipe;
 }
 
index aae13383865c3aa4ad4fb76e02e254c003c165e6..f6bc386ea3edbbc3dc28b6d02586c8fff3fb6f71 100644 (file)
@@ -108,6 +108,7 @@ error:
 void
 trace_surf_destroy(struct trace_surface *tr_surf)
 {
+   trace_context_check(tr_surf->base.context);
    pipe_resource_reference(&tr_surf->base.texture, NULL);
    pipe_surface_reference(&tr_surf->surface, NULL);
    FREE(tr_surf);