summaryrefslogtreecommitdiffstats
path: root/pcp/Platform.h
blob: f43ed54f2f1df243ab25e26da0738e6bcdf72b3d (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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#ifndef HEADER_Platform
#define HEADER_Platform
/*
htop - pcp/Platform.h
(C) 2014 Hisham H. Muhammad
(C) 2020-2021 htop dev team
(C) 2020-2021 Red Hat, Inc.  All Rights Reserved.
Released under the GNU GPLv2+, see the COPYING file
in the source distribution for its full text.
*/

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <pcp/pmapi.h>
#include <sys/time.h>
#include <sys/types.h>

/* use htop config.h values for these macros, not pcp values */
#undef PACKAGE_URL
#undef PACKAGE_NAME
#undef PACKAGE_STRING
#undef PACKAGE_TARNAME
#undef PACKAGE_VERSION
#undef PACKAGE_BUGREPORT

#include "Action.h"
#include "BatteryMeter.h"
#include "DiskIOMeter.h"
#include "Hashtable.h"
#include "Meter.h"
#include "NetworkIOMeter.h"
#include "Process.h"
#include "ProcessLocksScreen.h"
#include "RichString.h"
#include "SignalsPanel.h"
#include "CommandLine.h"

#include "pcp/Metric.h"
#include "pcp/PCPDynamicColumn.h"
#include "pcp/PCPDynamicMeter.h"
#include "pcp/PCPDynamicScreen.h"


typedef struct Platform_ {
   int context;               /* PMAPI(3) context identifier */
   size_t totalMetrics;       /* total number of all metrics */
   const char** names;        /* name array indexed by Metric */
   pmID* pmids;               /* all known metric identifiers */
   pmID* fetch;               /* enabled identifiers for sampling */
   pmDesc* descs;             /* metric desc array indexed by Metric */
   pmResult* result;          /* sample values result indexed by Metric */
   PCPDynamicMeters meters;   /* dynamic meters via configuration files */
   PCPDynamicColumns columns; /* dynamic columns via configuration files */
   PCPDynamicScreens screens; /* dynamic screens via configuration files */
   struct timeval offset;     /* time offset used in archive mode only */
   long long btime;           /* boottime in seconds since the epoch */
   char* release;             /* uname and distro from this context */
   int pidmax;                /* maximum platform process identifier */
   unsigned int ncpu;         /* maximum processor count configured */
} Platform;

extern const ScreenDefaults Platform_defaultScreens[];

extern const unsigned int Platform_numberOfDefaultScreens;

extern const SignalItem Platform_signals[];

extern const unsigned int Platform_numberOfSignals;

extern const MeterClass* const Platform_meterTypes[];

bool Platform_init(void);

void Platform_done(void);

void Platform_setBindings(Htop_Action* keys);

int Platform_getUptime(void);

void Platform_getLoadAverage(double* one, double* five, double* fifteen);

long long Platform_getBootTime(void);

unsigned int Platform_getMaxCPU(void);

pid_t Platform_getMaxPid(void);

double Platform_setCPUValues(Meter* this, int cpu);

void Platform_setMemoryValues(Meter* this);

void Platform_setSwapValues(Meter* this);

void Platform_setZramValues(Meter* this);

void Platform_setZfsArcValues(Meter* this);

void Platform_setZfsCompressedArcValues(Meter* this);

char* Platform_getProcessEnv(pid_t pid);

FileLocks_ProcessData* Platform_getProcessLocks(pid_t pid);

void Platform_getPressureStall(const char* file, bool some, double* ten, double* sixty, double* threehundred);

bool Platform_getDiskIO(DiskIOData* data);

bool Platform_getNetworkIO(NetworkIOData* data);

void Platform_getBattery(double* percent, ACPresence* isOnAC);

void Platform_getHostname(char* buffer, size_t size);

void Platform_getRelease(char** string);

enum {
   PLATFORM_LONGOPT_HOST = 128,
   PLATFORM_LONGOPT_TIMEZONE,
   PLATFORM_LONGOPT_HOSTZONE,
};

#define PLATFORM_LONG_OPTIONS \
      {PMLONGOPT_HOST, optional_argument, 0, PLATFORM_LONGOPT_HOST}, \
      {PMLONGOPT_TIMEZONE, optional_argument, 0, PLATFORM_LONGOPT_TIMEZONE}, \
      {PMLONGOPT_HOSTZONE, optional_argument, 0, PLATFORM_LONGOPT_HOSTZONE}, \

void Platform_longOptionsUsage(const char* name);

CommandLineStatus Platform_getLongOption(int opt, int argc, char** argv);

extern pmOptions opts;

size_t Platform_addMetric(Metric id, const char* name);

void Platform_getFileDescriptors(double* used, double* max);

void Platform_gettime_realtime(struct timeval* tv, uint64_t* msec);

void Platform_gettime_monotonic(uint64_t* msec);

Hashtable* Platform_dynamicMeters(void);

void Platform_dynamicMetersDone(Hashtable* meters);

void Platform_dynamicMeterInit(Meter* meter);

void Platform_dynamicMeterUpdateValues(Meter* meter);

void Platform_dynamicMeterDisplay(const Meter* meter, RichString* out);

Hashtable* Platform_dynamicColumns(void);

void Platform_dynamicColumnsDone(Hashtable* columns);

const char* Platform_dynamicColumnName(unsigned int key);

bool Platform_dynamicColumnWriteField(const Process* proc, RichString* str, unsigned int key);

Hashtable* Platform_dynamicScreens(void);

void Platform_defaultDynamicScreens(Settings* settings);

void Platform_addDynamicScreen(ScreenSettings* ss);

void Platform_addDynamicScreenAvailableColumns(Panel* availableColumns, const char* screen);

void Platform_dynamicScreensDone(Hashtable* screens);

void Platform_updateTables(Machine* host);

#endif