summaryrefslogtreecommitdiffstats
path: root/machine.h
blob: dbee31d05d1a659777da2432cb4d63f88b2d3226 (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
/*
 *	This file defines the interface between top and the machine-dependent
 *	module.  It is NOT machine dependent and should not need to be changed
 *	for any specific machine.
 *
 *	Copyright (c) 2007-2019, Mark Wong
 */

#ifndef _MACHINE_H_
#define _MACHINE_H_

#include <time.h>
#include <sys/types.h>

#include "pg.h"
#include "pg_config_manual.h"

/*
#ifdef CLK_TCK
#	define HZ CLK_TCK
# else
#	define HZ 60
# endif
*/

#ifndef HZ
#define HZ sysconf(_SC_CLK_TCK)
#endif

/* Display modes. */

enum DisplayMode
{
	MODE_PROCESSES,
	MODE_IO_STATS,
	MODE_REPLICATION,
	MODE_TYPES					/* number of modes */
};

/* Maximum number of columns allowed for display */
#define MAX_COLS	255

/*
 * The entire display is based on these next numbers being defined as is.
 */

#define NUM_AVERAGES	3

#define NPROCSTATES 7

/*
 * The statics struct is filled in by machine_init.  Fields marked as
 * "optional" are not filled in by every module.
 */
struct statics
{
	char	  **procstate_names;
	char	  **cpustate_names;
	char	  **memory_names;
	char	  **swap_names;		/* optional */
	char	  **order_names;	/* optional */
	char	  **color_names;	/* optional */
	time_t		boottime;		/* optional */
	int			ncpus;
	struct
	{
		unsigned int fullcmds:1;
		unsigned int idle:1;
		unsigned int warmup:1;
	}			flags;
};

/*
 * the system_info struct is filled in by a machine dependent routine.
 */

#ifdef p_active					/* uw7 define macro p_active */
#define P_ACTIVE p_pactive
#else
#define P_ACTIVE p_active
#endif

struct system_info
{
	int			last_pid;
	double		load_avg[NUM_AVERAGES];
	int			p_total;
	int			P_ACTIVE;		/* number of procs considered "active" */
	int		   *procstates;
	int64_t    *cpustates;
	long	   *memory;
	long	   *swap;
};

/* cpu_states is an array of percentages * 10.	For example,
   the (integer) value 105 is 10.5% (or .105).
 */

/*
 * Database activity information
 */
struct db_info {
	int numDb;
	int64_t numXact;
	int64_t numRollback;
	int64_t numBlockRead;
	int64_t numBlockHit;
	int64_t numTupleFetched;
	int64_t numTupleAltered;
	int64_t numConflict;
};

/*
 * Info on reads/writes happening on disk.
 * On Linux, this can be obtained from /proc/diskstats.
 */
struct io_info {
	int64_t reads;
	int64_t readsectors;
	int64_t writes;
	int64_t writesectors;
};

/*
 * the process_select struct tells get_process_info what processes we
 * are interested in seeing
 */

struct process_select
{
	int			idle;			/* show idle processes */
	int			fullcmd;		/* show full command */
	char	   *command;		/* only this command (unless == NULL) */
	char		usename[NAMEDATALEN + 1];	/* only this postgres usename */
};

/* routines defined by the machine dependent module */
int			machine_init(struct statics *);
void		get_system_info(struct system_info *);
caddr_t		get_process_info(struct system_info *, struct process_select *, int,
							 struct pg_conninfo_ctx *, int);
#ifdef __linux__
caddr_t get_process_info(struct system_info *, struct process_select *, int,
				 struct pg_conninfo_ctx *, int);
#else
caddr_t get_process_info(struct system_info *, struct process_select *, int,
				 char *);
#endif /* __linux__ */
void		get_database_info(struct db_info *, struct pg_conninfo_ctx *);
void		get_io_info(struct io_info *);
char	   *format_header(char *);
#if defined(__linux__) || defined (__FreeBSD__)
char	   *format_next_io(caddr_t);
#endif /* defined(__linux__) || defined (__FreeBSD__) */
char	   *format_next_process(caddr_t);
char	   *format_next_replication(caddr_t);
uid_t		proc_owner(pid_t);
void		update_state(int *pgstate, char *state);
void		update_str(char **, char *);

extern int	mode_stats;

extern char *backendstatenames[];
extern char *procstatenames[];
extern char fmt_header_io[];
extern char fmt_header_replication[];

#endif							/* _MACHINE_H_ */