#ifndef _TRACE_WRITER_HPP_
#define _TRACE_WRITER_HPP_
+
#include <stddef.h>
#include <vector>
-namespace Trace {
-
- typedef unsigned Id;
-
- struct FunctionSig {
- Id id;
- const char *name;
- unsigned num_args;
- const char **args;
- };
-
- 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<bool> functions;
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);
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);
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_ */