#include <stdlib.h>
#include <string.h>
+#include <map>
+
#include <zlib.h>
#include "os.hpp"
}
}
-static int reentrancy = 0;
-
static void _Open(const char *szExtension) {
_Close();
}
}
- {
- 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");
}
if (g_gzFile == NULL)
return;
- if (reentrancy > 1)
- return;
-
gzwrite(g_gzFile, sBuffer, dwBytesToWrite);
}
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");
_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)name;
-}
-
-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);
}
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);
}
void LiteralNamedConstant(const char *name, long long value) {
WriteByte(Trace::TYPE_CONST);
- WriteString(name);
+ WriteName(name);
LiteralSInt(value);
}