X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_writer.hpp;h=dfb76b2508a4bac02f455b9d570cc733c5492f9a;hb=c592957de1083b4e32ee58c0ea2e5feaa9085b47;hp=765d00623a420ff2b755e915530a1f538a7db0ce;hpb=0091432a9a7d98a125b5cbe0b3be7342949a0969;p=apitrace diff --git a/trace_writer.hpp b/trace_writer.hpp index 765d006..dfb76b2 100644 --- a/trace_writer.hpp +++ b/trace_writer.hpp @@ -30,48 +30,20 @@ #ifndef _TRACE_WRITER_HPP_ #define _TRACE_WRITER_HPP_ + #include #include -namespace Trace { - - typedef unsigned Id; - - struct FunctionSig { - Id id; - const char *name; - unsigned num_args; - const char **arg_names; - }; - - struct StructSig { - Id id; - const char *name; - unsigned num_members; - const char **member_names; - }; - - struct EnumSig { - Id id; - const char *name; - signed long long value; - }; +#include "trace_model.hpp" - struct BitmaskVal { - const char *name; - unsigned long long value; - }; - struct BitmaskSig { - Id id; - unsigned count; - const BitmaskVal *values; - }; +namespace Trace { + class File; class Writer { protected: - void *g_gzFile; + File *m_file; unsigned call_no; std::vector functions; @@ -83,11 +55,10 @@ namespace Trace { Writer(); ~Writer(); - void open(void); bool open(const char *filename); void close(void); - unsigned beginEnter(const FunctionSig &function); + unsigned beginEnter(const FunctionSig *sig); void endEnter(void); void beginLeave(unsigned call); @@ -118,10 +89,12 @@ namespace Trace { void writeWString(const wchar_t *str); void writeBlob(const void *data, size_t size); void writeEnum(const EnumSig *sig); - void writeBitmask(const BitmaskSig &bitmask, unsigned long long value); + void writeBitmask(const BitmaskSig *sig, unsigned long long value); void writeNull(void); void writeOpaque(const void *ptr); + void writeCall(Call *call); + protected: void inline _write(const void *sBuffer, size_t dwBytesToWrite); void inline _writeByte(char c); @@ -131,6 +104,42 @@ namespace Trace { void inline _writeString(const char *str); }; + + /** + * A specialized Writer class, mean to trace the current process. + * + * In particular: + * - it creates a trace file based on the current process name + * - uses mutexes to allow tracing from multiple threades + * - flushes the output to ensure the last call is traced in event of + * abnormal termination + */ + class LocalWriter : public Writer { + protected: + int acquired; + + public: + /** + * Should never called directly -- use localWriter singleton below instead. + */ + LocalWriter(); + ~LocalWriter(); + + void open(void); + + unsigned beginEnter(const FunctionSig *sig); + void endEnter(void); + + void beginLeave(unsigned call); + void endLeave(void); + + void flush(void); + }; + + /** + * Singleton. + */ + extern LocalWriter localWriter; } #endif /* _TRACE_WRITER_HPP_ */