From 86352712fdc5fa08777eca1458f4ef6bbe579e7b Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Mon, 10 Jun 2013 06:19:00 +0200 Subject: [PATCH] Fix save/restore of errno for isatty(). --- src/coloredstderr.c | 13 +++++++++++++ src/hookmacros.h | 6 +++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/coloredstderr.c b/src/coloredstderr.c index 72a881f..727c580 100644 --- a/src/coloredstderr.c +++ b/src/coloredstderr.c @@ -64,6 +64,19 @@ static int force_write_to_non_tty; /* See hookmacros.h for the decision if a function call is colored. */ +/* Prevent inlining into hook functions because it may increase the number of + * spilled registers unnecessarily. As it's not called very often accept the + * additional call. */ +static int isatty_noinline(int fd) __noinline; +static int isatty_noinline(int fd) { + int saved_errno = errno; + int result = isatty(fd); + errno = saved_errno; + + return result; +} + + static void dup_fd(int oldfd, int newfd) { #ifdef DEBUG debug("%3d -> %3d\t\t\t[%d]\n", oldfd, newfd, getpid()); diff --git a/src/hookmacros.h b/src/hookmacros.h index 0eb47cd..6b52293 100644 --- a/src/hookmacros.h +++ b/src/hookmacros.h @@ -38,7 +38,7 @@ * if (force_write_to_non_tty) { * handle = 1; * } else { - * handle = isatty(); + * handle = isatty_noinline(); * } * } else { * handle = 0; @@ -72,7 +72,7 @@ if (unlikely(force_write_to_non_tty)) { \ handle = 1; \ } else { \ - handle = isatty(fd); \ + handle = isatty_noinline(fd); \ } \ } else { \ handle = 0; \ @@ -87,7 +87,7 @@ if (unlikely(force_write_to_non_tty)) { \ handle = 1; \ } else { \ - handle = isatty(fileno(file)); \ + handle = isatty_noinline(fileno(file)); \ } \ } else { \ handle = 0; \ -- 2.43.2