From 7e816a6487932cbb3cb71d94b609e50e81f4e5bf Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Sat, 6 Jun 2015 18:11:17 +0000 Subject: remove invalid skip of locking in ungetwc aside from being invalid, the early check only optimized the error case, and likely pessimized the common case by separating the two branches on isascii(c) at opposite ends of the function. --- src/stdio/ungetwc.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/stdio/ungetwc.c b/src/stdio/ungetwc.c index 913f7168..0a4cd7a1 100644 --- a/src/stdio/ungetwc.c +++ b/src/stdio/ungetwc.c @@ -11,18 +11,15 @@ wint_t ungetwc(wint_t c, FILE *f) if (c == WEOF) return c; - /* Try conversion early so we can fail without locking if invalid */ - if (!isascii(c) && (l = wctomb((void *)mbc, c)) < 0) - return WEOF; - FLOCK(f); f->mode |= f->mode+1; if (!f->rpos) __toread(f); - if (!f->rpos || f->rpos < f->buf - UNGET + l) { + if (!f->rpos || f->rpos < f->buf - UNGET + l || + (!isascii(c) && (l = wctomb((void *)mbc, c)) < 0)) { FUNLOCK(f); - return EOF; + return WEOF; } if (isascii(c)) *--f->rpos = c; -- cgit v1.2.1