summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2023-01-13 23:07:33 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2023-01-13 23:07:33 +0000
commitd9ebe5109db6deaa698a3b3afd91f9c0a39373ca (patch)
tree02ed630bf9979a7ad8e950c16b377e1f0d085e6c
parentdd06e01bd0f723e9be01f8c4b67267432fd1eed9 (diff)
parent8eb3509491a294c917d10669ae183e5160d109a9 (diff)
downloadextras-d9ebe5109db6deaa698a3b3afd91f9c0a39373ca.tar.gz
Merge "simpleperf: fix ReadAuxDataFromKernelBuffer."
-rw-r--r--simpleperf/RecordReadThread.cpp5
-rw-r--r--simpleperf/RecordReadThread_test.cpp11
2 files changed, 9 insertions, 7 deletions
diff --git a/simpleperf/RecordReadThread.cpp b/simpleperf/RecordReadThread.cpp
index 666be876..ebc942a5 100644
--- a/simpleperf/RecordReadThread.cpp
+++ b/simpleperf/RecordReadThread.cpp
@@ -625,10 +625,11 @@ void RecordReadThread::ReadAuxDataFromKernelBuffer(bool* has_data) {
*has_data = true;
AuxTraceRecord auxtrace(Align(aux_size, 8), offset, event_fd->Cpu(), 0, event_fd->Cpu());
size_t alloc_size = auxtrace.size() + auxtrace.data->aux_size;
- if (record_buffer_.GetFreeSize() < alloc_size + record_buffer_critical_level_) {
+ char* p = nullptr;
+ if ((record_buffer_.GetFreeSize() < alloc_size + record_buffer_critical_level_) ||
+ (p = record_buffer_.AllocWriteSpace(alloc_size)) == nullptr) {
stat_.lost_aux_data_size += aux_size;
} else {
- char* p = record_buffer_.AllocWriteSpace(alloc_size);
CHECK(p != nullptr);
MoveToBinaryFormat(auxtrace.Binary(), auxtrace.size(), p);
MoveToBinaryFormat(buf[0], size[0], p);
diff --git a/simpleperf/RecordReadThread_test.cpp b/simpleperf/RecordReadThread_test.cpp
index b61c9beb..3c90e4be 100644
--- a/simpleperf/RecordReadThread_test.cpp
+++ b/simpleperf/RecordReadThread_test.cpp
@@ -476,16 +476,17 @@ struct FakeAuxData {
};
TEST_F(RecordReadThreadTest, read_aux_data) {
+ ScopedEventTypes scoped_types("cs-etm,0,0");
const EventType* type = FindEventTypeByName("cs-etm");
- if (type == nullptr) {
- GTEST_LOG_(INFO) << "Omit this test as cs-etm event type isn't available";
- return;
- }
+ ASSERT_TRUE(type != nullptr);
std::vector<FakeAuxData> aux_data;
aux_data.emplace_back(40, 0, '0', 0, false); // one buffer
aux_data.emplace_back(40, 40, '1', 0, false); // two buffers
aux_data.emplace_back(36, 0, '2', 4, false); // one buffer needs padding to 8 bytes alignment
- aux_data.emplace_back(1024, 0, '3', 0, true); // one buffer too big to fit into RecordReadThread
+ // one buffer too big to fit in record buffer, failing at checking free size
+ aux_data.emplace_back(1024, 0, '3', 0, true);
+ // one buffer too big to fit in record buffer, failing at AllocWriteSpace()
+ aux_data.emplace_back(800, 0, '4', 0, true);
size_t test_index = 0;
auto SetBuf1 = [&](char** buf1) {