Index: base/debug/activity_analyzer.cc |
diff --git a/base/debug/activity_analyzer.cc b/base/debug/activity_analyzer.cc |
index 0c30d8d0c213c2e973dec707cc439d97e58e3fe7..90714bdd0f871e55759bfea90ea101faa5319265 100644 |
--- a/base/debug/activity_analyzer.cc |
+++ b/base/debug/activity_analyzer.cc |
@@ -15,9 +15,12 @@ |
namespace base { |
namespace debug { |
+ThreadActivityAnalyzer::Snapshot::Snapshot() {} |
+ThreadActivityAnalyzer::Snapshot::~Snapshot() {} |
+ |
ThreadActivityAnalyzer::ThreadActivityAnalyzer( |
const ThreadActivityTracker& tracker) |
- : activity_snapshot_valid_(tracker.Snapshot(&activity_snapshot_)) {} |
+ : activity_snapshot_valid_(tracker.CreateSnapshot(&activity_snapshot_)) {} |
ThreadActivityAnalyzer::ThreadActivityAnalyzer(void* base, size_t size) |
: ThreadActivityAnalyzer(ThreadActivityTracker(base, size)) {} |
@@ -33,6 +36,22 @@ ThreadActivityAnalyzer::ThreadActivityAnalyzer( |
ThreadActivityAnalyzer::~ThreadActivityAnalyzer() {} |
+void ThreadActivityAnalyzer::AddGlobalInformation( |
+ GlobalActivityAnalyzer* global) { |
+ if (!IsValid()) |
+ return; |
+ |
+ // User-data is held at the global scope even though it's referenced an the |
manzagop (departed)
2016/12/02 22:13:33
typo: referenced an -> at
bcwhite
2016/12/08 21:30:56
Done.
|
+ // thread scope. |
+ activity_snapshot_.user_data_stack.clear(); |
+ for (auto& activity : activity_snapshot_.activity_stack) { |
+ // The global GetUserDataSnapshot will return an empty snapshot if the ref |
+ // or id is not valid. |
+ activity_snapshot_.user_data_stack.push_back(global->GetUserDataSnapshot( |
+ activity.user_data_ref, activity.user_data_id)); |
+ } |
+} |
+ |
GlobalActivityAnalyzer::GlobalActivityAnalyzer( |
std::unique_ptr<PersistentMemoryAllocator> allocator) |
: allocator_(std::move(allocator)), allocator_iterator_(allocator_.get()) {} |
@@ -83,6 +102,46 @@ ThreadActivityAnalyzer* GlobalActivityAnalyzer::GetAnalyzerForThread( |
return found->second.get(); |
} |
+ActivityUserData::Snapshot GlobalActivityAnalyzer::GetUserDataSnapshot( |
+ uint32_t ref, |
+ uint32_t id) { |
+ ActivityUserData::Snapshot snapshot; |
+ |
+ void* memory = allocator_->GetAsArray<char>( |
+ ref, GlobalActivityTracker::kTypeIdUserDataRecord, |
+ PersistentMemoryAllocator::kSizeAny); |
+ if (memory) { |
+ size_t size = allocator_->GetAllocSize(ref); |
+ const ActivityUserData user_data(memory, size); |
+ user_data.CreateSnapshot(&snapshot); |
+ if (user_data.id() != id) { |
+ // This allocation has been overwritten since it was created. Return an |
+ // empty snapshot because whatever was captured is incorrect. |
+ snapshot.clear(); |
+ } |
+ } |
+ |
+ return snapshot; |
+} |
+ |
+ActivityUserData::Snapshot GlobalActivityAnalyzer::GetGlobalUserDataSnapshot() { |
+ ActivityUserData::Snapshot snapshot; |
+ |
+ PersistentMemoryAllocator::Reference ref = |
+ PersistentMemoryAllocator::Iterator(allocator_.get()) |
+ .GetNextOfType(GlobalActivityTracker::kTypeIdGlobalDataRecord); |
+ void* memory = allocator_->GetAsArray<char>( |
+ ref, GlobalActivityTracker::kTypeIdGlobalDataRecord, |
+ PersistentMemoryAllocator::kSizeAny); |
+ if (memory) { |
+ size_t size = allocator_->GetAllocSize(ref); |
+ const ActivityUserData global_data(memory, size); |
+ global_data.CreateSnapshot(&snapshot); |
+ } |
+ |
+ return snapshot; |
+} |
+ |
GlobalActivityAnalyzer::ProgramLocation |
GlobalActivityAnalyzer::GetProgramLocationFromAddress(uint64_t address) { |
// TODO(bcwhite): Implement this. |
@@ -123,6 +182,7 @@ void GlobalActivityAnalyzer::PrepareAllAnalyzers() { |
base, allocator_->GetAllocSize(tracker_ref))); |
if (!analyzer->IsValid()) |
continue; |
+ analyzer->AddGlobalInformation(this); |
// Add this analyzer to the map of known ones, indexed by a unique thread |
// identifier. |