From f121d0e54f39d8f6361dcf0bf4d938ccb5ae4b5e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Fonseca?= <jrfonseca@tungstengraphics.com>
Date: Fri, 15 Aug 2008 10:24:09 +0100
Subject: trace: Allow multiple screens. Flush after call.

---
 src/gallium/drivers/trace/tr_dump.c   | 53 ++++++++++++++++++++++++-----------
 src/gallium/drivers/trace/tr_dump.h   |  1 +
 src/gallium/drivers/trace/tr_stream.c | 12 ++++++++
 src/gallium/drivers/trace/tr_stream.h |  3 ++
 4 files changed, 53 insertions(+), 16 deletions(-)

(limited to 'src/gallium/drivers/trace')

diff --git a/src/gallium/drivers/trace/tr_dump.c b/src/gallium/drivers/trace/tr_dump.c
index 6ebb639b7c..c711a56b94 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 0beb1023b1..14176a78e9 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 14cc257e15..aecc1286b8 100644
--- a/src/gallium/drivers/trace/tr_stream.c
+++ b/src/gallium/drivers/trace/tr_stream.c
@@ -86,6 +86,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) 
 {
diff --git a/src/gallium/drivers/trace/tr_stream.h b/src/gallium/drivers/trace/tr_stream.h
index 53e854aa91..679c4a725d 100644
--- a/src/gallium/drivers/trace/tr_stream.h
+++ b/src/gallium/drivers/trace/tr_stream.h
@@ -48,6 +48,9 @@ trace_stream_create(const char *name, const char *ext);
 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);
 
-- 
cgit v1.2.3