X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_writer.cpp;h=5a5f1f7d2400b13784fd9dedcc7421593c1e304f;hb=851d0b0452234ace66a511327bd8e6f9d68fe9e9;hp=0a843d2ae34996bce43c415dbbbba3f12695e0b3;hpb=aad80c865375f4b1b6c9c57a65aa8c627b3e4388;p=apitrace diff --git a/trace_writer.cpp b/trace_writer.cpp index 0a843d2..5a5f1f7 100644 --- a/trace_writer.cpp +++ b/trace_writer.cpp @@ -30,10 +30,9 @@ #include #include -#include - #include "os.hpp" #include "trace_writer.hpp" +#include "trace_snappyfile.hpp" #include "trace_format.hpp" @@ -41,30 +40,29 @@ namespace Trace { Writer::Writer() : - g_gzFile(NULL), call_no(0) { + m_file = new Trace::SnappyFile; close(); -}; +} -Writer::~Writer() { +Writer::~Writer() +{ close(); -}; + delete m_file; + m_file = NULL; +} void Writer::close(void) { - if (g_gzFile != NULL) { - gzclose(g_gzFile); - g_gzFile = NULL; - } + m_file->close(); } bool Writer::open(const char *filename) { close(); - g_gzFile = gzopen(filename, "wb"); - if (!g_gzFile) { + if (!m_file->open(filename, File::Write)) { return false; } @@ -79,54 +77,9 @@ Writer::open(const char *filename) { return true; } -void -Writer::open(void) { - - static unsigned dwCounter = 0; - - const char *szExtension = "trace"; - char szFileName[PATH_MAX]; - const char *lpFileName; - - lpFileName = getenv("TRACE_FILE"); - if (lpFileName) { - strncpy(szFileName, lpFileName, PATH_MAX); - } - else { - char szProcessName[PATH_MAX]; - char szCurrentDir[PATH_MAX]; - OS::GetProcessName(szProcessName, PATH_MAX); - OS::GetCurrentDir(szCurrentDir, PATH_MAX); - - for (;;) { - FILE *file; - - if (dwCounter) - snprintf(szFileName, PATH_MAX, "%s%c%s.%u.%s", szCurrentDir, PATH_SEP, szProcessName, dwCounter, szExtension); - else - snprintf(szFileName, PATH_MAX, "%s%c%s.%s", szCurrentDir, PATH_SEP, szProcessName, szExtension); - - file = fopen(szFileName, "rb"); - if (file == NULL) - break; - - fclose(file); - - ++dwCounter; - } - } - - OS::DebugMessage("apitrace: tracing to %s\n", szFileName); - - open(szFileName); -} - void inline Writer::_write(const void *sBuffer, size_t dwBytesToWrite) { - if (g_gzFile == NULL) - return; - - gzwrite(g_gzFile, sBuffer, dwBytesToWrite); + m_file->write(sBuffer, dwBytesToWrite); } void inline @@ -181,22 +134,16 @@ inline bool lookup(std::vector &map, size_t index) { } } -unsigned Writer::beginEnter(const FunctionSig &function) { - OS::AcquireMutex(); - - if (!g_gzFile) { - open(); - } - +unsigned Writer::beginEnter(const FunctionSig *sig) { _writeByte(Trace::EVENT_ENTER); - _writeUInt(function.id); - if (!lookup(functions, function.id)) { - _writeString(function.name); - _writeUInt(function.num_args); - for (unsigned i = 0; i < function.num_args; ++i) { - _writeString(function.args[i]); + _writeUInt(sig->id); + if (!lookup(functions, sig->id)) { + _writeString(sig->name); + _writeUInt(sig->num_args); + for (unsigned i = 0; i < sig->num_args; ++i) { + _writeString(sig->arg_names[i]); } - functions[function.id] = true; + functions[sig->id] = true; } return call_no++; @@ -204,20 +151,15 @@ unsigned Writer::beginEnter(const FunctionSig &function) { void Writer::endEnter(void) { _writeByte(Trace::CALL_END); - gzflush(g_gzFile, Z_SYNC_FLUSH); - OS::ReleaseMutex(); } void Writer::beginLeave(unsigned call) { - OS::AcquireMutex(); _writeByte(Trace::EVENT_LEAVE); _writeUInt(call); } void Writer::endLeave(void) { _writeByte(Trace::CALL_END); - gzflush(g_gzFile, Z_SYNC_FLUSH); - OS::ReleaseMutex(); } void Writer::beginArg(unsigned index) { @@ -241,7 +183,7 @@ void Writer::beginStruct(const StructSig *sig) { _writeString(sig->name); _writeUInt(sig->num_members); for (unsigned i = 0; i < sig->num_members; ++i) { - _writeString(sig->members[i]); + _writeString(sig->member_names[i]); } structs[sig->id] = true; } @@ -326,19 +268,19 @@ void Writer::writeEnum(const EnumSig *sig) { } } -void Writer::writeBitmask(const BitmaskSig &bitmask, unsigned long long value) { +void Writer::writeBitmask(const BitmaskSig *sig, unsigned long long value) { _writeByte(Trace::TYPE_BITMASK); - _writeUInt(bitmask.id); - if (!lookup(bitmasks, bitmask.id)) { - _writeUInt(bitmask.count); - for (unsigned i = 0; i < bitmask.count; ++i) { - if (i != 0 && bitmask.values[i].value == 0) { - OS::DebugMessage("apitrace: bitmask %s is zero but is not first flag\n", bitmask.values[i].name); + _writeUInt(sig->id); + if (!lookup(bitmasks, sig->id)) { + _writeUInt(sig->num_flags); + for (unsigned i = 0; i < sig->num_flags; ++i) { + if (i != 0 && sig->flags[i].value == 0) { + OS::DebugMessage("apitrace: warning: sig %s is zero but is not first flag\n", sig->flags[i].name); } - _writeString(bitmask.values[i].name); - _writeUInt(bitmask.values[i].value); + _writeString(sig->flags[i].name); + _writeUInt(sig->flags[i].value); } - bitmasks[bitmask.id] = true; + bitmasks[sig->id] = true; } _writeUInt(value); } @@ -356,5 +298,6 @@ void Writer::writeOpaque(const void *addr) { _writeUInt((size_t)addr); } + } /* namespace Trace */