X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_writer.hpp;h=dfb76b2508a4bac02f455b9d570cc733c5492f9a;hb=df95ce0021270675feb2eed73d920f0d51b29e24;hp=9d07150055140bb941333bd2a4d05bdb8a4f0171;hpb=1c8309fd42d667d2f8c96ff61ddced29c8c0c82b;p=apitrace diff --git a/trace_writer.hpp b/trace_writer.hpp index 9d07150..dfb76b2 100644 --- a/trace_writer.hpp +++ b/trace_writer.hpp @@ -39,10 +39,11 @@ namespace Trace { + class File; class Writer { protected: - void *g_gzFile; + File *m_file; unsigned call_no; std::vector functions; @@ -54,7 +55,6 @@ namespace Trace { Writer(); ~Writer(); - void open(void); bool open(const char *filename); void close(void); @@ -93,6 +93,8 @@ namespace Trace { 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); @@ -102,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_ */