void Writer::writeSInt(signed long long value) { if (value < 0) { _writeByte(trace::TYPE_SINT); _writeUInt(-value); } else { _writeByte(trace::TYPE_UINT); _writeUInt(value); } }
void Writer::beginStruct(const StructSig *sig) { _writeByte(trace::TYPE_STRUCT); _writeUInt(sig->id); if (!lookup(structs, sig->id)) { _writeString(sig->name); _writeUInt(sig->num_members); for (unsigned i = 0; i < sig->num_members; ++i) { _writeString(sig->member_names[i]); } structs[sig->id] = true; } }
void Writer::writeEnum(const EnumSig *sig, signed long long value) { _writeByte(trace::TYPE_ENUM); _writeUInt(sig->id); if (!lookup(enums, sig->id)) { _writeUInt(sig->num_values); for (unsigned i = 0; i < sig->num_values; ++i) { _writeString(sig->values[i].name); writeSInt(sig->values[i].value); } enums[sig->id] = true; } writeSInt(value); }
unsigned Writer::beginEnter(const FunctionSig *sig) { _writeByte(trace::EVENT_ENTER); _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[sig->id] = true; } return call_no++; }
void Writer::writeBitmask(const BitmaskSig *sig, unsigned long long value) { _writeByte(trace::TYPE_BITMASK); _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::log("apitrace: warning: sig %s is zero but is not first flag\n", sig->flags[i].name); } _writeString(sig->flags[i].name); _writeUInt(sig->flags[i].value); } bitmasks[sig->id] = true; } _writeUInt(value); }
void Writer::writePointer(unsigned long long addr) { if (!addr) { Writer::writeNull(); return; } _writeByte(trace::TYPE_OPAQUE); _writeUInt(addr); }
void Writer::writeOpaque(const void *addr) { if (!addr) { Writer::writeNull(); return; } _writeByte(trace::TYPE_OPAQUE); _writeUInt((size_t)addr); }
void Writer::writeString(const char *str, size_t len) { if (!str) { Writer::writeNull(); return; } _writeByte(trace::TYPE_STRING); _writeUInt(len); _write(str, len); }
void Writer::writeEnum(const EnumSig *sig) { _writeByte(trace::TYPE_ENUM); _writeUInt(sig->id); if (!lookup(enums, sig->id)) { _writeString(sig->name); Writer::writeSInt(sig->value); enums[sig->id] = true; } }
void Writer::writeBlob(const void *data, size_t size) { if (!data) { Writer::writeNull(); return; } _writeByte(trace::TYPE_BLOB); _writeUInt(size); if (size) { _write(data, size); } }
bool Writer::open(const char *filename) { close(); if (!m_file->open(filename, File::Write)) { return false; } call_no = 0; functions.clear(); structs.clear(); enums.clear(); bitmasks.clear(); _writeUInt(TRACE_VERSION); return true; }
void Writer::writeUInt(unsigned long long value) { _writeByte(trace::TYPE_UINT); _writeUInt(value); }
void Writer::beginArray(size_t length) { _writeByte(trace::TYPE_ARRAY); _writeUInt(length); }
void Writer::beginArg(unsigned index) { _writeByte(trace::CALL_ARG); _writeUInt(index); }
void Writer::beginLeave(unsigned call) { _writeByte(trace::EVENT_LEAVE); _writeUInt(call); }
void inline Writer::_writeString(const char *str) { size_t len = strlen(str); _writeUInt(len); _write(str, len); }