]> git.cworth.org Git - apitrace/blobdiff - log.cpp
Split glxapi.
[apitrace] / log.cpp
diff --git a/log.cpp b/log.cpp
index e634b653136300b50ad8bd776ddb6fa12a3d1339..719666fb21a7df211d2a1102e513f323ed2c6cae 100644 (file)
--- a/log.cpp
+++ b/log.cpp
@@ -30,6 +30,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <map>
+
 #include <zlib.h>
 
 #include "os.hpp"
@@ -48,8 +50,6 @@ static void _Close(void) {
    }
 }
 
-static int reentrancy = 0;
-
 static void _Open(const char *szExtension) {
    _Close();
    
@@ -86,11 +86,7 @@ static void _Open(const char *szExtension) {
        }
    }
 
-   {
-       char szMessage[PATH_MAX];
-       snprintf(szMessage, PATH_MAX, "Tracing to %s\n", szFileName);
-       OS::DebugMessage(szMessage);
-   }
+   OS::DebugMessage("apitrace: tracing to %s\n", szFileName);
 
    g_gzFile = gzopen(szFileName, "wb");
 }
@@ -99,9 +95,6 @@ static inline void Write(const void *sBuffer, size_t dwBytesToWrite) {
    if (g_gzFile == NULL)
       return;
    
-   if (reentrancy > 1)
-      return;
-
    gzwrite(g_gzFile, sBuffer, dwBytesToWrite);
 }
 
@@ -148,6 +141,22 @@ WriteString(const char *str) {
    Write(str, len);
 }
 
+typedef std::map<const char *, size_t> namemap;
+static namemap names;
+
+static inline void 
+WriteName(const char *name) {
+   namemap::iterator it = names.find(name);
+   if (it == names.end()) {
+       size_t name_id = names.size();
+       WriteUInt(name_id);
+       WriteString(name);
+       names[name] = name_id;
+   } else {
+       WriteUInt(it->second);
+   }
+}
+
 void Open(void) {
     if (!g_gzFile) {
         _Open("trace");
@@ -159,58 +168,58 @@ void Close(void) {
    _Close();
 }
 
-void BeginCall(const char *function) {
+static unsigned call_no = 0;
+
+unsigned BeginEnter(const char *function) {
    OS::AcquireMutex();
    Open();
-   ++reentrancy;
-   WriteString(function);
+   WriteByte(Trace::EVENT_ENTER);
+   WriteName(function);
+   return call_no++;
 }
 
-void EndCall(void) {
+void EndEnter(void) {
    WriteByte(Trace::CALL_END);
-   --reentrancy;
    gzflush(g_gzFile, Z_SYNC_FLUSH);
    OS::ReleaseMutex();
 }
 
-void BeginArg(const char *name) {
-   WriteByte(Trace::CALL_ARG);
-   WriteString(name);
+void BeginLeave(unsigned call) {
+   OS::AcquireMutex();
+   WriteByte(Trace::EVENT_LEAVE);
+   WriteUInt(call);
 }
 
-void EndArg(void) { }
+void EndLeave(void) {
+   WriteByte(Trace::CALL_END);
+   gzflush(g_gzFile, Z_SYNC_FLUSH);
+   OS::ReleaseMutex();
+}
+
+void BeginArg(unsigned index, const char *name) {
+   WriteByte(Trace::CALL_ARG);
+   WriteUInt(index);
+   WriteName(name);
+}
 
 void BeginReturn(void) {
    WriteByte(Trace::CALL_RET);
 }
 
-void EndReturn(void) { }
-
 void BeginArray(size_t length) {
    WriteByte(Trace::TYPE_ARRAY);
    WriteUInt(length);
 }
 
-void EndArray(void) { }
-
-void BeginElement(void) { }
-
-void EndElement(void) { }
-
-void BeginStruct(const char *name) {
+void BeginStruct(size_t length) {
    WriteByte(Trace::TYPE_STRUCT);
-}
-
-void EndStruct(void) {
-   WriteString("");
+   WriteUInt(length);
 }
 
 void BeginMember(const char *name) {
-   WriteString(name);
+   WriteName(name);
 }
 
-void EndMember(void) { }
-
 void BeginBitmask(void) {
    WriteByte(Trace::TYPE_BITMASK);
 }
@@ -219,14 +228,6 @@ void EndBitmask(void) {
    WriteByte(Trace::TYPE_NULL);
 }
 
-void BeginPointer(const void *addr)
-{
-   WriteByte(Trace::TYPE_POINTER);
-   WriteUInt((size_t)addr);
-}
-
-void EndPointer(void) { }
-
 void LiteralBool(bool value) {
    WriteByte(value ? Trace::TYPE_TRUE : Trace::TYPE_FALSE);
 }
@@ -265,6 +266,16 @@ void LiteralString(const char *str) {
    WriteString(str);
 }
 
+void LiteralString(const char *str, size_t len) {
+   if (!str) {
+      LiteralNull();
+      return;
+   }
+   WriteByte(Trace::TYPE_STRING);
+   WriteUInt(len);
+   Write(str, len);
+}
+
 void LiteralWString(const wchar_t *str) {
    if (!str) {
       LiteralNull();
@@ -288,7 +299,7 @@ void LiteralBlob(const void *data, size_t size) {
 
 void LiteralNamedConstant(const char *name, long long value) {
    WriteByte(Trace::TYPE_CONST);
-   WriteString(name);
+   WriteName(name);
    LiteralSInt(value);
 }
 
@@ -310,9 +321,4 @@ void Abort(void) {
     OS::Abort();
 }
 
-static void _uninit(void) __attribute__((destructor));
-static void _uninit(void) {
-   Close();
-}
-
 } /* namespace Log */