remove invalid skip of locking in ungetwc
authorRich Felker <dalias@aerifal.cx>
Sat, 6 Jun 2015 18:11:17 +0000 (18:11 +0000)
committerRich Felker <dalias@aerifal.cx>
Sat, 6 Jun 2015 18:11:17 +0000 (18:11 +0000)
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

index 913f7168ed4935870b89b4f023640843b7d5b25d..0a4cd7a1f2f01d94b35ec04b7353aa360b7429bf 100644 (file)
@@ -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;