X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_writer.hpp;h=dfb76b2508a4bac02f455b9d570cc733c5492f9a;hb=35c2793ac758997a0a1c2e558d384ab94754987d;hp=d41acdef1d26e994ac635d0f0009fb3ca1db625e;hpb=9ed672278e79600c4c7ad34a715ecfc4beda9255;p=apitrace diff --git a/trace_writer.hpp b/trace_writer.hpp index d41acde..dfb76b2 100644 --- a/trace_writer.hpp +++ b/trace_writer.hpp @@ -30,82 +30,116 @@ #ifndef _TRACE_WRITER_HPP_ #define _TRACE_WRITER_HPP_ -#include -namespace Trace { +#include - typedef unsigned Id; +#include - struct FunctionSig { - Id id; - const char *name; - unsigned num_args; - const char **args; - }; +#include "trace_model.hpp" - struct StructSig { - Id id; - const char *name; - unsigned num_members; - const char **members; - }; - struct EnumSig { - Id id; - const char *name; - signed long long value; - }; +namespace Trace { + class File; + + class Writer { + protected: + File *m_file; + unsigned call_no; + + std::vector functions; + std::vector structs; + std::vector enums; + std::vector bitmasks; + + public: + Writer(); + ~Writer(); + + bool open(const char *filename); + void close(void); + + unsigned beginEnter(const FunctionSig *sig); + void endEnter(void); + + void beginLeave(unsigned call); + void endLeave(void); + + void beginArg(unsigned index); + inline void endArg(void) {} + + void beginReturn(void); + inline void endReturn(void) {} + + void beginArray(size_t length); + inline void endArray(void) {} + + inline void beginElement(void) {} + inline void endElement(void) {} + + void beginStruct(const StructSig *sig); + inline void endStruct(void) {} + + void writeBool(bool value); + void writeSInt(signed long long value); + void writeUInt(unsigned long long value); + void writeFloat(float value); + void writeDouble(double value); + void writeString(const char *str); + void writeString(const char *str, size_t size); + void writeWString(const wchar_t *str); + void writeBlob(const void *data, size_t size); + void writeEnum(const EnumSig *sig); + 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); + void inline _writeUInt(unsigned long long value); + void inline _writeFloat(float value); + void inline _writeDouble(double value); + void inline _writeString(const char *str); - struct BitmaskVal { - const char *name; - unsigned long long value; }; - struct BitmaskSig { - Id id; - unsigned count; - const BitmaskVal *values; + /** + * 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); }; - void Open(void); - void Close(void); - - unsigned BeginEnter(const FunctionSig &function); - void EndEnter(void); - - void BeginLeave(unsigned call); - void EndLeave(void); - - void BeginArg(unsigned index); - inline void EndArg(void) {} - - void BeginReturn(void); - inline void EndReturn(void) {} - - void BeginArray(size_t length); - inline void EndArray(void) {} - - inline void BeginElement(void) {} - inline void EndElement(void) {} - - void BeginStruct(const StructSig *sig); - inline void EndStruct(void) {} - - void LiteralBool(bool value); - void LiteralSInt(signed long long value); - void LiteralUInt(unsigned long long value); - void LiteralFloat(float value); - void LiteralDouble(double value); - void LiteralString(const char *str); - void LiteralString(const char *str, size_t size); - void LiteralWString(const wchar_t *str); - void LiteralBlob(const void *data, size_t size); - void LiteralEnum(const EnumSig *sig); - void LiteralBitmask(const BitmaskSig &bitmask, unsigned long long value); - void LiteralNull(void); - void LiteralOpaque(const void *ptr); - - void Abort(void); + /** + * Singleton. + */ + extern LocalWriter localWriter; } #endif /* _TRACE_WRITER_HPP_ */