diff options
Diffstat (limited to 'catapult/systrace/atrace_helper/jni/atrace_process_dump.h')
-rw-r--r-- | catapult/systrace/atrace_helper/jni/atrace_process_dump.h | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/catapult/systrace/atrace_helper/jni/atrace_process_dump.h b/catapult/systrace/atrace_helper/jni/atrace_process_dump.h new file mode 100644 index 00000000..b71184a4 --- /dev/null +++ b/catapult/systrace/atrace_helper/jni/atrace_process_dump.h @@ -0,0 +1,82 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ATRACE_PROCESS_DUMP_H_ +#define ATRACE_PROCESS_DUMP_H_ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#include <memory> +#include <set> +#include <string> + +#include "logging.h" +#include "process_info.h" +#include "time_utils.h" + +// Program that collects processes, thread names, per-process memory stats and +// other minor metrics from /proc filesystem. It's aimed to extend systrace +// with more actionable number to hit performance issues. +class AtraceProcessDump { + public: + enum FullDumpMode { + kDisabled, + kAllProcesses, + kAllJavaApps, + kOnlyWhitelisted, + }; + + AtraceProcessDump(); + ~AtraceProcessDump(); + + void RunAndPrintJson(FILE* stream); + void Stop(); + + void SetDumpInterval(int interval_ms); + + // Negative number or zero means unlimited number of dumps. + void set_dump_count(int count) { dump_count_ = count; } + + void set_full_dump_mode(FullDumpMode mode) { full_dump_mode_ = mode; } + void set_full_dump_whitelist(const std::set<std::string> &whitelist) { + CHECK(full_dump_mode_ == FullDumpMode::kOnlyWhitelisted); + full_dump_whitelist_ = whitelist; + } + void enable_graphics_stats() { graphics_stats_ = true; } + void enable_print_smaps() { print_smaps_ = true; } + + private: + AtraceProcessDump(const AtraceProcessDump&) = delete; + void operator=(const AtraceProcessDump&) = delete; + + using ProcessMap = std::map<int, std::unique_ptr<ProcessInfo>>; + using ProcessSnapshotMap = std::map<int, std::unique_ptr<ProcessSnapshot>>; + + void TakeGlobalSnapshot(); + void TakeAndSerializeMemInfo(); + bool UpdatePersistentProcessInfo(int pid); + bool ShouldTakeFullDump(const ProcessInfo* process); + void SerializeSnapshot(); + void SerializePersistentProcessInfo(); + void Cleanup(); + + int self_pid_; + int dump_count_; + bool graphics_stats_ = false; + bool print_smaps_ = false; + FullDumpMode full_dump_mode_ = FullDumpMode::kDisabled; + std::set<std::string> full_dump_whitelist_; + + FILE* out_; + ProcessMap processes_; + ProcessSnapshotMap snapshot_; + uint64_t snapshot_timestamp_; + std::set<int> full_dump_whitelisted_pids_; + std::unique_ptr<time_utils::PeriodicTimer> snapshot_timer_; + int dump_interval_in_timer_ticks_; +}; + +#endif // ATRACE_PROCESS_DUMP_H_ |