diff options
author | Yabin Cui <yabinc@google.com> | 2023-01-13 23:07:33 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2023-01-13 23:07:33 +0000 |
commit | d9ebe5109db6deaa698a3b3afd91f9c0a39373ca (patch) | |
tree | 02ed630bf9979a7ad8e950c16b377e1f0d085e6c | |
parent | dd06e01bd0f723e9be01f8c4b67267432fd1eed9 (diff) | |
parent | 8eb3509491a294c917d10669ae183e5160d109a9 (diff) | |
download | extras-d9ebe5109db6deaa698a3b3afd91f9c0a39373ca.tar.gz |
Merge "simpleperf: fix ReadAuxDataFromKernelBuffer."
-rw-r--r-- | simpleperf/RecordReadThread.cpp | 5 | ||||
-rw-r--r-- | simpleperf/RecordReadThread_test.cpp | 11 |
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) { |