util: unify line caching and column caching

This commit is contained in:
Lennart Poettering 2012-10-19 00:06:47 +02:00
parent 8481248b9f
commit ed757c0cb0
4 changed files with 36 additions and 31 deletions

View File

@ -443,9 +443,9 @@ static int display(Hashmap *a) {
qsort(array, n, sizeof(Group*), group_compare); qsort(array, n, sizeof(Group*), group_compare);
rows = fd_lines(STDOUT_FILENO); rows = lines();
if (rows <= 0) if (rows <= 10)
rows = 25; rows = 10;
path_columns = columns() - 42; path_columns = columns() - 42;
if (path_columns < 10) if (path_columns < 10)
@ -653,7 +653,7 @@ int main(int argc, char *argv[]) {
goto finish; goto finish;
} }
signal(SIGWINCH, columns_cache_reset); signal(SIGWINCH, columns_lines_cache_reset);
while (!quit) { while (!quit) {
Hashmap *c; Hashmap *c;

View File

@ -197,7 +197,6 @@ static int parse_argv(int argc, char *argv[]) {
case 'f': case 'f':
arg_follow = true; arg_follow = true;
signal(SIGWINCH, columns_cache_reset);
break; break;
case 'o': case 'o':
@ -834,6 +833,8 @@ int main(int argc, char *argv[]) {
if (r <= 0) if (r <= 0)
goto finish; goto finish;
signal(SIGWINCH, columns_lines_cache_reset);
if (arg_action == ACTION_NEW_ID128) { if (arg_action == ACTION_NEW_ID128) {
r = generate_new_id128(); r = generate_new_id128();
goto finish; goto finish;

View File

@ -73,6 +73,7 @@ int saved_argc = 0;
char **saved_argv = NULL; char **saved_argv = NULL;
static volatile unsigned cached_columns = 0; static volatile unsigned cached_columns = 0;
static volatile unsigned cached_lines = 0;
size_t page_size(void) { size_t page_size(void) {
static __thread size_t pgsz = 0; static __thread size_t pgsz = 0;
@ -3812,20 +3813,6 @@ unsigned columns(void) {
return c; 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) { int fd_lines(int fd) {
struct winsize ws; struct winsize ws;
zero(ws); zero(ws);
@ -3840,23 +3827,40 @@ int fd_lines(int fd) {
} }
unsigned lines(void) { unsigned lines(void) {
static __thread int parsed_lines = 0;
const char *e; const char *e;
unsigned l;
if (_likely_(parsed_lines > 0)) if (_likely_(cached_lines > 0))
return parsed_lines; return cached_lines;
l = 0;
e = getenv("LINES"); e = getenv("LINES");
if (e) if (e)
parsed_lines = atoi(e); safe_atou(e, &l);
if (parsed_lines <= 0) if (l <= 0)
parsed_lines = fd_lines(STDOUT_FILENO); l = fd_lines(STDOUT_FILENO);
if (parsed_lines <= 0) if (l <= 0)
parsed_lines = 25; 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) { int running_in_chroot(void) {

View File

@ -384,11 +384,11 @@ int status_welcome(void);
int fd_columns(int fd); int fd_columns(int fd);
unsigned columns(void); unsigned columns(void);
void columns_cache_reset(int _unused_ signum);
bool on_tty(void);
int fd_lines(int fd); int fd_lines(int fd);
unsigned lines(void); unsigned lines(void);
void columns_lines_cache_reset(int _unused_ signum);
bool on_tty(void);
int running_in_chroot(void); int running_in_chroot(void);