libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
cpumonitor.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
13#include <functional>
14
15#include <promeki/function.h>
16#include <promeki/atomic.h>
17#include <promeki/duration.h>
18#include <promeki/list.h>
19#include <promeki/mutex.h>
20#include <promeki/namespace.h>
21#include <promeki/string.h>
22#include <promeki/thread.h>
23#include <promeki/threadpool.h>
24
25PROMEKI_NAMESPACE_BEGIN
26
74class CpuMonitor : public Thread {
75 public:
86 struct ThreadSample {
87 uint64_t tid = 0;
88 String name;
89 double userPercent = 0.0;
90 double systemPercent = 0.0;
91 double totalPercent = 0.0;
92 Duration cpuTimeDelta;
93 };
94
105 struct Report {
106 Duration wallElapsed;
107 double processPercent = 0.0;
108 List<ThreadSample> threads;
109 };
110
125 using ReportFunction = Function<void(const Report &)>;
126
128 static constexpr int64_t DefaultIntervalSec = 5;
129
133 static constexpr size_t DefaultTopN = 8;
134
141 CpuMonitor();
142
144 ~CpuMonitor() override;
145
146 CpuMonitor(const CpuMonitor &) = delete;
147 CpuMonitor &operator=(const CpuMonitor &) = delete;
148
166 Error start(const Duration &interval);
167
177 void stop();
178
180 bool isRunning() const { return Thread::isRunning(); }
181
192 void setInterval(const Duration &d);
193
195 Duration interval() const;
196
207 void setReportFunction(ReportFunction fn);
208
225 static String formatReport(const Report &r, size_t topN = DefaultTopN);
226
246 void setPoolReportEnabled(bool enabled);
247
249 bool isPoolReportEnabled() const;
250
264 static String formatPoolReport(const String &poolName, const Duration &wallElapsed,
265 const List<ThreadPool::WorkStats> &stats,
266 size_t topN = DefaultTopN);
267
268 protected:
269 void run() override;
270
271 private:
272 struct ThreadCpuTimes {
273 uint64_t tid = 0;
274 String name;
275 int64_t utimeTicks = 0;
276 int64_t stimeTicks = 0;
277 };
278
285 List<ThreadCpuTimes> readThreadCpuTimes() const;
286
287 Atomic<int64_t> _intervalNs;
288 Atomic<bool> _stopRequested;
289 Atomic<bool> _poolReportEnabled;
290 mutable Mutex _fnMutex;
291 ReportFunction _reportFn;
292};
293
294PROMEKI_NAMESPACE_END
295
296#endif // PROMEKI_ENABLE_CORE