bootchart: kill a bunch of global variables
This code is in a confusingly bad shape. Kill a bunch of global variables and pass needed variables around in function calls.
This commit is contained in:
+37
-18
@@ -58,14 +58,6 @@
|
|||||||
#include "bootchart.h"
|
#include "bootchart.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
|
|
||||||
double graph_start;
|
|
||||||
double log_start;
|
|
||||||
struct ps_struct *ps_first;
|
|
||||||
int pscount;
|
|
||||||
int cpus;
|
|
||||||
double interval;
|
|
||||||
FILE *of = NULL;
|
|
||||||
int overrun = 0;
|
|
||||||
static int exiting = 0;
|
static int exiting = 0;
|
||||||
|
|
||||||
#define DEFAULT_SAMPLES_LEN 500
|
#define DEFAULT_SAMPLES_LEN 500
|
||||||
@@ -77,20 +69,17 @@ static int exiting = 0;
|
|||||||
|
|
||||||
/* graph defaults */
|
/* graph defaults */
|
||||||
bool arg_entropy = false;
|
bool arg_entropy = false;
|
||||||
bool initcall = true;
|
bool arg_initcall = true;
|
||||||
bool arg_relative = false;
|
bool arg_relative = false;
|
||||||
bool arg_filter = true;
|
bool arg_filter = true;
|
||||||
bool arg_show_cmdline = false;
|
bool arg_show_cmdline = false;
|
||||||
bool arg_show_cgroup = false;
|
bool arg_show_cgroup = false;
|
||||||
bool arg_pss = false;
|
bool arg_pss = false;
|
||||||
bool arg_percpu = false;
|
bool arg_percpu = false;
|
||||||
int samples;
|
|
||||||
int arg_samples_len = DEFAULT_SAMPLES_LEN; /* we record len+1 (1 start sample) */
|
int arg_samples_len = DEFAULT_SAMPLES_LEN; /* we record len+1 (1 start sample) */
|
||||||
double arg_hz = DEFAULT_HZ;
|
double arg_hz = DEFAULT_HZ;
|
||||||
double arg_scale_x = DEFAULT_SCALE_X;
|
double arg_scale_x = DEFAULT_SCALE_X;
|
||||||
double arg_scale_y = DEFAULT_SCALE_Y;
|
double arg_scale_y = DEFAULT_SCALE_Y;
|
||||||
static struct list_sample_data *sampledata;
|
|
||||||
struct list_sample_data *head;
|
|
||||||
|
|
||||||
char arg_init_path[PATH_MAX] = DEFAULT_INIT;
|
char arg_init_path[PATH_MAX] = DEFAULT_INIT;
|
||||||
char arg_output_path[PATH_MAX] = DEFAULT_OUTPUT;
|
char arg_output_path[PATH_MAX] = DEFAULT_OUTPUT;
|
||||||
@@ -315,6 +304,11 @@ int main(int argc, char *argv[]) {
|
|||||||
_cleanup_free_ char *build = NULL;
|
_cleanup_free_ char *build = NULL;
|
||||||
_cleanup_close_ int sysfd = -1;
|
_cleanup_close_ int sysfd = -1;
|
||||||
_cleanup_closedir_ DIR *proc = NULL;
|
_cleanup_closedir_ DIR *proc = NULL;
|
||||||
|
_cleanup_fclose_ FILE *of = NULL;
|
||||||
|
double graph_start;
|
||||||
|
double log_start;
|
||||||
|
double interval;
|
||||||
|
struct ps_struct *ps_first;
|
||||||
struct sigaction sig = {
|
struct sigaction sig = {
|
||||||
.sa_handler = signal_handler,
|
.sa_handler = signal_handler,
|
||||||
};
|
};
|
||||||
@@ -323,7 +317,13 @@ int main(int argc, char *argv[]) {
|
|||||||
char datestr[200];
|
char datestr[200];
|
||||||
time_t t = 0;
|
time_t t = 0;
|
||||||
int r;
|
int r;
|
||||||
|
int pscount = 0;
|
||||||
|
int n_cpus = 0;
|
||||||
|
int overrun = 0;
|
||||||
|
int samples;
|
||||||
struct rlimit rlim;
|
struct rlimit rlim;
|
||||||
|
struct list_sample_data *head;
|
||||||
|
static struct list_sample_data *sampledata;
|
||||||
|
|
||||||
parse_conf();
|
parse_conf();
|
||||||
|
|
||||||
@@ -364,7 +364,18 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
interval = (1.0 / arg_hz) * 1000000000.0;
|
interval = (1.0 / arg_hz) * 1000000000.0;
|
||||||
|
|
||||||
log_uptime();
|
if (arg_relative)
|
||||||
|
graph_start = log_start = gettime_ns();
|
||||||
|
else {
|
||||||
|
struct timespec n;
|
||||||
|
double uptime;
|
||||||
|
|
||||||
|
clock_gettime(CLOCK_BOOTTIME, &n);
|
||||||
|
uptime = (n.tv_sec + (n.tv_nsec / (double) NSEC_PER_SEC));
|
||||||
|
|
||||||
|
log_start = gettime_ns();
|
||||||
|
graph_start = log_start - uptime;
|
||||||
|
}
|
||||||
|
|
||||||
if (graph_start < 0.0) {
|
if (graph_start < 0.0) {
|
||||||
log_error("Failed to setup graph start time.\n\n"
|
log_error("Failed to setup graph start time.\n\n"
|
||||||
@@ -409,7 +420,7 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
/* wait for /proc to become available, discarding samples */
|
/* wait for /proc to become available, discarding samples */
|
||||||
if (proc) {
|
if (proc) {
|
||||||
r = log_sample(proc, samples, &sampledata);
|
r = log_sample(proc, samples, ps_first, &sampledata, &pscount, &n_cpus);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
@@ -475,7 +486,18 @@ int main(int argc, char *argv[]) {
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = svg_do(strna(build));
|
r = svg_do(of,
|
||||||
|
strna(build),
|
||||||
|
head,
|
||||||
|
ps_first,
|
||||||
|
samples,
|
||||||
|
pscount,
|
||||||
|
n_cpus,
|
||||||
|
graph_start,
|
||||||
|
log_start,
|
||||||
|
interval,
|
||||||
|
overrun);
|
||||||
|
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
log_error_errno(r, "Error generating svg file: %m\n");
|
log_error_errno(r, "Error generating svg file: %m\n");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
@@ -485,9 +507,6 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
do_journal_append(output_file);
|
do_journal_append(output_file);
|
||||||
|
|
||||||
if (of)
|
|
||||||
fclose(of);
|
|
||||||
|
|
||||||
/* nitpic cleanups */
|
/* nitpic cleanups */
|
||||||
ps = ps_first->next_ps;
|
ps = ps_first->next_ps;
|
||||||
while (ps->next_ps) {
|
while (ps->next_ps) {
|
||||||
|
|||||||
@@ -103,14 +103,6 @@ struct ps_struct {
|
|||||||
struct ps_sched_struct *sample;
|
struct ps_sched_struct *sample;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int entropy_avail[];
|
|
||||||
|
|
||||||
extern double graph_start;
|
|
||||||
extern double log_start;
|
|
||||||
extern double sampletime[];
|
|
||||||
extern struct ps_struct *ps_first;
|
|
||||||
extern struct block_stat_struct blockstat[];
|
|
||||||
extern int pscount;
|
|
||||||
extern bool arg_relative;
|
extern bool arg_relative;
|
||||||
extern bool arg_filter;
|
extern bool arg_filter;
|
||||||
extern bool arg_show_cmdline;
|
extern bool arg_show_cmdline;
|
||||||
@@ -118,17 +110,11 @@ extern bool arg_show_cgroup;
|
|||||||
extern bool arg_pss;
|
extern bool arg_pss;
|
||||||
extern bool arg_entropy;
|
extern bool arg_entropy;
|
||||||
extern bool arg_percpu;
|
extern bool arg_percpu;
|
||||||
extern bool initcall;
|
extern bool arg_initcall;
|
||||||
extern int samples;
|
extern int arg_samples_len;
|
||||||
extern int cpus;
|
|
||||||
extern int arg_samples_len;
|
|
||||||
extern double arg_hz;
|
extern double arg_hz;
|
||||||
extern double arg_scale_x;
|
extern double arg_scale_x;
|
||||||
extern double arg_scale_y;
|
extern double arg_scale_y;
|
||||||
extern int overrun;
|
|
||||||
extern double interval;
|
|
||||||
|
|
||||||
extern char arg_output_path[PATH_MAX];
|
extern char arg_output_path[PATH_MAX];
|
||||||
extern char arg_init_path[PATH_MAX];
|
extern char arg_init_path[PATH_MAX];
|
||||||
|
|
||||||
extern FILE *of;
|
|
||||||
|
|||||||
+11
-23
@@ -54,24 +54,6 @@ double gettime_ns(void) {
|
|||||||
return (n.tv_sec + (n.tv_nsec / (double) NSEC_PER_SEC));
|
return (n.tv_sec + (n.tv_nsec / (double) NSEC_PER_SEC));
|
||||||
}
|
}
|
||||||
|
|
||||||
static double gettime_up(void) {
|
|
||||||
struct timespec n;
|
|
||||||
|
|
||||||
clock_gettime(CLOCK_BOOTTIME, &n);
|
|
||||||
return (n.tv_sec + (n.tv_nsec / (double) NSEC_PER_SEC));
|
|
||||||
}
|
|
||||||
|
|
||||||
void log_uptime(void) {
|
|
||||||
if (arg_relative)
|
|
||||||
graph_start = log_start = gettime_ns();
|
|
||||||
else {
|
|
||||||
double uptime = gettime_up();
|
|
||||||
|
|
||||||
log_start = gettime_ns();
|
|
||||||
graph_start = log_start - uptime;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *bufgetline(char *buf) {
|
static char *bufgetline(char *buf) {
|
||||||
char *c;
|
char *c;
|
||||||
|
|
||||||
@@ -105,7 +87,13 @@ static int pid_cmdline_strscpy(int procfd, char *buffer, size_t buf_len, int pid
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int log_sample(DIR *proc, int sample, struct list_sample_data **ptr) {
|
int log_sample(DIR *proc,
|
||||||
|
int sample,
|
||||||
|
struct ps_struct *ps_first,
|
||||||
|
struct list_sample_data **ptr,
|
||||||
|
int *pscount,
|
||||||
|
int *cpus) {
|
||||||
|
|
||||||
static int vmstat = -1;
|
static int vmstat = -1;
|
||||||
static int schedstat = -1;
|
static int schedstat = -1;
|
||||||
char buf[4096];
|
char buf[4096];
|
||||||
@@ -195,8 +183,8 @@ vmstat_next:
|
|||||||
sampledata->runtime[c] = atoll(rt);
|
sampledata->runtime[c] = atoll(rt);
|
||||||
sampledata->waittime[c] = atoll(wt);
|
sampledata->waittime[c] = atoll(wt);
|
||||||
|
|
||||||
if (c == cpus)
|
if (c == *cpus)
|
||||||
cpus = c + 1;
|
*cpus = c + 1;
|
||||||
}
|
}
|
||||||
schedstat_next:
|
schedstat_next:
|
||||||
m = bufgetline(m);
|
m = bufgetline(m);
|
||||||
@@ -263,7 +251,7 @@ schedstat_next:
|
|||||||
|
|
||||||
ps->sample->sampledata = sampledata;
|
ps->sample->sampledata = sampledata;
|
||||||
|
|
||||||
pscount++;
|
(*pscount)++;
|
||||||
|
|
||||||
/* mark our first sample */
|
/* mark our first sample */
|
||||||
ps->first = ps->last = ps->sample;
|
ps->first = ps->last = ps->sample;
|
||||||
@@ -480,7 +468,7 @@ schedstat_next:
|
|||||||
catch_rename:
|
catch_rename:
|
||||||
/* catch process rename, try to randomize time */
|
/* catch process rename, try to randomize time */
|
||||||
mod = (arg_hz < 4.0) ? 4.0 : (arg_hz / 4.0);
|
mod = (arg_hz < 4.0) ? 4.0 : (arg_hz / 4.0);
|
||||||
if (((samples - ps->pid) + pid) % (int)(mod) == 0) {
|
if (((sample - ps->pid) + pid) % (int)(mod) == 0) {
|
||||||
|
|
||||||
/* re-fetch name */
|
/* re-fetch name */
|
||||||
/* get name, start time */
|
/* get name, start time */
|
||||||
|
|||||||
@@ -29,4 +29,9 @@
|
|||||||
|
|
||||||
double gettime_ns(void);
|
double gettime_ns(void);
|
||||||
void log_uptime(void);
|
void log_uptime(void);
|
||||||
int log_sample(DIR *proc, int sample, struct list_sample_data **ptr);
|
int log_sample(DIR *proc,
|
||||||
|
int sample,
|
||||||
|
struct ps_struct *ps_first,
|
||||||
|
struct list_sample_data **ptr,
|
||||||
|
int *pscount,
|
||||||
|
int *cpus);
|
||||||
|
|||||||
+326
-318
File diff suppressed because it is too large
Load Diff
+11
-1
@@ -24,4 +24,14 @@
|
|||||||
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
***/
|
***/
|
||||||
|
|
||||||
int svg_do(const char *build);
|
int svg_do(FILE *of,
|
||||||
|
const char *build,
|
||||||
|
struct list_sample_data *head,
|
||||||
|
struct ps_struct *ps_first,
|
||||||
|
int n_samples,
|
||||||
|
int pscount,
|
||||||
|
int n_cpus,
|
||||||
|
double graph_start,
|
||||||
|
double log_start,
|
||||||
|
double interval,
|
||||||
|
int overrun);
|
||||||
|
|||||||
Reference in New Issue
Block a user