class NewCPUIDRecord : public MetadataRecord {
uint16_t CPUId = 0;
+ uint64_t TSC = 0;
friend class RecordInitializer;
public:
NewCPUIDRecord() = default;
- explicit NewCPUIDRecord(uint16_t C) : MetadataRecord(), CPUId(C) {}
+ NewCPUIDRecord(uint16_t C, uint64_t T) : MetadataRecord(), CPUId(C), TSC(T) {}
MetadataType metadataType() const override { return MetadataType::NewCPUId; }
uint16_t cpuid() const { return CPUId; }
+ uint64_t tsc() const { return TSC; }
+
Error apply(RecordVisitor &V) override;
};
return createStringError(std::make_error_code(std::errc::bad_address),
"Invalid offset for a new cpu id record (%d).",
OffsetPtr);
+ auto BeginOffset = OffsetPtr;
auto PreReadOffset = OffsetPtr;
R.CPUId = E.getU16(&OffsetPtr);
if (OffsetPtr == PreReadOffset)
return createStringError(std::make_error_code(std::errc::bad_message),
"Cannot read CPU id at offset %d.", OffsetPtr);
- OffsetPtr += MetadataRecord::kMetadataBodySize - (OffsetPtr - PreReadOffset);
+ PreReadOffset = OffsetPtr;
+ R.TSC = E.getU64(&OffsetPtr);
+ if (OffsetPtr == PreReadOffset)
+ return createStringError(std::make_error_code(std::errc::bad_message),
+ "Cannot read CPU TSC at offset %d.", OffsetPtr);
+
+ OffsetPtr += MetadataRecord::kMetadataBodySize - (OffsetPtr - BeginOffset);
return Error::success();
}
}
Error RecordPrinter::visit(NewCPUIDRecord &R) {
- OS << formatv("<CPU ID: {0}>", R.cpuid()) << Delim;
+ OS << formatv("<CPU: id = {0}, tsc = {1}>", R.cpuid(), R.tsc()) << Delim;
return Error::success();
}
; CHECK-NEXT: <PID: 2631>
; CHECK-EMPTY:
; CHECK-NEXT: Body:
-; CHECK-NEXT: <CPU ID: 6>
-; CHECK-NEXT: <CPU ID: 6>
+; CHECK-NEXT: <CPU: id = 6, tsc = 2034042117104344>
+; CHECK-NEXT: <CPU: id = 6, tsc = 2034042117104344>
; CHECK-NEXT: <TSC Wrap: base = 2034042117104344>
; CHECK-EMPTY:
; CHECK-NEXT: - <Function Enter: #3 delta = +3>
; CHECK-NEXT: <Wall Time: seconds = 1452786.250689>
; CHECK-EMPTY:
; CHECK-NEXT: Body:
-; CHECK-NEXT: <CPU ID: 49>
+; CHECK-NEXT: <CPU: id = 49, tsc = 18828908666540172>
; CHECK-NEXT: <TSC Wrap: base = 18828908666540172>
; CHECK-EMPTY:
; CHECK-NEXT: - <Function Enter: #1 delta = +1>
.add<NewBufferRecord>(1)
.add<WallclockRecord>(1, 2)
.add<PIDRecord>(1)
- .add<NewCPUIDRecord>(1)
+ .add<NewCPUIDRecord>(1, 2)
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
.consume();
.add<NewBufferRecord>(1)
.add<WallclockRecord>(1, 2)
.add<PIDRecord>(1)
- .add<NewCPUIDRecord>(1)
+ .add<NewCPUIDRecord>(1, 2)
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
.consume();
.add<NewBufferRecord>(2)
.add<WallclockRecord>(1, 2)
.add<PIDRecord>(1)
- .add<NewCPUIDRecord>(2)
+ .add<NewCPUIDRecord>(2, 2)
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
.consume();
.add<NewBufferRecord>(1)
.add<WallclockRecord>(1, 2)
.add<PIDRecord>(1)
- .add<NewCPUIDRecord>(1)
+ .add<NewCPUIDRecord>(1, 2)
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
.consume();
.add<NewBufferRecord>(1)
.add<WallclockRecord>(1, 2)
.add<PIDRecord>(1)
- .add<NewCPUIDRecord>(1)
+ .add<NewCPUIDRecord>(1, 2)
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
.consume();
.add<NewBufferRecord>(2)
.add<WallclockRecord>(1, 2)
.add<PIDRecord>(1)
- .add<NewCPUIDRecord>(2)
+ .add<NewCPUIDRecord>(2, 2)
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
.consume();
.add<BufferExtents>(20)
.add<NewBufferRecord>(1)
.add<WallclockRecord>(1, 2)
- .add<NewCPUIDRecord>(1)
+ .add<NewCPUIDRecord>(1, 2)
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
.consume();
auto Block = LogBuilder()
.add<NewBufferRecord>(1)
.add<WallclockRecord>(1, 2)
- .add<NewCPUIDRecord>(1)
+ .add<NewCPUIDRecord>(1, 2)
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
.consume();
auto Block = LogBuilder()
.add<NewBufferRecord>(1)
.add<WallclockRecord>(1, 2)
- .add<NewCPUIDRecord>(1)
+ .add<NewCPUIDRecord>(1, 2)
.add<EndBufferRecord>()
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
auto Block = LogBuilder()
.add<NewBufferRecord>(1)
.add<WallclockRecord>(1, 2)
- .add<NewCPUIDRecord>(1)
+ .add<NewCPUIDRecord>(1, 2)
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
.add<NewBufferRecord>(2)
}
template <> std::unique_ptr<Record> MakeRecord<NewCPUIDRecord>() {
- return make_unique<NewCPUIDRecord>(1);
+ return make_unique<NewCPUIDRecord>(1, 2);
}
template <> std::unique_ptr<Record> MakeRecord<TSCWrapRecord>() {
template <> struct Helper<NewCPUIDRecord> {
static std::unique_ptr<Record> construct() {
- return make_unique<NewCPUIDRecord>(1);
+ return make_unique<NewCPUIDRecord>(1, 2);
}
- static const char *expected() { return "<CPU ID: 1>"; }
+ static const char *expected() { return "<CPU: id = 1, tsc = 2>"; }
};
template <> struct Helper<TSCWrapRecord> {
.add<NewBufferRecord>(1)
.add<WallclockRecord>(1, 1)
.add<PIDRecord>(1)
- .add<NewCPUIDRecord>(1)
+ .add<NewCPUIDRecord>(1, 2)
.consume();
BlockVerifier Verifier;
for (auto &R : Block)
.add<NewBufferRecord>(1)
.add<WallclockRecord>(1, 1)
.add<PIDRecord>(1)
- .add<NewCPUIDRecord>(1)
+ .add<NewCPUIDRecord>(1, 2)
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
.consume();
.add<NewBufferRecord>(1)
.add<WallclockRecord>(1, 1)
.add<PIDRecord>(1)
- .add<NewCPUIDRecord>(1)
+ .add<NewCPUIDRecord>(1, 2)
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
.consume();
.add<NewBufferRecord>(1)
.add<WallclockRecord>(1, 1)
.add<PIDRecord>(1)
- .add<NewCPUIDRecord>(1)
+ .add<NewCPUIDRecord>(1, 2)
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
.consume();
.add<NewBufferRecord>(1)
.add<WallclockRecord>(1, 1)
.add<PIDRecord>(1)
- .add<NewCPUIDRecord>(1)
+ .add<NewCPUIDRecord>(1, 2)
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
.consume();
.add<BufferExtents>(64)
.add<NewBufferRecord>(1)
.add<WallclockRecord>(1, 1)
- .add<NewCPUIDRecord>(1)
+ .add<NewCPUIDRecord>(1, 2)
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
.consume();
auto L = LogBuilder()
.add<NewBufferRecord>(1)
.add<WallclockRecord>(1, 1)
- .add<NewCPUIDRecord>(1)
+ .add<NewCPUIDRecord>(1, 2)
.add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
.add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
.add<EndBufferRecord>()