tmuxで、フォーマット変数にロードアベレージを追加するパッチ
--- format.c | 7 ++++++- osdep-aix.c | 6 ++++++ osdep-darwin.c | 11 +++++++++++ osdep-dragonfly.c | 11 +++++++++++ osdep-freebsd.c | 11 +++++++++++ osdep-hpux.c | 6 ++++++ osdep-linux.c | 17 +++++++++++++++++ osdep-netbsd.c | 11 +++++++++++ osdep-openbsd.c | 11 +++++++++++ osdep-sunos.c | 11 +++++++++++ osdep-unknown.c | 6 ++++++ tmux.1 | 1 + tmux.h | 1 + 13 files changed, 109 insertions(+), 1 deletion(-) diff --git a/format.c b/format.c index 10ac613..396df52 100644 --- a/format.c +++ b/format.c @@ -62,7 +62,7 @@ const char *format_upper[] = { "window_index", /* I */ NULL, /* J */ NULL, /* K */ - NULL, /* L */ + "load_average", /* L */ NULL, /* M */ NULL, /* N */ NULL, /* O */ @@ -115,6 +115,7 @@ format_create(void) { struct format_tree *ft; char host[MAXHOSTNAMELEN], *ptr; + double la[3]; ft = xmalloc(sizeof *ft); RB_INIT(ft); @@ -126,6 +127,10 @@ format_create(void) format_add(ft, "host_short", "%s", host); } + if (osdep_getloadavg(la) == 0) { + format_add(ft, "load_average", "%.2f %.2f %.2f", la[0], la[1], la[2]); + } + return (ft); } diff --git a/osdep-aix.c b/osdep-aix.c index 8d59081..fe1660a 100644 --- a/osdep-aix.c +++ b/osdep-aix.c @@ -39,3 +39,9 @@ osdep_event_init(void) { return (event_init()); } + +int +osdep_getloadavg(double la[3]) +{ + return (1); +} diff --git a/osdep-darwin.c b/osdep-darwin.c index dc60b09..6c01204 100644 --- a/osdep-darwin.c +++ b/osdep-darwin.c @@ -27,6 +27,7 @@ char *osdep_get_name(int, char *); char *osdep_get_cwd(int); struct event_base *osdep_event_init(void); +int osdep_getloadavg(double [3]); #define unused __attribute__ ((unused)) @@ -78,3 +79,13 @@ osdep_event_init(void) setenv("EVENT_NOPOLL", "1", 1); return (event_init()); } + +int +osdep_getloadavg(double la[3]) +{ + if (getloadavg(la, 3) != 3) { + return (1); + } + + return (0); +} diff --git a/osdep-dragonfly.c b/osdep-dragonfly.c index ad417d9..f22a001 100644 --- a/osdep-dragonfly.c +++ b/osdep-dragonfly.c @@ -33,6 +33,7 @@ struct kinfo_proc *cmp_procs(struct kinfo_proc *, struct kinfo_proc *); char *osdep_get_name(int, char *); char *osdep_get_cwd(int); struct event_base *osdep_event_init(void); +int osdep_getloadavg(double [3]); #ifndef nitems #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) @@ -131,3 +132,13 @@ osdep_event_init(void) { return (event_init()); } + +int +osdep_getloadavg(double la[3]) +{ + if (getloadavg(la, 3) != 3) { + return (1); + } + + return (0); +} diff --git a/osdep-freebsd.c b/osdep-freebsd.c index d596eab..b44265e 100644 --- a/osdep-freebsd.c +++ b/osdep-freebsd.c @@ -35,6 +35,7 @@ struct kinfo_proc *cmp_procs(struct kinfo_proc *, struct kinfo_proc *); char *osdep_get_name(int, char *); char *osdep_get_cwd(int); struct event_base *osdep_event_init(void); +int osdep_getloadavg(double [3]); #ifndef nitems #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) @@ -168,3 +169,13 @@ osdep_event_init(void) setenv("EVENT_NOKQUEUE", "1", 1); return (event_init()); } + +int +osdep_getloadavg(double la[3]) +{ + if (getloadavg(la, 3) != 3) { + return (1); + } + + return (0); +} diff --git a/osdep-hpux.c b/osdep-hpux.c index 352e375..332b6be 100644 --- a/osdep-hpux.c +++ b/osdep-hpux.c @@ -39,3 +39,9 @@ osdep_event_init(void) { return (event_init()); } + +int +osdep_getloadavg(double la[3]) +{ + return (1); +} diff --git a/osdep-linux.c b/osdep-linux.c index ccac267..ed46e71 100644 --- a/osdep-linux.c +++ b/osdep-linux.c @@ -18,6 +18,7 @@ #include <sys/types.h> #include <sys/stat.h> +#include <sys/sysinfo.h> #include <event.h> #include <stdio.h> @@ -88,3 +89,19 @@ osdep_event_init(void) setenv("EVENT_NOEPOLL", "1", 1); return (event_init()); } + +int +osdep_getloadavg(double la[3]) +{ + struct sysinfo sinfo; + + if (sysinfo(&sinfo) != 0) { + return (1); + } + + la[0] = sinfo.loads[0] / (double) (1 << SI_LOAD_SHIFT); + la[1] = sinfo.loads[1] / (double) (1 << SI_LOAD_SHIFT); + la[2] = sinfo.loads[2] / (double) (1 << SI_LOAD_SHIFT); + + return (0); +} diff --git a/osdep-netbsd.c b/osdep-netbsd.c index f16d0dc..4e7fa1b 100644 --- a/osdep-netbsd.c +++ b/osdep-netbsd.c @@ -36,6 +36,7 @@ struct kinfo_proc2 *cmp_procs(struct kinfo_proc2 *, struct kinfo_proc2 *); char *osdep_get_name(int, char *); char *osdep_get_cwd(int); struct event_base *osdep_event_init(void); +int osdep_getloadavg(double [3]); struct kinfo_proc2 * cmp_procs(struct kinfo_proc2 *p1, struct kinfo_proc2 *p2) @@ -135,3 +136,13 @@ osdep_event_init(void) { return (event_init()); } + +int +osdep_getloadavg(double la[3]) +{ + if (getloadavg(la, 3) != 3) { + return (1); + } + + return (0); +} diff --git a/osdep-openbsd.c b/osdep-openbsd.c index 0a4c144..4badcbf 100644 --- a/osdep-openbsd.c +++ b/osdep-openbsd.c @@ -40,6 +40,7 @@ struct kinfo_proc *cmp_procs(struct kinfo_proc *, struct kinfo_proc *); char *osdep_get_name(int, char *); char *osdep_get_cwd(int); struct event_base *osdep_event_init(void); +int osdep_getloadavg(double [3]); struct kinfo_proc * cmp_procs(struct kinfo_proc *p1, struct kinfo_proc *p2) @@ -154,3 +155,13 @@ osdep_event_init(void) { return (event_init()); } + +int +osdep_getloadavg(double la[3]) +{ + if (getloadavg(la, 3) != 3) { + return (1); + } + + return (0); +} diff --git a/osdep-sunos.c b/osdep-sunos.c index fd644f5..78716a8 100644 --- a/osdep-sunos.c +++ b/osdep-sunos.c @@ -18,6 +18,7 @@ #include <sys/types.h> #include <sys/stat.h> +#include <sys/loadavg.h> #include <event.h> #include <fcntl.h> @@ -90,3 +91,13 @@ osdep_event_init(void) { return (event_init()); } + +int +osdep_getloadavg(double la[3]) +{ + if (getloadavg(la, 3) != 3) { + return (1); + } + + return (0); +} diff --git a/osdep-unknown.c b/osdep-unknown.c index 41f435b..0d5f9b5 100644 --- a/osdep-unknown.c +++ b/osdep-unknown.c @@ -39,3 +39,9 @@ osdep_event_init(void) { return (event_init()); } + +int +osdep_getloadavg(double la[3]) +{ + return (1); +} diff --git a/tmux.1 b/tmux.1 index 51d927a..160a10c 100644 --- a/tmux.1 +++ b/tmux.1 @@ -3117,6 +3117,7 @@ The following variables are available, where appropriate: .It Li "keypad_cursor_flag" Ta "" Ta "Pane keypad cursor flag" .It Li "keypad_flag" Ta "" Ta "Pane keypad flag" .It Li "line" Ta "" Ta "Line number in the list" +.It Li "load_average" Ta "#L" Ta "System load averages" .It Li "mouse_any_flag" Ta "" Ta "Pane mouse any flag" .It Li "mouse_button_flag" Ta "" Ta "Pane mouse button flag" .It Li "mouse_standard_flag" Ta "" Ta "Pane mouse standard flag" diff --git a/tmux.h b/tmux.h index 7d5f230..1a7db34 100644 --- a/tmux.h +++ b/tmux.h @@ -2322,6 +2322,7 @@ u_int utf8_split2(u_int, u_char *); char *osdep_get_name(int, char *); char *osdep_get_cwd(int); struct event_base *osdep_event_init(void); +int osdep_getloadavg(double [3]); /* log.c */ void log_open(int, const char *); --
2015/7/16追記:
GitHub:kidmin/tmux でぼちぼち。pull requestを送るつもりはないですが、upstreamからは気が向いたら同期してます。