| 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 |