summaryrefslogtreecommitdiffstats
path: root/machine.h
blob: a703242ca3acfb0d5b87178b10164608d35aeb1f (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
/*
 *	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
 *	Portions Copyright (c) 2013 VMware, Inc. All Rights Reserved.
 */

#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. */
#define MODE_PROCESSES 0
#define MODE_IO_STATS 3

/* Display modes for table and index statistics. */
#define STATS_DIFF 0
#define STATS_CUMULATIVE 1

/* 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 *);
#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 *);
char	   *format_next_io(caddr_t);
char	   *format_next_process(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[];

#endif   /* _MACHINE_H_ */