#include "ttyutils.h"
#include "xalloc.h"
-#define DEF_SORT_FUNC sort_total
#define IRQ_INFO_LEN 64
#define MAX_EVENTS 3
typedef int (sort_fp)(const struct irq_info *, const struct irq_info *);
+#define DEF_SORT_FUNC ((sort_fp *)sort_total)
+
+struct irq_output {
+ int columns[ARRAY_SIZE(infos) * 2];
+ size_t ncolumns;
+
+ sort_fp *sort_func;
+
+ unsigned int
+ json:1,
+ no_headings:1;
+};
+
struct irqtop_ctl {
int cols;
int rows;
struct itimerspec timer;
- sort_fp *sort_func;
struct irq_stat *prev_stat;
char *hostname;
- /* make a space for repeating columns like we support in another tools (-o +FOO) */
- int columns[ARRAY_SIZE(infos) * 2];
- size_t ncolumns;
-
unsigned int
- json:1,
- no_headings:1,
request_exit:1,
run_once:1;
+
};
static int column_name_to_id(char const *const name, size_t const namesz)
return -1;
}
-static inline int get_column_id(struct irqtop_ctl const *const ctl, size_t const num)
+static inline int get_column_id(struct irq_output *out, size_t const num)
{
- assert(num < ctl->ncolumns);
- assert(ctl->columns[num] < (int)ARRAY_SIZE(infos));
+ assert(num < out->ncolumns);
+ assert(out->columns[num] < (int)ARRAY_SIZE(infos));
- return ctl->columns[num];
+ return out->columns[num];
}
-static inline struct colinfo const *get_column_info(struct irqtop_ctl const
- *const ctl,
- unsigned const num)
+static inline const struct colinfo *get_column_info(
+ struct irq_output *out, unsigned num)
{
- return &infos[get_column_id(ctl, num)];
+ return &infos[get_column_id(out, num)];
}
-static struct libscols_table *new_scols_table(struct irqtop_ctl *const ctl)
+static struct libscols_table *new_scols_table(struct irq_output *out)
{
size_t i;
struct libscols_table *table;
warn(_("failed to initialize output table"));
return NULL;
}
- scols_table_enable_json(table, ctl->json);
- scols_table_enable_noheadings(table, ctl->no_headings);
+ scols_table_enable_json(table, out->json);
+ scols_table_enable_noheadings(table, out->no_headings);
- if (ctl->json)
+ if (out->json)
scols_table_set_name(table, _("interrupts"));
- for (i = 0; i < ctl->ncolumns; i++) {
- struct colinfo const *const col = get_column_info(ctl, i);
+ for (i = 0; i < out->ncolumns; i++) {
+ const struct colinfo *col = get_column_info(out, i);
int flags = col->flags;
struct libscols_column *cl;
warnx(_("failed to initialize output column"));
goto err;
}
- if (ctl->json)
+ if (out->json)
scols_column_set_json_type(cl, col->json_type);
}
return NULL;
}
-static void add_scols_line(struct irqtop_ctl *const ctl,
- struct irq_info const *const stat,
+static void add_scols_line(struct irq_output *out,
+ struct irq_info *stat,
struct libscols_table *table)
{
size_t i;
return;
}
- for (i = 0; i < ctl->ncolumns; i++) {
+ for (i = 0; i < out->ncolumns; i++) {
char *str = NULL;
- switch (get_column_id(ctl, i)) {
+ switch (get_column_id(out, i)) {
case COL_IRQ:
xasprintf(&str, "%s", stat->irq);
break;
if (str && scols_line_refer_data(line, i, str) != 0)
err_oom();
}
+
+ /* FIXME */
free(stat->irq);
free(stat->name);
}
-static char *remove_repeated_spaces(char *const str)
+static char *remove_repeated_spaces(char *str)
{
char *inp = str, *outp = str;
uint8_t prev_space = 0;
return NULL;
}
-static void free_irqinfo(struct irq_stat *const stat)
+static void free_irqinfo(struct irq_stat *stat)
{
if (stat)
free(stat->irq_info);
free(stat);
}
-static int sort_name(struct irq_info const *const a,
- struct irq_info const *const b)
+static int sort_name(const struct irq_info *a,
+ const struct irq_info *b)
{
return (strcmp(a->name, b->name) > 0) ? 1 : 0;
}
-static int sort_total(struct irq_info const *const a,
- struct irq_info const *const b)
+static int sort_total(const struct irq_info *a,
+ const struct irq_info *b)
{
return a->total < b->total;
}
-static int sort_delta(struct irq_info const *const a,
- struct irq_info const *const b)
+static int sort_delta(const struct irq_info *a,
+ const struct irq_info *b)
{
return a->delta < b->delta;
}
-static int sort_interrupts(struct irq_info const *const a,
- struct irq_info const *const b)
+static int sort_interrupts(const struct irq_info *a,
+ const struct irq_info *b)
{
return (strcmp(a->irq, b->irq) > 0) ? 1 : 0;
}
-static void sort_result(struct irqtop_ctl *const ctl,
- struct irq_info *const result,
- size_t const nmemb)
+static void sort_result(struct irq_output *out,
+ struct irq_info *result,
+ size_t nmemb)
{
- qsort(result, nmemb, sizeof(*result), (int (*)(const void *, const void *))ctl->sort_func);
+ qsort(result, nmemb, sizeof(*result),
+ (int (*)(const void *,
+ const void *))out->sort_func);
}
-static sort_fp *set_sort_func(char const key)
+static sort_fp *set_sort_func(char key)
{
switch (key) {
case 'i':
}
}
-static struct libscols_table *get_scols_table(struct irqtop_ctl *const ctl, struct irq_stat **xstat)
+static struct libscols_table *get_scols_table(struct irq_output *out,
+ struct irq_stat *prev,
+ struct irq_stat **xstat)
{
struct libscols_table *table;
struct irq_info *result, *curr;
result = xmalloc(size);
memcpy(result, stat->irq_info, size);
- if (ctl->prev_stat) {
+ if (prev) {
stat->delta_irq = 0;
for (index = 0; index < stat->nr_irq; index++) {
- result[index].delta = result[index].total -
- ctl->prev_stat->irq_info[index].total;
+ result[index].delta = result[index].total
+ - prev->irq_info[index].total;
stat->delta_irq += result[index].delta;
}
}
- sort_result(ctl, result, stat->nr_irq);
+ sort_result(out, result, stat->nr_irq);
- table = new_scols_table(ctl);
+ table = new_scols_table(out);
if (!table)
return NULL;
for (index = 0; index < stat->nr_irq; index++) {
curr = result + index;
- add_scols_line(ctl, curr, table);
+ add_scols_line(out, curr, table);
}
free(result);
else
free_irqinfo(stat);
- return table;;
+ return table;
}
-static void parse_input(struct irqtop_ctl *const ctl, char const c)
+static void parse_input(struct irqtop_ctl *ctl, struct irq_output *out, char c)
{
switch (c) {
case 'i':
- ctl->sort_func = sort_interrupts;
+ out->sort_func = sort_interrupts;
break;
case 't':
- ctl->sort_func = sort_total;
+ out->sort_func = sort_total;
break;
case 'd':
- ctl->sort_func = sort_delta;
+ out->sort_func = sort_delta;
break;
case 'n':
- ctl->sort_func = sort_name;
+ out->sort_func = sort_name;
break;
case 'q':
case 'Q':
}
}
-static int print_irq_data(struct irqtop_ctl *const ctl)
+static int print_irq_data(struct irq_output *out)
{
struct libscols_table *table;
- table = get_scols_table(ctl, NULL);
+ table = get_scols_table(out, NULL, NULL);
if (!table)
return 1;
return 0;
}
-static int update_screen(struct irqtop_ctl *const ctl, WINDOW *win)
+static int update_screen(struct irqtop_ctl *ctl, struct irq_output *out, WINDOW *win)
{
struct libscols_table *table;
struct irq_stat *stat;
time_t now = time(NULL);
char timestr[64], *data;
- table = get_scols_table(ctl, &stat);
+ table = get_scols_table(out, ctl->prev_stat, &stat);
if (!table) {
ctl->request_exit = 1;
return 1;
return 0;
}
-static int event_loop(struct irqtop_ctl *const ctl, WINDOW *win)
+static int event_loop(struct irqtop_ctl *ctl, struct irq_output *out, WINDOW *win)
{
int efd, sfd, tfd;
sigset_t sigmask;
if (epoll_ctl(efd, EPOLL_CTL_ADD, STDIN_FILENO, &ev) != 0)
err(EXIT_FAILURE, _("epoll_ctl failed"));
- retval |= update_screen(ctl, win);
+ retval |= update_screen(ctl, out, win);
refresh();
while (!ctl->request_exit) {
if (read(STDIN_FILENO, &c, 1) != 1)
warn(_("read failed"));
- parse_input(ctl, c);
+ parse_input(ctl, out, c);
} else
abort();
- retval |= update_screen(ctl, win);
+ retval |= update_screen(ctl, out, win);
refresh();
}
}
exit(EXIT_SUCCESS);
}
-static void parse_args(struct irqtop_ctl *const ctl, int const argc,
- char *const *const argv)
+static void parse_args( struct irqtop_ctl *ctl,
+ struct irq_output *out,
+ int argc,
+ char **argv)
{
const char *outarg = NULL;
enum {
}
break;
case 's':
- ctl->sort_func = set_sort_func(optarg[0]);
+ out->sort_func = set_sort_func(optarg[0]);
break;
case ONCE_OPT:
ctl->run_once = 1;
ctl->request_exit = 1;
break;
case 'J':
- ctl->json = 1;
+ out->json = 1;
ctl->run_once = 1;
ctl->request_exit = 1;
break;
}
/* default */
- if (!ctl->ncolumns) {
- ctl->columns[ctl->ncolumns++] = COL_IRQ;
- ctl->columns[ctl->ncolumns++] = COL_TOTAL;
+ if (!out->ncolumns) {
+ out->columns[out->ncolumns++] = COL_IRQ;
+ out->columns[out->ncolumns++] = COL_TOTAL;
if (!ctl->run_once)
- ctl->columns[ctl->ncolumns++] = COL_DELTA;
- ctl->columns[ctl->ncolumns++] = COL_NAME;
+ out->columns[out->ncolumns++] = COL_DELTA;
+ out->columns[out->ncolumns++] = COL_NAME;
}
/* add -o [+]<list> to putput */
- if (outarg && string_add_to_idarray(outarg, ctl->columns,
- ARRAY_SIZE(ctl->columns),
- &ctl->ncolumns, column_name_to_id) < 0)
+ if (outarg && string_add_to_idarray(outarg, out->columns,
+ ARRAY_SIZE(out->columns),
+ &out->ncolumns, column_name_to_id) < 0)
exit(EXIT_FAILURE);
}
int is_tty = 0;
int retval = EXIT_SUCCESS;
struct termios saved_tty;
+ struct irq_output out = { .ncolumns = 0, .sort_func = DEF_SORT_FUNC };
struct irqtop_ctl ctl = {
.timer.it_interval = {3, 0},
.timer.it_value = {3, 0}
};
setlocale(LC_ALL, "");
- ctl.sort_func = DEF_SORT_FUNC;
- parse_args(&ctl, argc, argv);
+ parse_args(&ctl, &out, argc, argv);
if (ctl.run_once)
- retval = print_irq_data(&ctl);
+ retval = print_irq_data(&out);
else {
is_tty = isatty(STDIN_FILENO);
if (is_tty && tcgetattr(STDIN_FILENO, &saved_tty) == -1)
curs_set(0);
ctl.hostname = xgethostname();
- event_loop(&ctl, win);
+ event_loop(&ctl, &out, win);
free_irqinfo(ctl.prev_stat);
free(ctl.hostname);