summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/trace/tr_dump.c53
-rw-r--r--src/gallium/drivers/trace/tr_dump.h1
-rw-r--r--src/gallium/drivers/trace/tr_stream.c12
-rw-r--r--src/gallium/drivers/trace/tr_stream.h3
4 files changed, 53 insertions, 16 deletions
diff --git a/src/gallium/drivers/trace/tr_dump.c b/src/gallium/drivers/trace/tr_dump.c
index 6ebb639b7c7..c711a56b947 100644
--- a/src/gallium/drivers/trace/tr_dump.c
+++ b/src/gallium/drivers/trace/tr_dump.c
@@ -52,6 +52,7 @@
static struct trace_stream *stream = NULL;
+static unsigned refcount = 0;
static INLINE void
@@ -204,35 +205,54 @@ trace_dump_tag_end(const char *name)
trace_dump_writes(">");
}
+static void
+trace_dump_trace_close(void)
+{
+ if(stream) {
+ trace_dump_writes("</trace>\n");
+ trace_stream_close(stream);
+ stream = NULL;
+ refcount = 0;
+ }
+}
+
boolean trace_dump_trace_begin()
{
if(!debug_get_bool_option("GALLIUM_TRACE", FALSE))
return FALSE;
- stream = trace_stream_create("gallium", "trace");
- if(!stream)
- return FALSE;
-
- trace_dump_writes("<?xml version='1.0' encoding='UTF-8'?>\n");
- trace_dump_writes("<?xml-stylesheet type='text/xsl' href='trace.xsl'?>\n");
- trace_dump_writes("<trace version='0.1'>\n");
+ if(!stream) {
+ stream = trace_stream_create("gallium", "trace");
+ if(!stream)
+ return FALSE;
+
+ trace_dump_writes("<?xml version='1.0' encoding='UTF-8'?>\n");
+ trace_dump_writes("<?xml-stylesheet type='text/xsl' href='trace.xsl'?>\n");
+ trace_dump_writes("<trace version='0.1'>\n");
+
#if defined(PIPE_OS_LINUX)
- /* Linux applications rarely cleanup GL / Gallium resources so catch
- * application exit here */
- atexit(trace_dump_trace_end);
+ /* Linux applications rarely cleanup GL / Gallium resources so catch
+ * application exit here */
+ atexit(trace_dump_trace_close);
#endif
+ }
+
+ ++refcount;
return TRUE;
}
+boolean trace_dump_enabled(void)
+{
+ return stream ? TRUE : FALSE;
+}
+
void trace_dump_trace_end(void)
{
- if(stream) {
- trace_dump_writes("</trace>\n");
- trace_stream_close(stream);
- stream = NULL;
- }
+ if(stream)
+ if(!--refcount)
+ trace_dump_trace_close();
}
void trace_dump_call_begin(const char *klass, const char *method)
@@ -247,6 +267,7 @@ void trace_dump_call_end(void)
trace_dump_indent(1);
trace_dump_tag_end("call");
trace_dump_newline();
+ trace_stream_flush(stream);
}
void trace_dump_arg_begin(const char *name)
@@ -372,7 +393,7 @@ void trace_dump_null(void)
void trace_dump_ptr(const void *value)
{
if(value)
- trace_dump_writef("<ptr>%p</ptr>", value);
+ trace_dump_writef("<ptr>0x%08lx</ptr>", (unsigned long)(uintptr_t)value);
else
trace_dump_null();
}
diff --git a/src/gallium/drivers/trace/tr_dump.h b/src/gallium/drivers/trace/tr_dump.h
index 0beb1023b15..14176a78e97 100644
--- a/src/gallium/drivers/trace/tr_dump.h
+++ b/src/gallium/drivers/trace/tr_dump.h
@@ -39,6 +39,7 @@
boolean trace_dump_trace_begin(void);
+boolean trace_dump_enabled(void);
void trace_dump_trace_end(void);
void trace_dump_call_begin(const char *klass, const char *method);
void trace_dump_call_end(void);
diff --git a/src/gallium/drivers/trace/tr_stream.c b/src/gallium/drivers/trace/tr_stream.c
index 14cc257e154..aecc1286b8d 100644
--- a/src/gallium/drivers/trace/tr_stream.c
+++ b/src/gallium/drivers/trace/tr_stream.c
@@ -87,6 +87,18 @@ trace_stream_write(struct trace_stream *stream, const void *data, size_t size)
void
+trace_stream_flush(struct trace_stream *stream)
+{
+ if(!stream)
+ return;
+
+#if defined(PIPE_OS_LINUX)
+ fflush(stream->file);
+#endif
+}
+
+
+void
trace_stream_close(struct trace_stream *stream)
{
if(!stream)
diff --git a/src/gallium/drivers/trace/tr_stream.h b/src/gallium/drivers/trace/tr_stream.h
index 53e854aa913..679c4a725d7 100644
--- a/src/gallium/drivers/trace/tr_stream.h
+++ b/src/gallium/drivers/trace/tr_stream.h
@@ -49,6 +49,9 @@ boolean
trace_stream_write(struct trace_stream *stream, const void *data, size_t size);
void
+trace_stream_flush(struct trace_stream *stream);
+
+void
trace_stream_close(struct trace_stream *stream);