master
c 75 lines 2.39 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "windows_plugin.h"
4 #include "windows-internals.h"
5
6 #define _COMMON_PLUGIN_NAME "windows.plugin"
7 #define _COMMON_PLUGIN_MODULE_NAME "PerflibObjects"
8 #include "../common-contexts/common-contexts.h"
9
10 static void initialize(void)
11 {
12 ;
13 }
14
15 static bool do_objects(PERF_DATA_BLOCK *pDataBlock, int update_every)
16 {
17 PERF_OBJECT_TYPE *pObjectType = perflibFindObjectTypeByName(pDataBlock, "Objects");
18 if (!pObjectType)
19 return false;
20
21 static COUNTER_DATA semaphores = {.key = "Semaphores"};
22 static COUNTER_DATA mutexes = {.key = "Mutexes"};
23
24 if (perflibGetObjectCounter(pDataBlock, pObjectType, &semaphores)) {
25 ULONGLONG sem = (ULONGLONG)semaphores.current.Data;
26 common_semaphore_ipc(sem, (NETDATA_DOUBLE)WINDOWS_MAX_KERNEL_OBJECT, _COMMON_PLUGIN_MODULE_NAME, update_every);
27 }
28
29 if (perflibGetObjectCounter(pDataBlock, pObjectType, &mutexes)) {
30 static RRDSET *st = NULL;
31 static RRDDIM *rd = NULL;
32 if (unlikely(!st)) {
33 st = rrdset_create_localhost("system",
34 "ipc_mutexes",
35 NULL,
36 "ipc",
37 "system.ipc_mutexes",
38 "IPC Mutexes",
39 "mutexes",
40 _COMMON_PLUGIN_NAME,
41 _COMMON_PLUGIN_MODULE_NAME,
42 NETDATA_CHART_PRIO_SYSTEM_IPC_SEMAPHORES + 1,
43 update_every,
44 RRDSET_TYPE_AREA);
45 rd = rrddim_add(st, "mutexes", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
46 }
47 rrddim_set_by_pointer(st, rd, (collected_number)mutexes.current.Data);
48 rrdset_done(st);
49 }
50
51 return true;
52 }
53
54 int do_PerflibObjects(int update_every, usec_t dt __maybe_unused)
55 {
56 static bool initialized = false;
57
58 if (unlikely(!initialized)) {
59 initialize();
60 initialized = true;
61 }
62
63 DWORD id = RegistryFindIDByName("Objects");
64 if (id == PERFLIB_REGISTRY_NAME_NOT_FOUND)
65 return -1;
66
67 PERF_DATA_BLOCK *pDataBlock = perflibGetPerformanceData(id);
68 if (!pDataBlock)
69 return -1;
70
71 if (!do_objects(pDataBlock, update_every))
72 return -1;
73
74 return 0;
75 }