blob: a01f1277c9f952c80270a41c71f4d255c2d425ea (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef TOOLS_PROFILERCPUFREQ_H_
#define TOOLS_PROFILERCPUFREQ_H_
#include "PlatformMacros.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/Vector.h"
#if defined(GP_OS_windows) || defined(GP_OS_linux) || defined(GP_OS_android)
# define HAVE_CPU_FREQ_SUPPORT
#endif
#if defined(GP_OS_windows)
# include <windows.h>
struct CPUCounterInfo {
ULONGLONG data = 0;
DWORD base = 0;
uint32_t freq = 0;
DWORD nominalFrequency = 0;
};
#endif
#if defined(GP_OS_linux) || defined(GP_OS_android)
struct CPUCounterInfo {
int fd = 0;
};
#endif
class ProfilerCPUFreq {
public:
#if defined(HAVE_CPU_FREQ_SUPPORT)
explicit ProfilerCPUFreq();
~ProfilerCPUFreq();
# if defined(GP_OS_windows)
void Sample();
uint32_t GetCPUSpeedMHz(unsigned cpuId) {
MOZ_ASSERT(cpuId < mCPUCounters.length());
return mCPUCounters[cpuId].freq;
}
# else
void Sample() {}
uint32_t GetCPUSpeedMHz(unsigned cpuId);
# endif
#else
explicit ProfilerCPUFreq(){};
~ProfilerCPUFreq(){};
void Sample(){};
#endif
private:
#if defined(HAVE_CPU_FREQ_SUPPORT)
# if defined(GP_OS_windows)
LPWSTR mBlockIndex = nullptr;
DWORD mCounterNameIndex = 0;
// The size of the counter block is about 8kB for a machine with 20 cores,
// so 32kB should be plenty.
DWORD mBufferSize = 32768;
LPBYTE mBuffer = nullptr;
# endif
mozilla::Vector<CPUCounterInfo> mCPUCounters;
#endif
};
#endif /* ndef TOOLS_PROFILERCPUFREQ_H_ */
|