Index: base/debug/activity_analyzer.h |
diff --git a/base/debug/activity_analyzer.h b/base/debug/activity_analyzer.h |
index 95df69fd9b4abad4fb25eef7f8037a0ffb8785a6..2200537a0dcb067bc49012adc1906749d7a6a4bc 100644 |
--- a/base/debug/activity_analyzer.h |
+++ b/base/debug/activity_analyzer.h |
@@ -9,6 +9,7 @@ |
#include <memory> |
#include <set> |
#include <string> |
+#include <vector> |
#include "base/base_export.h" |
#include "base/debug/activity_tracker.h" |
@@ -77,6 +78,13 @@ class BASE_EXPORT ThreadActivityAnalyzer { |
// methods are undefined if this returns false. |
bool IsValid() { return activity_snapshot_valid_; } |
+ // Gets the process id and its creation stamp. |
+ int64_t GetProcessId(int64_t* out_stamp = nullptr) { |
+ if (out_stamp) |
+ *out_stamp = activity_snapshot_.create_stamp; |
+ return activity_snapshot_.process_id; |
+ } |
+ |
// Gets the name of the thread. |
const std::string& GetThreadName() { |
return activity_snapshot_.thread_name; |
@@ -136,10 +144,23 @@ class BASE_EXPORT GlobalActivityAnalyzer { |
const FilePath& file_path); |
#endif // !defined(OS_NACL) |
- // Iterates over all known valid analyzers or returns null if there are no |
- // more. Ownership stays with the global analyzer object and all existing |
- // analyzer pointers are invalidated when GetFirstAnalyzer() is called. |
- ThreadActivityAnalyzer* GetFirstAnalyzer(); |
+ // Iterates over all known valid processes and returns their PIDs or zero |
+ // if there are no more. Calls to GetFirstProcess() will perform a global |
+ // snapshot in order to provide a relatively consistent state across the |
+ // future calls to GetNextProcess() and GetFirst/NextAnalyzer(). PIDs are |
+ // returned in the order they're found meaning that a first-launched |
+ // controlling process will be found first. Note, however, that space |
+ // freed by an exiting process may be re-used by a later process. |
+ int64_t GetFirstProcess(); |
+ int64_t GetNextProcess(); |
+ |
+ // Iterates over all known valid analyzers for the a given process or returns |
+ // null if there are no more. |
+ // |
+ // GetFirstProcess() must be called first in order to capture a global |
+ // snapshot! Ownership stays with the global analyzer object and all existing |
+ // analyzer pointers are invalidated when GetFirstProcess() is called. |
+ ThreadActivityAnalyzer* GetFirstAnalyzer(int64_t pid); |
ThreadActivityAnalyzer* GetNextAnalyzer(); |
// Gets the analyzer for a specific thread or null if there is none. |
@@ -147,10 +168,16 @@ class BASE_EXPORT GlobalActivityAnalyzer { |
ThreadActivityAnalyzer* GetAnalyzerForThread(const ThreadKey& key); |
// Extract user data based on a reference and its identifier. |
- ActivityUserData::Snapshot GetUserDataSnapshot(uint32_t ref, uint32_t id); |
+ ActivityUserData::Snapshot GetUserDataSnapshot(int64_t pid, |
+ uint32_t ref, |
+ uint32_t id); |
+ |
+ // Extract the data for a specific process. An empty snapshot will be |
+ // returned if the process is not known. |
+ const ActivityUserData::Snapshot& GetProcessDataSnapshot(int64_t pid); |
- // Extract the global user data. |
- ActivityUserData::Snapshot GetGlobalUserDataSnapshot(); |
+ // Extract the global data. |
+ const ActivityUserData::Snapshot& GetGlobalDataSnapshot(); |
// Gets all log messages stored within. |
std::vector<std::string> GetLogMessages(); |
@@ -166,17 +193,40 @@ class BASE_EXPORT GlobalActivityAnalyzer { |
using AnalyzerMap = |
std::map<ThreadKey, std::unique_ptr<ThreadActivityAnalyzer>>; |
+ struct UserDataSnapshot { |
+ // Complex class needs out-of-line ctor/dtor. |
+ UserDataSnapshot(); |
+ UserDataSnapshot(const UserDataSnapshot& rhs); |
+ UserDataSnapshot(UserDataSnapshot&& rhs); |
+ ~UserDataSnapshot(); |
+ |
+ int64_t process_id; |
+ int64_t create_stamp; |
+ ActivityUserData::Snapshot data; |
+ }; |
+ |
// Finds, creates, and indexes analyzers for all known processes and threads. |
void PrepareAllAnalyzers(); |
// The persistent memory allocator holding all tracking data. |
std::unique_ptr<PersistentMemoryAllocator> allocator_; |
+ // The time stamp when analysis began. This is used to prevent looking into |
+ // process IDs that get reused when analyzing a live system. |
+ int64_t analysis_stamp_; |
+ |
// The iterator for finding tracking information in the allocator. |
PersistentMemoryAllocator::Iterator allocator_iterator_; |
- // A set of all tracker memory references found within the allocator. |
- std::set<PersistentMemoryAllocator::Reference> tracker_references_; |
+ // A set of all interesting memory references found within the allocator. |
+ std::set<PersistentMemoryAllocator::Reference> memory_references_; |
+ |
+ // A set of all process-data memory references found within the allocator. |
+ std::map<int64_t, UserDataSnapshot> process_data_; |
+ |
+ // A set of all process IDs collected during PrepareAllAnalyzers. These are |
+ // popped and returned one-by-one with calls to GetFirst/NextProcess(). |
+ std::vector<int64_t> process_ids_; |
// A map, keyed by ThreadKey, of all valid activity analyzers. |
AnalyzerMap analyzers_; |
@@ -184,6 +234,10 @@ class BASE_EXPORT GlobalActivityAnalyzer { |
// The iterator within the analyzers_ map for returning analyzers through |
// first/next iteration. |
AnalyzerMap::iterator analyzers_iterator_; |
+ int64_t analyzers_iterator_pid_; |
+ |
+ // Snapshot of the global data. |
+ ActivityUserData::Snapshot global_data_snapshot_; |
DISALLOW_COPY_AND_ASSIGN(GlobalActivityAnalyzer); |
}; |