From ed757c0cb03eef50e8d9aeb4682401c3e9486f0b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 19 Oct 2012 00:06:47 +0200 Subject: [PATCH] util: unify line caching and column caching --- src/cgtop/cgtop.c | 8 +++---- src/journal/journalctl.c | 3 ++- src/shared/util.c | 50 ++++++++++++++++++++++------------------ src/shared/util.h | 6 ++--- 4 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/cgtop/cgtop.c b/src/cgtop/cgtop.c index ee421e383..f2e62761f 100644 --- a/src/cgtop/cgtop.c +++ b/src/cgtop/cgtop.c @@ -443,9 +443,9 @@ static int display(Hashmap *a) { qsort(array, n, sizeof(Group*), group_compare); - rows = fd_lines(STDOUT_FILENO); - if (rows <= 0) - rows = 25; + rows = lines(); + if (rows <= 10) + rows = 10; path_columns = columns() - 42; if (path_columns < 10) @@ -653,7 +653,7 @@ int main(int argc, char *argv[]) { goto finish; } - signal(SIGWINCH, columns_cache_reset); + signal(SIGWINCH, columns_lines_cache_reset); while (!quit) { Hashmap *c; diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index f4b651855..d1338d2b7 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -197,7 +197,6 @@ static int parse_argv(int argc, char *argv[]) { case 'f': arg_follow = true; - signal(SIGWINCH, columns_cache_reset); break; case 'o': @@ -834,6 +833,8 @@ int main(int argc, char *argv[]) { if (r <= 0) goto finish; + signal(SIGWINCH, columns_lines_cache_reset); + if (arg_action == ACTION_NEW_ID128) { r = generate_new_id128(); goto finish; diff --git a/src/shared/util.c b/src/shared/util.c index 527a5800f..ef30cb2da 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -73,6 +73,7 @@ int saved_argc = 0; char **saved_argv = NULL; static volatile unsigned cached_columns = 0; +static volatile unsigned cached_lines = 0; size_t page_size(void) { static __thread size_t pgsz = 0; @@ -3812,20 +3813,6 @@ unsigned columns(void) { return c; } -/* intended to be used as a SIGWINCH sighandler */ -void columns_cache_reset(int signum) { - cached_columns = 0; -} - -bool on_tty(void) { - static int cached_on_tty = -1; - - if (_unlikely_(cached_on_tty < 0)) - cached_on_tty = isatty(STDOUT_FILENO) > 0; - - return cached_on_tty; -} - int fd_lines(int fd) { struct winsize ws; zero(ws); @@ -3840,23 +3827,40 @@ int fd_lines(int fd) { } unsigned lines(void) { - static __thread int parsed_lines = 0; const char *e; + unsigned l; - if (_likely_(parsed_lines > 0)) - return parsed_lines; + if (_likely_(cached_lines > 0)) + return cached_lines; + l = 0; e = getenv("LINES"); if (e) - parsed_lines = atoi(e); + safe_atou(e, &l); - if (parsed_lines <= 0) - parsed_lines = fd_lines(STDOUT_FILENO); + if (l <= 0) + l = fd_lines(STDOUT_FILENO); - if (parsed_lines <= 0) - parsed_lines = 25; + if (l <= 0) + l = 24; - return parsed_lines; + cached_lines = l; + return cached_lines; +} + +/* intended to be used as a SIGWINCH sighandler */ +void columns_lines_cache_reset(int signum) { + cached_columns = 0; + cached_lines = 0; +} + +bool on_tty(void) { + static int cached_on_tty = -1; + + if (_unlikely_(cached_on_tty < 0)) + cached_on_tty = isatty(STDOUT_FILENO) > 0; + + return cached_on_tty; } int running_in_chroot(void) { diff --git a/src/shared/util.h b/src/shared/util.h index e19f76c1e..affb66998 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -384,11 +384,11 @@ int status_welcome(void); int fd_columns(int fd); unsigned columns(void); -void columns_cache_reset(int _unused_ signum); -bool on_tty(void); - int fd_lines(int fd); unsigned lines(void); +void columns_lines_cache_reset(int _unused_ signum); + +bool on_tty(void); int running_in_chroot(void); -- 2.30.2