master
h 93 lines 3.9 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #ifndef NETDATA_PERFLIB_H
4 #define NETDATA_PERFLIB_H
5
6 #include "libnetdata/libnetdata.h"
7
8 #if defined(OS_WINDOWS)
9
10 typedef uint32_t DWORD;
11 typedef long long LONGLONG;
12 typedef unsigned long long ULONGLONG;
13 typedef int BOOL;
14
15 struct _PERF_DATA_BLOCK;
16 typedef struct _PERF_DATA_BLOCK PERF_DATA_BLOCK;
17 struct _PERF_OBJECT_TYPE;
18 typedef struct _PERF_OBJECT_TYPE PERF_OBJECT_TYPE;
19 struct _PERF_INSTANCE_DEFINITION;
20 typedef struct _PERF_INSTANCE_DEFINITION PERF_INSTANCE_DEFINITION;
21 struct _PERF_COUNTER_DEFINITION;
22 typedef struct _PERF_COUNTER_DEFINITION PERF_COUNTER_DEFINITION;
23
24 const char *RegistryFindNameByID(DWORD id);
25 const char *RegistryFindHelpByID(DWORD id);
26 DWORD RegistryFindIDByName(const char *name);
27 #define PERFLIB_REGISTRY_NAME_NOT_FOUND (DWORD)-1
28 #define PERFLIB_MAX_NAME_LENGTH 1024
29
30 PERF_DATA_BLOCK *perflibGetPerformanceData(DWORD id);
31 void perflibFreePerformanceData(void);
32 PERF_OBJECT_TYPE *perflibFindObjectTypeByName(PERF_DATA_BLOCK *pDataBlock, const char *name);
33 PERF_INSTANCE_DEFINITION *perflibForEachInstance(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, PERF_INSTANCE_DEFINITION *lastInstance);
34
35 typedef struct _rawdata {
36 DWORD CounterType;
37 DWORD MultiCounterData; // Second raw counter value for multi-valued counters
38 ULONGLONG Data; // Raw counter data
39 LONGLONG Time; // Is a time value or a base value
40 LONGLONG Frequency;
41 } RAW_DATA, *PRAW_DATA;
42
43 typedef struct _counterdata {
44 DWORD id;
45 bool updated;
46 uint8_t failures; // counts the number of failures to find this key
47 const char *key;
48 DWORD OverwriteCounterType; // if set, the counter type will be overwritten once read
49 RAW_DATA current;
50 RAW_DATA previous;
51 } COUNTER_DATA;
52
53 #define PERFLIB_MAX_FAILURES_TO_FIND_METRIC 10
54
55 #define RAW_DATA_EMPTY (RAW_DATA){ 0 }
56
57 bool perflibGetInstanceCounter(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, PERF_INSTANCE_DEFINITION *pInstance, COUNTER_DATA *cd);
58 bool perflibGetObjectCounter(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, COUNTER_DATA *cd);
59
60 typedef bool (*perflib_data_cb)(PERF_DATA_BLOCK *pDataBlock, void *data);
61 typedef bool (*perflib_object_cb)(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, void *data);
62 typedef bool (*perflib_instance_cb)(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, PERF_INSTANCE_DEFINITION *pInstance, void *data);
63 typedef bool (*perflib_instance_counter_cb)(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, PERF_INSTANCE_DEFINITION *pInstance, PERF_COUNTER_DEFINITION *pCounter, RAW_DATA *sample, void *data);
64 typedef bool (*perflib_counter_cb)(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, PERF_COUNTER_DEFINITION *pCounter, RAW_DATA *sample, void *data);
65
66 int perflibQueryAndTraverse(DWORD id,
67 perflib_data_cb dataCb,
68 perflib_object_cb objectCb,
69 perflib_instance_cb instanceCb,
70 perflib_instance_counter_cb instanceCounterCb,
71 perflib_counter_cb counterCb,
72 void *data);
73
74 BOOL ObjectTypeHasInstances(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType);
75
76 BOOL getInstanceName(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, PERF_INSTANCE_DEFINITION *pInstance,
77 char *buffer, size_t bufferLen);
78
79 BOOL getSystemName(PERF_DATA_BLOCK *pDataBlock, char *buffer, size_t bufferLen);
80
81 PERF_OBJECT_TYPE *getObjectTypeByIndex(PERF_DATA_BLOCK *pDataBlock, DWORD ObjectNameTitleIndex);
82
83 PERF_INSTANCE_DEFINITION *getInstanceByPosition(
84 PERF_DATA_BLOCK *pDataBlock,
85 PERF_OBJECT_TYPE *pObjectType,
86 DWORD instancePosition);
87
88 void PerflibNamesRegistryInitialize(void);
89 void PerflibNamesRegistryUpdate(void);
90 void PerflibNamesRegistryCleanup(void);
91
92 #endif // OS_WINDOWS
93 #endif //NETDATA_PERFLIB_H