xref: /aosp_15_r20/external/bcc/examples/cpp/pyperf/PyPerfUtil.h (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker /*
2*387f9dfdSAndroid Build Coastguard Worker  * Copyright (c) Facebook, Inc.
3*387f9dfdSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License")
4*387f9dfdSAndroid Build Coastguard Worker  */
5*387f9dfdSAndroid Build Coastguard Worker 
6*387f9dfdSAndroid Build Coastguard Worker #pragma once
7*387f9dfdSAndroid Build Coastguard Worker 
8*387f9dfdSAndroid Build Coastguard Worker #include <string>
9*387f9dfdSAndroid Build Coastguard Worker #include <unordered_map>
10*387f9dfdSAndroid Build Coastguard Worker #include <vector>
11*387f9dfdSAndroid Build Coastguard Worker 
12*387f9dfdSAndroid Build Coastguard Worker #include <linux/perf_event.h>
13*387f9dfdSAndroid Build Coastguard Worker #include <sys/types.h>
14*387f9dfdSAndroid Build Coastguard Worker 
15*387f9dfdSAndroid Build Coastguard Worker #include "BPF.h"
16*387f9dfdSAndroid Build Coastguard Worker #include "PyPerfSampleProcessor.h"
17*387f9dfdSAndroid Build Coastguard Worker #include "PyPerfType.h"
18*387f9dfdSAndroid Build Coastguard Worker 
19*387f9dfdSAndroid Build Coastguard Worker namespace ebpf {
20*387f9dfdSAndroid Build Coastguard Worker namespace pyperf {
21*387f9dfdSAndroid Build Coastguard Worker 
22*387f9dfdSAndroid Build Coastguard Worker class PyPerfUtil {
23*387f9dfdSAndroid Build Coastguard Worker  public:
24*387f9dfdSAndroid Build Coastguard Worker   enum class PyPerfResult : int {
25*387f9dfdSAndroid Build Coastguard Worker     SUCCESS = 0,
26*387f9dfdSAndroid Build Coastguard Worker     INIT_FAIL,
27*387f9dfdSAndroid Build Coastguard Worker     PERF_BUF_OPEN_FAIL,
28*387f9dfdSAndroid Build Coastguard Worker     NO_INIT,
29*387f9dfdSAndroid Build Coastguard Worker     EVENT_ATTACH_FAIL,
30*387f9dfdSAndroid Build Coastguard Worker     EVENT_DETACH_FAIL
31*387f9dfdSAndroid Build Coastguard Worker   };
32*387f9dfdSAndroid Build Coastguard Worker 
33*387f9dfdSAndroid Build Coastguard Worker   // init must be invoked exactly once before invoking profile
34*387f9dfdSAndroid Build Coastguard Worker   PyPerfResult init();
35*387f9dfdSAndroid Build Coastguard Worker 
36*387f9dfdSAndroid Build Coastguard Worker   PyPerfResult profile(int64_t sampleRate, int64_t durationMs,
37*387f9dfdSAndroid Build Coastguard Worker                        PyPerfSampleProcessor* processor);
38*387f9dfdSAndroid Build Coastguard Worker 
39*387f9dfdSAndroid Build Coastguard Worker   std::unordered_map<int32_t, std::string> getSymbolMapping();
40*387f9dfdSAndroid Build Coastguard Worker 
getTotalSamples()41*387f9dfdSAndroid Build Coastguard Worker   uint32_t getTotalSamples() const { return totalSamples_; }
42*387f9dfdSAndroid Build Coastguard Worker 
getLostSamples()43*387f9dfdSAndroid Build Coastguard Worker   uint32_t getLostSamples() const { return lostSamples_; }
44*387f9dfdSAndroid Build Coastguard Worker 
45*387f9dfdSAndroid Build Coastguard Worker  private:
46*387f9dfdSAndroid Build Coastguard Worker   uint32_t totalSamples_ = 0, lostSamples_ = 0;
47*387f9dfdSAndroid Build Coastguard Worker 
48*387f9dfdSAndroid Build Coastguard Worker   ebpf::BPF bpf_{0, nullptr, false, "", true};
49*387f9dfdSAndroid Build Coastguard Worker   std::vector<PyPerfSample> samples_;
50*387f9dfdSAndroid Build Coastguard Worker   bool initCompleted_{false};
51*387f9dfdSAndroid Build Coastguard Worker 
52*387f9dfdSAndroid Build Coastguard Worker   void handleSample(const void* data, int dataSize);
53*387f9dfdSAndroid Build Coastguard Worker   void handleLostSamples(int lostCnt);
54*387f9dfdSAndroid Build Coastguard Worker   friend void handleLostSamplesCallback(void*, uint64_t);
55*387f9dfdSAndroid Build Coastguard Worker   friend void handleSampleCallback(void*, void*, int);
56*387f9dfdSAndroid Build Coastguard Worker 
57*387f9dfdSAndroid Build Coastguard Worker   std::string getSymbolName(Symbol& sym) const;
58*387f9dfdSAndroid Build Coastguard Worker 
59*387f9dfdSAndroid Build Coastguard Worker   bool tryTargetPid(int pid, PidData& data);
60*387f9dfdSAndroid Build Coastguard Worker };
61*387f9dfdSAndroid Build Coastguard Worker }  // namespace pyperf
62*387f9dfdSAndroid Build Coastguard Worker }  // namespace ebpf
63